Imported Upstream version 1.8.4 upstream/1.8.4
authorDongHun Kwak <dh0128.kwak@samsung.com>
Fri, 15 Oct 2021 01:46:26 +0000 (10:46 +0900)
committerDongHun Kwak <dh0128.kwak@samsung.com>
Fri, 15 Oct 2021 01:46:26 +0000 (10:46 +0900)
395 files changed:
CVSROOT/checkoutlist [deleted file]
CVSROOT/commitinfo [deleted file]
CVSROOT/config [deleted file]
CVSROOT/cvswrappers [deleted file]
CVSROOT/editinfo [deleted file]
CVSROOT/loginfo [deleted file]
CVSROOT/modules [deleted file]
CVSROOT/notify [deleted file]
CVSROOT/rcsinfo [deleted file]
CVSROOT/taginfo [deleted file]
CVSROOT/verifymsg [deleted file]
Doxyfile
INSTALL
Makefile.in
README
addon/doxmlparser/include/doxmlintf.h
addon/doxmlparser/src/basehandler.h
addon/doxmlparser/src/baseiterator.h
addon/doxmlparser/src/compoundhandler.cpp
addon/doxmlparser/src/compoundhandler.h
addon/doxmlparser/src/dochandler.cpp
addon/doxmlparser/src/dochandler.h
addon/doxmlparser/src/graphhandler.h
addon/doxmlparser/src/linkedtexthandler.cpp
addon/doxmlparser/src/linkedtexthandler.h
addon/doxmlparser/src/loamhandler.h
addon/doxmlparser/src/mainhandler.cpp
addon/doxmlparser/src/mainhandler.h
addon/doxmlparser/src/memberhandler.cpp
addon/doxmlparser/src/memberhandler.h
addon/doxmlparser/src/paramhandler.cpp
addon/doxmlparser/src/paramhandler.h
addon/doxmlparser/src/sectionhandler.cpp
addon/doxmlparser/src/sectionhandler.h
addon/doxyapp/Makefile.in
addon/doxyapp/doxyapp.cpp
addon/doxysearch/Makefile.in
addon/doxysearch/doxyindexer.cpp
addon/doxysearch/doxyindexer.pro.in
addon/doxysearch/doxysearch.cpp
addon/doxywizard/Makefile.in
addon/doxywizard/config.l
addon/doxywizard/doxywizard.cpp
addon/doxywizard/expert.cpp
addon/doxywizard/inputbool.cpp
addon/doxywizard/inputbool.h
addon/doxywizard/inputint.cpp
addon/doxywizard/inputint.h
addon/doxywizard/inputstring.cpp
addon/doxywizard/inputstring.h
addon/doxywizard/inputstrlist.cpp
addon/doxywizard/inputstrlist.h
addon/doxywizard/version.h
addon/doxywizard/wizard.h
configure
doc/Doxyfile
doc/Makefile.in
doc/Makefile.latex
doc/Makefile.win_make.in
doc/Makefile.win_nmake.in
doc/arch.doc
doc/autolink.doc
doc/changelog.doc [new file with mode: 0644]
doc/commands.doc
doc/config.doc
doc/custcmd.doc
doc/customize.doc
doc/diagrams.doc
doc/docblocks.doc
doc/doxygen.1
doc/doxygen_manual.css
doc/doxygen_manual.tex
doc/doxygen_usage.doc
doc/doxywizard_usage.doc
doc/external.doc
doc/extsearch.doc
doc/extsearch_flow.dot [new file with mode: 0644]
doc/extsearch_flow.eps [new file with mode: 0644]
doc/extsearch_flow.png [new file with mode: 0644]
doc/faq.doc
doc/features.doc
doc/formulas.doc
doc/grouping.doc
doc/htmlcmds.doc
doc/index.doc
doc/install.doc
doc/language.doc
doc/language.tpl
doc/maintainers.txt
doc/markdown.doc
doc/output.doc
doc/perlmod.doc
doc/perlmod_tree.doc
doc/preprocessing.doc
doc/searching.doc
doc/starting.doc
doc/translator.py
doc/translator_report.txt
doc/trouble.doc
doc/xmlcmds.doc
examples/Makefile.in
jquery/Makefile [new file with mode: 0644]
jquery/README [new file with mode: 0644]
jquery/jquery-1.7.1.js [new file with mode: 0644]
jquery/jquery.ba-1.3-hashchange.js [new file with mode: 0644]
jquery/jquery.scrollTo-1.4.2.js [new file with mode: 0644]
jquery/jquery.ui-1.8.18.core.js [new file with mode: 0644]
jquery/jquery.ui-1.8.18.mouse.js [new file with mode: 0644]
jquery/jquery.ui-1.8.18.resizable.js [new file with mode: 0644]
jquery/jquery.ui-1.8.18.widget.js [new file with mode: 0644]
jquery/split_jquery.pl [new file with mode: 0644]
libmd5/Makefile.in
qtools/Doxyfile
qtools/Makefile.in
qtools/qcstring.h
qtools/qdatetime.cpp
qtools/qdir_unix.cpp
qtools/qfiledefs_p.h
qtools/qgarray.cpp
qtools/qgcache.cpp
qtools/qgcache.h
qtools/qgdict.cpp
qtools/qgdict.h
qtools/qiodevice.cpp
qtools/qtextstream.cpp
src/.gitignore [new file with mode: 0644]
src/Makefile.in
src/arguments.h
src/bufstr.h
src/cite.cpp
src/clangparser.cpp [new file with mode: 0644]
src/clangparser.h [new file with mode: 0644]
src/classdef.cpp
src/classdef.h
src/classlist.cpp
src/classlist.h
src/cmdmapper.cpp
src/cmdmapper.h
src/code.h
src/code.l
src/commentcnv.h
src/commentcnv.l
src/commentscan.h
src/commentscan.l
src/compound.xsd
src/compound_xsd.h
src/condparser.cpp
src/condparser.h
src/config.h
src/config.l
src/config.xml
src/configgen.py
src/configoptions.cpp
src/configoptions.h
src/constexp.h
src/constexp.l
src/constexp.y
src/cppvalue.cpp
src/cppvalue.h
src/dbusxmlscanner.cpp
src/dbusxmlscanner.h
src/debug.cpp
src/debug.h
src/declinfo.h
src/declinfo.l
src/defargs.h
src/defargs.l
src/defgen.cpp
src/defgen.h
src/define.cpp
src/define.h
src/definition.cpp
src/definition.h
src/diagram.cpp
src/diagram.h
src/dirdef.cpp
src/dirdef.h
src/docbookgen.cpp [new file with mode: 0644]
src/docbookgen.h [new file with mode: 0644]
src/docbookvisitor.cpp [new file with mode: 0644]
src/docbookvisitor.h [new file with mode: 0644]
src/docparser.cpp
src/docparser.h
src/docsets.cpp
src/docsets.h
src/doctokenizer.h
src/doctokenizer.l
src/docvisitor.h
src/dot.cpp
src/dot.h
src/doxygen.cpp
src/doxygen.css
src/doxygen.h
src/doxygen.md
src/doxygen.pro.in
src/doxygen.sty [new file with mode: 0644]
src/doxygen_css.h
src/doxygen_sty.h [new file with mode: 0644]
src/eclipsehelp.cpp
src/eclipsehelp.h
src/entry.cpp
src/entry.h
src/example.h
src/filedef.cpp
src/filedef.h
src/filename.cpp
src/filename.h
src/filestorage.h
src/footer.html
src/footer_html.h
src/formula.cpp
src/formula.h
src/fortrancode.h
src/fortrancode.l
src/fortranscanner.h
src/fortranscanner.l
src/ftvhelp.cpp
src/ftvhelp.h
src/groupdef.cpp
src/groupdef.h
src/growbuf.h
src/header.html
src/header_html.h
src/htags.cpp
src/htags.h
src/htmlattrib.h
src/htmldocvisitor.cpp
src/htmldocvisitor.h
src/htmlgen.cpp
src/htmlgen.h
src/htmlhelp.cpp
src/htmlhelp.h
src/image.cpp
src/image.h
src/index.cpp
src/index.h
src/jquery_fx.js
src/jquery_fx_js.h
src/jquery_p1.js
src/jquery_p1_js.h
src/jquery_p2.js
src/jquery_p2_js.h
src/jquery_p3.js
src/jquery_p3_js.h
src/jquery_ui.js
src/jquery_ui_js.h
src/language.cpp
src/language.h
src/latexdocvisitor.cpp
src/latexdocvisitor.h
src/latexgen.cpp
src/latexgen.h
src/layout.cpp
src/layout.h
src/layout_default.h
src/layout_default.xml
src/libdoxycfg.pro.in
src/libdoxycfg.t.in
src/libdoxygen.pro.in
src/libdoxygen.t.in
src/lockingptr.h
src/logos.cpp
src/logos.h
src/main.cpp
src/mandocvisitor.cpp
src/mandocvisitor.h
src/mangen.cpp
src/mangen.h
src/markdown.cpp
src/markdown.h
src/marshal.cpp
src/marshal.h
src/memberdef.cpp
src/memberdef.h
src/membergroup.cpp
src/membergroup.h
src/memberlist.cpp
src/memberlist.h
src/membername.cpp
src/membername.h
src/message.cpp
src/message.h
src/msc.cpp
src/msc.h
src/namespacedef.cpp
src/namespacedef.h
src/objcache.cpp
src/objcache.h
src/outputgen.cpp
src/outputgen.h
src/outputlist.cpp
src/outputlist.h
src/pagedef.cpp
src/pagedef.h
src/parserintf.h
src/perlmodgen.cpp
src/perlmodgen.h
src/portable.cpp
src/pre.h
src/pre.l
src/printdocvisitor.h
src/pycode.h
src/pycode.l
src/pyscanner.h
src/pyscanner.l
src/qtbc.h
src/reflist.cpp
src/reflist.h
src/resize.js
src/resize_js.h
src/rtfdocvisitor.cpp
src/rtfdocvisitor.h
src/rtfgen.cpp
src/rtfgen.h
src/rtfstyle.cpp
src/rtfstyle.h
src/scanner.h
src/scanner.l
src/search.css
src/search_css.h
src/searchindex.cpp
src/searchindex.h
src/section.h
src/settings.h [new file with mode: 0644]
src/sortdict.h
src/sqlite3gen.cpp [new file with mode: 0644]
src/sqlite3gen.h [new file with mode: 0644]
src/store.cpp
src/store.h
src/tagreader.cpp
src/tagreader.h
src/tclscanner.h
src/tclscanner.l
src/textdocvisitor.cpp
src/textdocvisitor.h
src/translator.h
src/translator_adapter.h
src/translator_am.h
src/translator_ar.h
src/translator_br.h
src/translator_ca.h
src/translator_cn.h
src/translator_cz.h
src/translator_de.h
src/translator_dk.h
src/translator_en.h
src/translator_eo.h
src/translator_es.h
src/translator_fa.h
src/translator_fi.h
src/translator_fr.h
src/translator_gr.h
src/translator_hr.h
src/translator_hu.h
src/translator_id.h
src/translator_it.h
src/translator_je.h
src/translator_jp.h
src/translator_ke.h
src/translator_kr.h
src/translator_lt.h
src/translator_lv.h [new file with mode: 0644]
src/translator_mk.h
src/translator_nl.h
src/translator_no.h
src/translator_pl.h
src/translator_pt.h
src/translator_ro.h
src/translator_ru.h
src/translator_sc.h
src/translator_si.h
src/translator_sk.h
src/translator_sr.h
src/translator_sv.h
src/translator_tr.h
src/translator_tw.h
src/translator_ua.h
src/translator_vi.h
src/translator_za.h
src/translatordecoder.h
src/types.h
src/util.cpp
src/util.h
src/version.h
src/vhdlcode.l
src/vhdldocgen.cpp
src/vhdldocgen.h
src/vhdlparser.y
src/vhdlscanner.h
src/vhdlscanner.l
src/xmldocvisitor.cpp
src/xmldocvisitor.h
src/xmlgen.cpp
src/xmlgen.h
winbuild/Doxygen.vcproj

diff --git a/CVSROOT/checkoutlist b/CVSROOT/checkoutlist
deleted file mode 100644 (file)
index b04b350..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-# The "checkoutlist" file is used to support additional version controlled
-# administrative files in $CVSROOT/CVSROOT, such as template files.
-#
-# The first entry on a line is a filename which will be checked out from
-# the corresponding RCS file in the $CVSROOT/CVSROOT directory.
-# The remainder of the line is an error message to use if the file cannot
-# be checked out.
-#
-# File format:
-#
-#      [<whitespace>]<filename><whitespace><error message><end-of-line>
-#
-# comment lines begin with '#'
diff --git a/CVSROOT/commitinfo b/CVSROOT/commitinfo
deleted file mode 100644 (file)
index b19e7b7..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-# The "commitinfo" file is used to control pre-commit checks.
-# The filter on the right is invoked with the repository and a list 
-# of files to check.  A non-zero exit of the filter program will 
-# cause the commit to be aborted.
-#
-# The first entry on a line is a regular expression which is tested
-# against the directory that the change is being committed to, relative
-# to the $CVSROOT.  For the first match that is found, then the remainder
-# of the line is the name of the filter to run.
-#
-# If the repository name does not match any of the regular expressions in this
-# file, the "DEFAULT" line is used, if it is specified.
-#
-# If the name "ALL" appears as a regular expression it is always used
-# in addition to the first matching regex or "DEFAULT".
diff --git a/CVSROOT/config b/CVSROOT/config
deleted file mode 100644 (file)
index 8817419..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-# Set this to "no" if pserver shouldn't check system users/passwords
-#SystemAuth=no
-
-# Set `PreservePermissions' to `yes' to save file status information
-# in the repository.
-#PreservePermissions=no
-
-TopLevelAdmin=yes
-#LockDir=/u/kp3softd/cvslocks/
diff --git a/CVSROOT/cvswrappers b/CVSROOT/cvswrappers
deleted file mode 100644 (file)
index 0c725ea..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-# This file affects handling of files based on their names.
-#
-# The -t/-f options allow one to treat directories of files
-# as a single file, or to transform a file in other ways on
-# its way in and out of CVS.
-#
-# The -m option specifies whether CVS attempts to merge files.
-#
-# The -k option specifies keyword expansion (e.g. -kb for binary).
-#
-# Format of wrapper file ($CVSROOT/CVSROOT/cvswrappers or .cvswrappers)
-#
-#  wildcard    [option value][option value]...
-#
-#  where option is one of
-#  -f          from cvs filter         value: path to filter
-#  -t          to cvs filter           value: path to filter
-#  -m          update methodology      value: MERGE or COPY
-#  -k          expansion mode          value: b, o, kkv, &c
-#
-#  and value is a single-quote delimited value.
-# For example:
-*.gif -k 'b' -m 'COPY' 
diff --git a/CVSROOT/editinfo b/CVSROOT/editinfo
deleted file mode 100644 (file)
index d78886c..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-# The "editinfo" file is used to allow verification of logging
-# information.  It works best when a template (as specified in the
-# rcsinfo file) is provided for the logging procedure.  Given a
-# template with locations for, a bug-id number, a list of people who
-# reviewed the code before it can be checked in, and an external
-# process to catalog the differences that were code reviewed, the
-# following test can be applied to the code:
-#
-#   Making sure that the entered bug-id number is correct.
-#   Validating that the code that was reviewed is indeed the code being
-#       checked in (using the bug-id number or a seperate review
-#       number to identify this particular code set.).
-#
-# If any of the above test failed, then the commit would be aborted.
-#
-# Actions such as mailing a copy of the report to each reviewer are
-# better handled by an entry in the loginfo file.
-#
-# One thing that should be noted is the the ALL keyword is not
-# supported.  There can be only one entry that matches a given
-# repository.
diff --git a/CVSROOT/loginfo b/CVSROOT/loginfo
deleted file mode 100644 (file)
index 5a59f0a..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-# The "loginfo" file controls where "cvs commit" log information
-# is sent.  The first entry on a line is a regular expression which must match
-# the directory that the change is being made to, relative to the
-# $CVSROOT.  If a match is found, then the remainder of the line is a filter
-# program that should expect log information on its standard input.
-#
-# If the repository name does not match any of the regular expressions in this
-# file, the "DEFAULT" line is used, if it is specified.
-#
-# If the name ALL appears as a regular expression it is always used
-# in addition to the first matching regex or DEFAULT.
-#
-# You may specify a format string as part of the
-# filter.  The string is composed of a `%' followed
-# by a single format character, or followed by a set of format
-# characters surrounded by `{' and `}' as separators.  The format
-# characters are:
-#
-#   s = file name
-#   V = old version number (pre-checkin)
-#   v = new version number (post-checkin)
-#
-# For example:
-#DEFAULT (echo ""; id; echo %s; date; cat) >> $CVSROOT/CVSROOT/commitlog
-# or
-#DEFAULT (echo ""; id; echo %{sVv}; date; cat) >> $CVSROOT/CVSROOT/commitlog
diff --git a/CVSROOT/modules b/CVSROOT/modules
deleted file mode 100644 (file)
index 581582c..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-# Three different line formats are valid:
-#      key     -a    aliases...
-#      key [options] directory
-#      key [options] directory files...
-#
-# Where "options" are composed of:
-#      -i prog         Run "prog" on "cvs commit" from top-level of module.
-#      -o prog         Run "prog" on "cvs checkout" of module.
-#      -e prog         Run "prog" on "cvs export" of module.
-#      -t prog         Run "prog" on "cvs rtag" of module.
-#      -u prog         Run "prog" on "cvs update" of module.
-#      -d dir          Place module in directory "dir" instead of module name.
-#      -l              Top-level directory only -- do not recurse.
-#
-# NOTE:  If you change any of the "Run" options above, you'll have to
-# release and re-checkout any working directories of these modules.
-#
-# And "directory" is a path to a directory relative to $CVSROOT.
-#
-# The "-a" option specifies an alias.  An alias is interpreted as if
-# everything on the right of the "-a" had been typed on the command line.
-#
-# You can encode a module within a module by using the special '&'
-# character to interpose another module into the current module.  This
-# can be useful for creating a module that consists of many directories
-# spread out over the entire source repository.
-doxygen -a addon bin doc examples html lib objects packages qtools src tmake wintools libpng libmd5
diff --git a/CVSROOT/notify b/CVSROOT/notify
deleted file mode 100644 (file)
index 34f0bc2..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-# The "notify" file controls where notifications from watches set by
-# "cvs watch add" or "cvs edit" are sent.  The first entry on a line is
-# a regular expression which is tested against the directory that the
-# change is being made to, relative to the $CVSROOT.  If it matches,
-# then the remainder of the line is a filter program that should contain
-# one occurrence of %s for the user to notify, and information on its
-# standard input.
-#
-# "ALL" or "DEFAULT" can be used in place of the regular expression.
-#
-# For example:
-#ALL mail %s -s "CVS notification"
diff --git a/CVSROOT/rcsinfo b/CVSROOT/rcsinfo
deleted file mode 100644 (file)
index 49e59f4..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-# The "rcsinfo" file is used to control templates with which the editor
-# is invoked on commit and import.
-#
-# The first entry on a line is a regular expression which is tested
-# against the directory that the change is being made to, relative to the
-# $CVSROOT.  For the first match that is found, then the remainder of the
-# line is the name of the file that contains the template.
-#
-# If the repository name does not match any of the regular expressions in this
-# file, the "DEFAULT" line is used, if it is specified.
-#
-# If the name "ALL" appears as a regular expression it is always used
-# in addition to the first matching regex or "DEFAULT".
diff --git a/CVSROOT/taginfo b/CVSROOT/taginfo
deleted file mode 100644 (file)
index 274a46d..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-# The "taginfo" file is used to control pre-tag checks.
-# The filter on the right is invoked with the following arguments:
-#
-# $1 -- tagname
-# $2 -- operation "add" for tag, "mov" for tag -F, and "del" for tag -d
-# $3 -- repository
-# $4->  file revision [file revision ...]
-#
-# A non-zero exit of the filter program will cause the tag to be aborted.
-#
-# The first entry on a line is a regular expression which is tested
-# against the directory that the change is being committed to, relative
-# to the $CVSROOT.  For the first match that is found, then the remainder
-# of the line is the name of the filter to run.
-#
-# If the repository name does not match any of the regular expressions in this
-# file, the "DEFAULT" line is used, if it is specified.
-#
-# If the name "ALL" appears as a regular expression it is always used
-# in addition to the first matching regex or "DEFAULT".
diff --git a/CVSROOT/verifymsg b/CVSROOT/verifymsg
deleted file mode 100644 (file)
index 86f747c..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-# The "verifymsg" file is used to allow verification of logging
-# information.  It works best when a template (as specified in the
-# rcsinfo file) is provided for the logging procedure.  Given a
-# template with locations for, a bug-id number, a list of people who
-# reviewed the code before it can be checked in, and an external
-# process to catalog the differences that were code reviewed, the
-# following test can be applied to the code:
-#
-#   Making sure that the entered bug-id number is correct.
-#   Validating that the code that was reviewed is indeed the code being
-#       checked in (using the bug-id number or a seperate review
-#       number to identify this particular code set.).
-#
-# If any of the above test failed, then the commit would be aborted.
-#
-# Actions such as mailing a copy of the report to each reviewer are
-# better handled by an entry in the loginfo file.
-#
-# One thing that should be noted is the the ALL keyword is not
-# supported.  There can be only one entry that matches a given
-# repository.
index 77b0522..b2f4ea7 100644 (file)
--- a/Doxyfile
+++ b/Doxyfile
@@ -1,4 +1,4 @@
-# Doxyfile 1.8.0
+# Doxyfile 1.8.3.1
 
 #---------------------------------------------------------------------------
 # Project related configuration options
@@ -34,6 +34,7 @@ OPTIMIZE_FOR_FORTRAN   = NO
 OPTIMIZE_OUTPUT_VHDL   = NO
 EXTENSION_MAPPING      =
 MARKDOWN_SUPPORT       = YES
+AUTOLINK_SUPPORT       = YES
 BUILTIN_STL_SUPPORT    = NO
 CPP_CLI_SUPPORT        = NO
 SIP_SUPPORT            = NO
@@ -100,7 +101,7 @@ INPUT                  = src
 INPUT_ENCODING         = UTF-8
 FILE_PATTERNS          = *.h \
                          *.cpp \
-                        *.md
+                         *.md
 RECURSIVE              = NO
 EXCLUDE                = src/code.cpp \
                          src/ce_lex.cpp \
@@ -115,8 +116,6 @@ EXCLUDE                = src/code.cpp \
                          src/logos.cpp \
                          src/suffixtree.cpp \
                          src/suffixtree.h \
-                         src/searchindex.cpp \
-                         src/searchindex.h \
                          src/commentcnv.cpp \
                          src/commentscan.cpp \
                          src/pycode.cpp \
@@ -128,7 +127,7 @@ EXCLUDE                = src/code.cpp \
                          src/vhdlparser.cpp \
                          src/vhdlcode.cpp \
                          src/tclscanner.cpp \
-                        src/lodepng.cpp \
+                         src/lodepng.cpp \
                          src/doxygen_css.h \
                          src/doxygen_js.h \
                          src/doxygen_php.h \
@@ -147,9 +146,14 @@ EXCLUDE                = src/code.cpp \
                          src/search_functions_php.h \
                          src/search_opensearch_php.h \
                          src/search_js.h \
-                         src/sizzle_js.h
+                         src/sizzle_js.h \
+                        src/navtree_js.h \
+                        src/resize_js.h \
+                        src/svgpan_js.h \
+                        src/dynsections_js.h \
+                        src/extsearch_js.h \
+                        src/footer_html.h \
 EXCLUDE_SYMLINKS       = NO
-EXCLUDE_PATTERNS       =
 EXCLUDE_SYMBOLS        =
 EXAMPLE_PATH           =
 EXAMPLE_PATTERNS       =
@@ -159,6 +163,7 @@ INPUT_FILTER           =
 FILTER_PATTERNS        =
 FILTER_SOURCE_FILES    = NO
 FILTER_SOURCE_PATTERNS =
+USE_MDFILE_AS_MAINPAGE =
 #---------------------------------------------------------------------------
 # configuration options related to source browsing
 #---------------------------------------------------------------------------
@@ -170,6 +175,8 @@ REFERENCES_RELATION    = YES
 REFERENCES_LINK_SOURCE = YES
 USE_HTAGS              = NO
 VERBATIM_HEADERS       = YES
+CLANG_ASSISTED_PARSING = YES
+CLANG_OPTIONS          =
 #---------------------------------------------------------------------------
 # configuration options related to the alphabetical class index
 #---------------------------------------------------------------------------
@@ -185,12 +192,14 @@ HTML_FILE_EXTENSION    = .html
 HTML_HEADER            =
 HTML_FOOTER            =
 HTML_STYLESHEET        =
+HTML_EXTRA_STYLESHEET  =
 HTML_EXTRA_FILES       =
 HTML_COLORSTYLE_HUE    = 220
 HTML_COLORSTYLE_SAT    = 100
 HTML_COLORSTYLE_GAMMA  = 80
 HTML_TIMESTAMP         = YES
 HTML_DYNAMIC_SECTIONS  = YES
+HTML_INDEX_NUM_ENTRIES = 100
 GENERATE_DOCSET        = YES
 DOCSET_FEEDNAME        = "Doxygen docs"
 DOCSET_BUNDLE_ID       = org.doxygen.Doxygen
@@ -221,10 +230,16 @@ EXT_LINKS_IN_WINDOW    = NO
 FORMULA_FONTSIZE       = 10
 FORMULA_TRANSPARENT    = YES
 USE_MATHJAX            = NO
+MATHJAX_FORMAT         = HTML-CSS
 MATHJAX_RELPATH        = http://cdn.mathjax.org/mathjax/latest
 MATHJAX_EXTENSIONS     =
 SEARCHENGINE           = YES
 SERVER_BASED_SEARCH    = YES
+EXTERNAL_SEARCH        = NO
+SEARCHENGINE_URL       =
+SEARCHDATA_FILE        = searchdata.xml
+EXTERNAL_SEARCH_ID     =
+EXTRA_SEARCH_MAPPINGS  =
 #---------------------------------------------------------------------------
 # configuration options related to the LaTeX output
 #---------------------------------------------------------------------------
@@ -237,6 +252,7 @@ PAPER_TYPE             = a4wide
 EXTRA_PACKAGES         =
 LATEX_HEADER           =
 LATEX_FOOTER           =
+LATEX_EXTRA_FILES      =
 PDF_HYPERLINKS         = YES
 USE_PDFLATEX           = NO
 LATEX_BATCHMODE        = NO
@@ -268,6 +284,11 @@ XML_SCHEMA             =
 XML_DTD                =
 XML_PROGRAMLISTING     = YES
 #---------------------------------------------------------------------------
+# configuration options related to the DOCBOOK output
+#---------------------------------------------------------------------------
+GENERATE_DOCBOOK       = NO
+DOCBOOK_OUTPUT         = docbook
+#---------------------------------------------------------------------------
 # configuration options for the AutoGen Definitions output
 #---------------------------------------------------------------------------
 GENERATE_AUTOGEN_DEF   = NO
@@ -285,7 +306,7 @@ ENABLE_PREPROCESSING   = YES
 MACRO_EXPANSION        = YES
 EXPAND_ONLY_PREDEF     = YES
 SEARCH_INCLUDES        = YES
-INCLUDE_PATH           =
+INCLUDE_PATH           = qtools libmd5
 INCLUDE_FILE_PATTERNS  =
 PREDEFINED             =
 EXPAND_AS_DEFINED      =
@@ -297,6 +318,7 @@ TAGFILES               = qtools_docs/qtools.tag=../../qtools_docs/html
 GENERATE_TAGFILE       = doxygen.tag
 ALLEXTERNALS           = NO
 EXTERNAL_GROUPS        = YES
+EXTERNAL_PAGES         = YES
 PERL_PATH              = /usr/bin/perl
 #---------------------------------------------------------------------------
 # Configuration options related to the dot tool
diff --git a/INSTALL b/INSTALL
index 42f3548..eced15a 100644 (file)
--- a/INSTALL
+++ b/INSTALL
@@ -1,7 +1,7 @@
-DOXYGEN Version 1.8.3
+DOXYGEN Version 1.8.4
 
 Please read the installation section of the manual 
 (http://www.doxygen.org/install.html) for instructions.
 
 --------
-Dimitri van Heesch (26 December 2012)
+Dimitri van Heesch (19 May 2013)
index 1cd4f16..606804f 100644 (file)
@@ -45,7 +45,7 @@ distclean: clean
        -rm -f Makefile qtools/Makefile src/Makefile examples/Makefile doc/Makefile 
        -rm -f .makeconfig .tmakeconfig
        -rm -f src/doxygen.pro src/libdoxygen.pro qtools/qtools.pro src/libdoxycfg.pro libmd5/libmd5.pro
-       -rm -f src/version.cpp
+       -rm -f src/version.cpp 
        -rm -r addon/doxywizard/Makefile
        -rm -f addon/doxywizard/doxywizard.pro
        -rm -f VERSION
@@ -82,7 +82,7 @@ pdf: docs
 DISTFILES =  Doxyfile libmd5 addon tmake doc examples bin lib objects \
              qtools src configure configure.bin Makefile.in Makefile.win_nmake.in \
              Makefile.win_make.in INSTALL LANGUAGE.HOWTO LICENSE PLATFORMS \
-             VERSION packages winbuild
+             VERSION packages winbuild jquery
 
 archive: clean
        tar zcvf dx`date +%y%m%d`.tgz $(DISTFILES)
diff --git a/README b/README
index 847c028..2ecb0a5 100644 (file)
--- a/README
+++ b/README
@@ -1,4 +1,4 @@
-DOXYGEN Version 1.8.3
+DOXYGEN Version 1.8.4
 
 Please read INSTALL for compilation instructions.
 
@@ -26,4 +26,4 @@ forum.
 
 Enjoy,
 
-Dimitri van Heesch (dimitri@stack.nl) (26 December 2012)
+Dimitri van Heesch (dimitri@stack.nl) (19 May 2013)
index 2314021..f13971f 100644 (file)
@@ -3,7 +3,7 @@
  * $Id$
  *
  *
- * Copyright (C) 1997-2006 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index edb4580..32e4181 100644 (file)
@@ -3,7 +3,7 @@
  * $Id$
  *
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index a1d6f87..9a59502 100644 (file)
@@ -3,7 +3,7 @@
  * $Id$
  *
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 71d50cb..3cd77b0 100644 (file)
@@ -3,7 +3,7 @@
  * $Id$
  *
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index dea7d42..635cff3 100644 (file)
@@ -3,7 +3,7 @@
  * $Id$
  *
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 535889f..992b185 100644 (file)
@@ -3,7 +3,7 @@
  * $Id$
  *
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 829d977..172bcd2 100644 (file)
@@ -3,7 +3,7 @@
  * $Id$
  *
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index acce157..d946fcf 100644 (file)
@@ -3,7 +3,7 @@
  * $Id$
  *
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index a921b6c..d51d8e2 100644 (file)
@@ -3,7 +3,7 @@
  * $Id$
  *
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 83cc4d8..6c6a1c7 100644 (file)
@@ -3,7 +3,7 @@
  * $Id$
  *
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index b7c6397..61f9e6b 100644 (file)
@@ -3,7 +3,7 @@
  * $Id$
  *
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 1124b3d..49cfef9 100644 (file)
@@ -3,7 +3,7 @@
  * $Id$
  *
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 7b9e7fc..5706e6e 100644 (file)
@@ -3,7 +3,7 @@
  * $Id$
  *
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 303e556..4d0a0cf 100644 (file)
@@ -3,7 +3,7 @@
  * $Id$
  *
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index f80a4eb..66c9a14 100644 (file)
@@ -3,7 +3,7 @@
  * $Id$
  *
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 124fde0..4b57e50 100644 (file)
@@ -3,7 +3,7 @@
  * $Id$
  *
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 64b89a2..89ef541 100644 (file)
@@ -3,7 +3,7 @@
  * $Id$
  *
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 8b3d9f2..df89941 100644 (file)
@@ -3,7 +3,7 @@
  * $Id$
  *
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 86aad3b..b43e878 100644 (file)
@@ -3,7 +3,7 @@
  * $Id$
  *
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index c5acd67..49ddb4d 100644 (file)
@@ -6,12 +6,12 @@ distclean: clean
        $(RM) -rf Makefile doxyapp.pro Makefile.doxyapp
 
 tmake:
-       $(ENV) $(PERL) $(TMAKE) doxyapp.pro >Makefile.doxyapp
+       $(ENV) $(PERL) "$(TMAKE)" doxyapp.pro >Makefile.doxyapp
 
 strip:
        strip doxyapp
 
 Makefile.doxyapp: doxyapp.pro
-       $(ENV) $(PERL) $(TMAKE) doxyapp.pro >Makefile.doxyapp
+       $(ENV) $(PERL) "$(TMAKE)" doxyapp.pro >Makefile.doxyapp
 
 install:
index 521d1cc..651bc36 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 3159e22..7daafee 100644 (file)
@@ -8,17 +8,17 @@ distclean: clean
        $(RM) -rf Makefile doxyindexer.pro Makefile.doxyindexer
 
 tmake:
-       $(ENV) $(PERL) $(TMAKE) doxysearch.pro >Makefile.doxysearch
-       $(ENV) $(PERL) $(TMAKE) doxyindexer.pro >Makefile.doxyindexer
+       $(ENV) $(PERL) "$(TMAKE)" doxysearch.pro >Makefile.doxysearch
+       $(ENV) $(PERL) "$(TMAKE)" doxyindexer.pro >Makefile.doxyindexer
 
 strip:
        strip doxysearch
 
 Makefile.doxysearch: doxysearch.pro
-       $(ENV) $(PERL) $(TMAKE) doxysearch.pro >Makefile.doxysearch
+       $(ENV) $(PERL) "$(TMAKE)" doxysearch.pro >Makefile.doxysearch
 
 Makefile.doxyindexer: doxyindexer.pro
-       $(ENV) $(PERL) $(TMAKE) doxyindexer.pro >Makefile.doxyindexer
+       $(ENV) $(PERL) "$(TMAKE)" doxyindexer.pro >Makefile.doxyindexer
 
 install:
        $(INSTTOOL) -d $(INSTALL)/bin   
index c809e0e..9c27f56 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 7286df8..deeb8f8 100644 (file)
@@ -2,7 +2,7 @@ TEMPLATE     =  app.t
 CONFIG       = console warn_on static release
 HEADERS      = 
 SOURCES      = doxyindexer.cpp
-LIBS        += -lxapian -lqtools -L../../lib
+LIBS        += -L../../lib -lxapian -lqtools
 DESTDIR      = 
 OBJECTS_DIR  = ../../objects
 TARGET       = ../../bin/doxyindexer
index 7b90c82..8aeed81 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 5b0876e..727409a 100644 (file)
@@ -1,7 +1,7 @@
 #
 # 
 #
-# Copyright (C) 1997-2012 by Dimitri van Heesch.
+# Copyright (C) 1997-2013 by Dimitri van Heesch.
 # 
 # Permission to use, copy, modify, and distribute this software and its
 # documentation under the terms of the GNU General Public License is hereby 
index fa49eba..48d233e 100644 (file)
@@ -2,7 +2,7 @@
  *
  * $Id: config_templ.l,v 1.8 2001/01/01 10:15:16 root Exp $
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -408,7 +408,7 @@ static void substEnvVarsInStrList(QStringList &sl)
 
     if (!wasQuoted) /* as a result of the expansion, a single string
                       may have expanded into a list, which we'll
-                      add to sl. If the orginal string already 
+                      add to sl. If the original string already
                       contained multiple elements no further 
                       splitting is done to allow quoted items with spaces! */
     {
index fe8c961..9bdf39d 100644 (file)
@@ -191,7 +191,7 @@ void MainWindow::about()
   t << QString::fromAscii("<qt><center>A tool to configure and run doxygen version ")+
        QString::fromAscii(versionString)+
        QString::fromAscii(" on your source files.</center><p><br>"
-       "<center>Written by<br> Dimitri van Heesch<br>&copy; 2000-2012</center><p>"
+       "<center>Written by<br> Dimitri van Heesch<br>&copy; 2000-2013</center><p>"
        "</qt>");
   QMessageBox::about(this,tr("Doxygen GUI"),msg);
 }
index 4bbb104..e7b7507 100644 (file)
@@ -8,6 +8,7 @@
 #include <QtXml>
 #include "config.h"
 #include "version.h"
+#include "../../src/settings.h"
 
 #undef  SA
 #define SA(x) QString::fromAscii(x)
@@ -120,144 +121,148 @@ QWidget *Expert::createTopicWidget(QDomElement &elem)
   int row=0;
   while (!child.isNull())
   {
-    QString type = child.attribute(SA("type"));
-    if (type==SA("bool"))
+    QString setting = child.attribute(SA("setting"));
+    if (setting.isEmpty() || IS_SUPPORTED(setting.toAscii()))
     {
-      InputBool *boolOption = 
+      QString type = child.attribute(SA("type"));
+      if (type==SA("bool"))
+      {
+        InputBool *boolOption = 
           new InputBool(
-            layout,row,
+              layout,row,
+              child.attribute(SA("id")),
+              child.attribute(SA("defval"))==SA("1"),
+              child.attribute(SA("docs"))
+              );
+        m_options.insert(
             child.attribute(SA("id")),
-            child.attribute(SA("defval"))==SA("1"),
-            child.attribute(SA("docs"))
-           );
-      m_options.insert(
-          child.attribute(SA("id")),
-          boolOption
-         );
-      connect(boolOption,SIGNAL(showHelp(Input*)),SLOT(showHelp(Input*)));
-      connect(boolOption,SIGNAL(changed()),SIGNAL(changed()));
-    }
-    else if (type==SA("string"))
-    {
-      InputString::StringMode mode;
-      QString format = child.attribute(SA("format"));
-      if (format==SA("dir"))
-      {
-        mode = InputString::StringDir;
+            boolOption
+            );
+        connect(boolOption,SIGNAL(showHelp(Input*)),SLOT(showHelp(Input*)));
+        connect(boolOption,SIGNAL(changed()),SIGNAL(changed()));
       }
-      else if (format==SA("file"))
+      else if (type==SA("string"))
       {
-        mode = InputString::StringFile;
-      }
-      else // format=="string"
-      {
-        mode = InputString::StringFree;
-      }
-      InputString *stringOption = 
+        InputString::StringMode mode;
+        QString format = child.attribute(SA("format"));
+        if (format==SA("dir"))
+        {
+          mode = InputString::StringDir;
+        }
+        else if (format==SA("file"))
+        {
+          mode = InputString::StringFile;
+        }
+        else // format=="string"
+        {
+          mode = InputString::StringFree;
+        }
+        InputString *stringOption = 
           new InputString(
-            layout,row,
+              layout,row,
+              child.attribute(SA("id")),
+              child.attribute(SA("defval")),
+              mode,
+              child.attribute(SA("docs")),
+              child.attribute(SA("abspath"))
+              );
+        m_options.insert(
             child.attribute(SA("id")),
-            child.attribute(SA("defval")),
-            mode,
-            child.attribute(SA("docs")),
-            child.attribute(SA("abspath"))
-           );
-      m_options.insert(
-          child.attribute(SA("id")),
-          stringOption
-         );
-      connect(stringOption,SIGNAL(showHelp(Input*)),SLOT(showHelp(Input*)));
-      connect(stringOption,SIGNAL(changed()),SIGNAL(changed()));
-    }
-    else if (type==SA("enum"))
-    {
-      InputString *enumList = new InputString(
+            stringOption
+            );
+        connect(stringOption,SIGNAL(showHelp(Input*)),SLOT(showHelp(Input*)));
+        connect(stringOption,SIGNAL(changed()),SIGNAL(changed()));
+      }
+      else if (type==SA("enum"))
+      {
+        InputString *enumList = new InputString(
             layout,row,
             child.attribute(SA("id")),
             child.attribute(SA("defval")),
             InputString::StringFixed,
             child.attribute(SA("docs"))
-           );
-      QDomElement enumVal = child.firstChildElement();
-      while (!enumVal.isNull())
-      {
-        enumList->addValue(enumVal.attribute(SA("name")));
-        enumVal = enumVal.nextSiblingElement();
+            );
+        QDomElement enumVal = child.firstChildElement();
+        while (!enumVal.isNull())
+        {
+          enumList->addValue(enumVal.attribute(SA("name")));
+          enumVal = enumVal.nextSiblingElement();
+        }
+        enumList->setDefault();
+
+        m_options.insert(child.attribute(SA("id")),enumList);
+        connect(enumList,SIGNAL(showHelp(Input*)),SLOT(showHelp(Input*)));
+        connect(enumList,SIGNAL(changed()),SIGNAL(changed()));
       }
-      enumList->setDefault();
-
-      m_options.insert(child.attribute(SA("id")),enumList);
-      connect(enumList,SIGNAL(showHelp(Input*)),SLOT(showHelp(Input*)));
-      connect(enumList,SIGNAL(changed()),SIGNAL(changed()));
-    }
-    else if (type==SA("int"))
-    {
-      InputInt *intOption = 
+      else if (type==SA("int"))
+      {
+        InputInt *intOption = 
           new InputInt(
-            layout,row,
+              layout,row,
+              child.attribute(SA("id")),
+              child.attribute(SA("defval")).toInt(),
+              child.attribute(SA("minval")).toInt(),
+              child.attribute(SA("maxval")).toInt(),
+              child.attribute(SA("docs"))
+              );
+        m_options.insert(
             child.attribute(SA("id")),
-            child.attribute(SA("defval")).toInt(),
-            child.attribute(SA("minval")).toInt(),
-            child.attribute(SA("maxval")).toInt(),
-            child.attribute(SA("docs"))
-          );
-      m_options.insert(
-          child.attribute(SA("id")),
-          intOption
-        );
-      connect(intOption,SIGNAL(showHelp(Input*)),SLOT(showHelp(Input*)));
-      connect(intOption,SIGNAL(changed()),SIGNAL(changed()));
-    }
-    else if (type==SA("list"))
-    {
-      InputStrList::ListMode mode;
-      QString format = child.attribute(SA("format"));
-      if (format==SA("dir"))
-      {
-        mode = InputStrList::ListDir;
+            intOption
+            );
+        connect(intOption,SIGNAL(showHelp(Input*)),SLOT(showHelp(Input*)));
+        connect(intOption,SIGNAL(changed()),SIGNAL(changed()));
       }
-      else if (format==SA("file"))
+      else if (type==SA("list"))
       {
-        mode = InputStrList::ListFile;
-      }
-      else if (format==SA("filedir"))
-      {
-        mode = InputStrList::ListFileDir;
+        InputStrList::ListMode mode;
+        QString format = child.attribute(SA("format"));
+        if (format==SA("dir"))
+        {
+          mode = InputStrList::ListDir;
+        }
+        else if (format==SA("file"))
+        {
+          mode = InputStrList::ListFile;
+        }
+        else if (format==SA("filedir"))
+        {
+          mode = InputStrList::ListFileDir;
+        }
+        else // format=="string"
+        {
+          mode = InputStrList::ListString;
+        }
+        QStringList sl;
+        QDomElement listVal = child.firstChildElement();
+        while (!listVal.isNull())
+        {
+          sl.append(listVal.attribute(SA("name")));
+          listVal = listVal.nextSiblingElement();
+        }
+        InputStrList *listOption = 
+          new InputStrList(
+              layout,row,
+              child.attribute(SA("id")),
+              sl,
+              mode,
+              child.attribute(SA("docs"))
+              );
+        m_options.insert(
+            child.attribute(SA("id")),
+            listOption
+            );
+        connect(listOption,SIGNAL(showHelp(Input*)),SLOT(showHelp(Input*)));
+        connect(listOption,SIGNAL(changed()),SIGNAL(changed()));
       }
-      else // format=="string"
+      else if (type==SA("obsolete"))
       {
-        mode = InputStrList::ListString;
+        // ignore
       }
-      QStringList sl;
-      QDomElement listVal = child.firstChildElement();
-      while (!listVal.isNull())
+      else // should not happen
       {
-        sl.append(listVal.attribute(SA("name")));
-        listVal = listVal.nextSiblingElement();
+        printf("Unsupported type %s\n",qPrintable(child.attribute(SA("type"))));
       }
-      InputStrList *listOption = 
-          new InputStrList(
-            layout,row,
-            child.attribute(SA("id")),
-            sl,
-            mode,
-            child.attribute(SA("docs"))
-          );
-      m_options.insert(
-          child.attribute(SA("id")),
-          listOption
-        );
-      connect(listOption,SIGNAL(showHelp(Input*)),SLOT(showHelp(Input*)));
-      connect(listOption,SIGNAL(changed()),SIGNAL(changed()));
-    }
-    else if (type==SA("obsolete"))
-    {
-      // ignore
-    }
-    else // should not happen
-    {
-      printf("Unsupported type %s\n",qPrintable(child.attribute(SA("type"))));
-    }
+    } // IS_SUPPORTED
     child = child.nextSiblingElement();
   }
 
@@ -265,11 +270,18 @@ QWidget *Expert::createTopicWidget(QDomElement &elem)
   child = elem.firstChildElement();
   while (!child.isNull())
   {
+    QString setting = child.attribute(SA("setting"));
     QString dependsOn = child.attribute(SA("depends"));
     QString id        = child.attribute(SA("id"));
-    if (!dependsOn.isEmpty())
+    if (!dependsOn.isEmpty() && 
+        (setting.isEmpty() || IS_SUPPORTED(setting.toAscii())))
     {
        Input *parentOption = m_options[dependsOn];
+       if (parentOption==0)
+       {
+         printf("%s has depends=%s that is not valid\n",
+             qPrintable(id),qPrintable(dependsOn));
+       }
        Input *thisOption   = m_options[id];
        Q_ASSERT(parentOption);
        Q_ASSERT(thisOption);
index cd83f88..9e28852 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -43,6 +43,8 @@ void InputBool::setEnabled(bool b)
 { 
   m_enabled = b;
   m_cb->setEnabled(b); 
+  m_lab->setEnabled(b); 
+  updateDefault();
   updateDependencies();
 }
 
@@ -69,7 +71,7 @@ void InputBool::setValue( bool s )
 
 void InputBool::updateDefault()
 {
-  if (m_state==m_default)
+  if (m_state==m_default || !m_lab->isEnabled())
   {
     m_lab->setText(QString::fromAscii("<qt>")+m_id+QString::fromAscii("</qt"));
   }
index 63d16e6..470127a 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 08df309..876a920 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
 
 #include <QtGui>
 
+class NoWheelSpinBox : public QSpinBox
+{
+  protected:
+    void wheelEvent(QWheelEvent *e)
+    {
+      e->ignore();
+    }
+};
+
 InputInt::InputInt( QGridLayout *layout,int &row,
                     const QString & id, 
                     int defVal, int minVal,int maxVal,
@@ -24,7 +33,7 @@ InputInt::InputInt( QGridLayout *layout,int &row,
   : m_default(defVal), m_minVal(minVal), m_maxVal(maxVal), m_docs(docs), m_id(id)
 {
   m_lab = new HelpLabel(id);
-  m_sp  = new QSpinBox;
+  m_sp  = new NoWheelSpinBox;
   m_sp->setMinimum(minVal);
   m_sp->setMaximum(maxVal);
   m_sp->setSingleStep(1);
@@ -56,7 +65,14 @@ void InputInt::setValue(int val)
     m_val = val;
     m_sp->setValue(val);
     m_value = m_val;
-    if (m_val==m_default)
+    updateDefault();
+  }
+}
+
+void InputInt::updateDefault()
+{
+  {
+    if (m_val==m_default || !m_lab->isEnabled())
     {
       m_lab->setText(QString::fromAscii("<qt>")+m_id+QString::fromAscii("</qt"));
     }
@@ -72,6 +88,7 @@ void InputInt::setEnabled(bool state)
 {
   m_lab->setEnabled(state);
   m_sp->setEnabled(state);
+  updateDefault();
 }
 
 QVariant &InputInt::value() 
index 9ac506d..846b7c2 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -56,6 +56,7 @@ class InputInt : public QObject, public Input
     void showHelp(Input *);
 
   private:
+    void updateDefault();
     QLabel   *m_lab;
     QSpinBox *m_sp;
     int       m_val;
index c0b92b3..36fe319 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
 
 #include <QtGui>
 
+class NoWheelComboBox : public QComboBox
+{
+  protected:
+    void wheelEvent(QWheelEvent *e)
+    {
+      e->ignore();
+    }
+};
+
+
 InputString::InputString( QGridLayout *layout,int &row,
                           const QString & id, const QString &s, 
                           StringMode m, const QString &docs,
@@ -30,7 +40,7 @@ InputString::InputString( QGridLayout *layout,int &row,
   if (m==StringFixed)
   {
     layout->addWidget( m_lab, row, 0 );
-    m_com = new QComboBox; 
+    m_com = new NoWheelComboBox; 
     layout->addWidget( m_com, row, 1, 1, 3, Qt::AlignLeft );
     m_le=0;
     m_br=0;
@@ -95,7 +105,13 @@ void InputString::setValue(const QString &s)
   {
     m_str = s;
     m_value = m_str;
-    if (m_str==m_default)
+    updateDefault();
+  }
+}
+void InputString::updateDefault()
+{
+  {
+    if (m_str==m_default || !m_lab->isEnabled())
     {
       m_lab->setText(QString::fromAscii("<qt>")+m_id+QString::fromAscii("</qt"));
     }
@@ -114,6 +130,7 @@ void InputString::setEnabled(bool state)
   if (m_le)  m_le->setEnabled(state);
   if (m_br)  m_br->setEnabled(state);
   if (m_com) m_com->setEnabled(state);
+  updateDefault();
 }
 
 void InputString::browse()
index b957bfa..ab2c8e2 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -72,6 +72,7 @@ class InputString : public QObject, public Input
     void help();
 
   private:
+    void updateDefault();
     QLabel       *m_lab;
     QLineEdit    *m_le;
     QToolBar     *m_br;
index bca92e2..23c20ff 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -141,6 +141,7 @@ void InputStrList::setEnabled(bool state)
   m_lb->setEnabled(state);
   if (m_brFile) m_brFile->setEnabled(state);
   if (m_brDir)  m_brDir->setEnabled(state);
+  updateDefault();
 }
 
 void InputStrList::browseFiles()
@@ -222,7 +223,7 @@ void InputStrList::update()
 
 void InputStrList::updateDefault()
 {
-  if (m_strList==m_default)
+  if (m_strList==m_default || !m_lab->isEnabled())
   {
     m_lab->setText(QString::fromAscii("<qt>")+m_id+QString::fromAscii("</qt"));
   }
index 0201aee..3a9278d 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 4752520..9d523c1 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 99e1db5..877de1d 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 62baf32..ba1bca2 100755 (executable)
--- a/configure
+++ b/configure
@@ -2,7 +2,7 @@
 #
 # $Id$
 #
-# Copyright (C) 1997-2012 by Dimitri van Heesch.
+# Copyright (C) 1997-2013 by Dimitri van Heesch.
 # 
 # Permission to use, copy, modify, and distribute this software and its
 # documentation under the terms of the GNU General Public License is hereby 
@@ -17,7 +17,7 @@
 
 doxygen_version_major=1
 doxygen_version_minor=8
-doxygen_version_revision=3
+doxygen_version_revision=4
 
 #NOTE: Setting version_mmn to "NO" will omit mmn info from the package.
 doxygen_version_mmn=NO
@@ -40,6 +40,9 @@ f_flex=NO
 f_bison=NO
 f_search=NO
 f_langs=nl,sv,cz,fr,id,it,de,jp,je,es,fi,ru,hr,pl,pt,hu,kr,ke,ro,si,cn,no,mk,br,dk,sk,ua,gr,tw,sr,ca,lt,za,ar,fa,sc,vi,tr,eo,am
+f_sqlite3=NO
+f_libclang=NO
+f_libclangstatic=NO
 
 while test -n "$1";  do
   case $1 in
@@ -97,6 +100,16 @@ while test -n "$1";  do
     --with-doxysearch | -with-doxysearch)
        f_search=YES
        ;;
+    --with-sqlite3 | -with-sqlite3)
+       f_sqlite3=YES
+       ;;
+    --with-libclang | -with-libclang)
+       f_libclang=YES
+       ;;
+    --with-libclang-static | -with-libclang-static)
+       f_libclang=YES
+       f_libclangstatic=YES
+       ;;
     -h | -help | --help)
        f_help=y
        ;;
@@ -115,6 +128,7 @@ Usage: $0 [--help] [--shared] [--static] [--release] [--debug]
           [--perl name] [--flex name] [--bison name] [--make name] 
           [--dot name] [--platform target] [--prefix dir] [--docdir dir] 
           [--install name] [--english-only] [--enable-langs list] 
+          [--with-sqlite3] [--with-libclang]
           [--with-doxywizard] [--with-doxysearch] [--with-doxyapp]
 
 Options: 
@@ -147,6 +161,8 @@ Options:
   --english-only        Include support for English only.
   --enable-langs list  Include support for output languages listed in list.
                        [default: $f_langs]
+  --with-sqlite3        Add support for sqlite3 output [experimental]
+  --with-libclang       Add support for libclang parsing
   --with-doxywizard     Build the GUI frontend for doxygen. This
                         requires Qt version 4.
   --with-doxysearch     Build external search tools (doxysearch and doxyindexer)
@@ -265,7 +281,7 @@ if test -z "$f_docdir"; then
 fi
 
 if test "$f_plf_auto" = NO; then
-  echo -n "  Checking for platform $f_platform... "
+  printf "  Checking for platform $f_platform... "
   if test '!' -d tmake/lib/$f_platform; then
     echo "not supported!" 
     echo
@@ -279,7 +295,7 @@ fi
 if test "$f_wizard" = YES; then
   if test -z "$QTDIR"; then
     echo "  QTDIR environment variable not set!"
-    echo -n "  Checking for Qt..."
+    printf "  Checking for Qt..."
     for d in /usr/{lib,share,qt}/{qt-4,qt4,qt,qt*,4} /usr; do
       if test -x "$d/bin/qmake"; then
         QTDIR=$d
@@ -287,7 +303,7 @@ if test "$f_wizard" = YES; then
     done
   else
     echo "  Detected Qt via the QTDIR environment variable..."
-    echo -n "                    "
+    printf "                    "
   fi
   if test -z "$QTDIR"; then
     echo "QTDIR not set and Qt not found at standard locations!"
@@ -302,7 +318,7 @@ fi
 
 if test "$f_search" = YES; then
   if test -z "$XAPIAN"; then
-    echo -n "  Checking for Xapian..."
+    printf "  Checking for Xapian..."
     for d in /usr /usr/local /opt/local; do
       if test -e "$d/include/xapian.h"; then
         XAPIAN=$d
@@ -317,7 +333,7 @@ fi
    
 # - check for make ------------------------------------------------------------
 
-echo -n "  Checking for GNU make tool... "
+printf "  Checking for GNU make tool... "
 if test "$f_make" = NO; then
   make_names="gmake make"
   make_dirs="$bin_dirs /usr/bin /usr/local/bin /bin /sbin"
@@ -344,7 +360,7 @@ echo "using $f_make"
 
 # - check for install ------------------------------------------------------------
 
-echo -n "  Checking for GNU install tool... "
+printf "  Checking for GNU install tool... "
 if test "$f_insttool" = NO; then
   install_names="ginstall install"
   install_dirs="$bin_dirs /usr/bin /usr/local/bin /bin /sbin /usr/ucb"
@@ -381,7 +397,7 @@ echo "using $f_insttool";
 
 # - check for dot ------------------------------------------------------------
 
-echo -n "  Checking for dot (part of GraphViz)... "
+printf "  Checking for dot (part of GraphViz)... "
 if test "$f_dot" = NO; then
   dot_dirs="$bin_dirs /usr/bin /usr/local/bin /bin /sbin"
   dot_prog=NO
@@ -400,9 +416,85 @@ else
   echo "using $f_dot"
 fi
 
+# - check for sqlite3 ---------------------------------------------------------
+
+if test "$f_sqlite3" = YES; then
+  printf "  Checking for sqlite3 ... "
+  sqlite3_hdr_dir="/usr/include /usr/local/include /opt/local/include"
+  sqlite3_lib_dir="/usr/lib /usr/local/lib /opt/local/lib"
+  sqlite3_lib_name="libsqlite3.so libsqlite3.dylib libsqlite3.a"
+  sqlite3_hdr=NO
+  sqlite3_lib=NO
+  sqlite3_link=
+  for j in $sqlite3_hdr_dir; do
+    if test -f "$j/sqlite3.h"; then
+      sqlite3_hdr="$j/sqlite3.h"
+      break
+    fi
+  done
+  for i in $sqlite3_lib_dir; do
+    if test "$sqlite3_lib" = NO; then
+      for j in $sqlite3_lib_name; do
+        if test -f "$i/$j"; then
+          sqlite3_lib="$i/$j"
+          sqlite3_link="-L $i -lsqlite3"
+          break
+        fi
+      done
+    fi
+  done
+  if test "$sqlite3_hdr" = NO -o "$sqlite3_lib" = NO; then
+    echo "not found!";
+  else
+    echo "using header $sqlite3_hdr and library $sqlite3_lib...";
+  fi
+fi
+
+# - check for libclang ---------------------------------------------------------
+
+if test "$f_libclang" = YES; then
+  printf "  Checking for libclang ... "
+  libclang_hdr_dir="/usr/include /usr/local/include /opt/local/include"
+  libclang_lib_dir="/usr/lib /usr/local/lib /opt/local/lib"
+  if test "$f_libclangstatic" = NO; then
+    libclang_lib_name="libclang.so libclang.dylib libclang.a"
+  else
+    libclang_lib_name="libclang.a"
+  fi
+  libclang_hdr=NO
+  libclang_lib=NO
+  libclang_link=
+  for j in $libclang_hdr_dir; do
+    if test -f "$j/clang-c/Index.h"; then
+      libclang_hdr="$j/clang-c/Index.h"
+      break
+    fi
+  done
+  for i in $libclang_lib_dir; do
+    if test "$libclang_lib" = NO; then
+      for j in $libclang_lib_name; do
+        if test -f "$i/$j"; then
+          libclang_lib="$i/$j"
+          if test "$f_libclangstatic" = NO; then
+            libclang_link="-L $i -lclang"
+          else
+            libclang_link="$i/libclang.a $i/libclangFrontend.a $i/libclangSerialization.a $i/libclangParse.a $i/libclangSema.a $i/libclangAnalysis.a $i/libclangStaticAnalyzerCore.a $i/libclangAST.a $i/libclangBasic.a $i/libclangDriver.a $i/libclangEdit.a $i/libclangLex.a $i/libclangRewriteCore.a $i/libLLVMBitReader.a $i/libLLVMMC.a $i/libLLVMMCParser.a $i/libLLVMSupport.a -ldl -lpthread"
+          fi
+          break
+        fi
+      done
+    fi
+  done
+  if test "$libclang_hdr" = NO -o "$libclang_lib" = NO; then
+    echo "not found!";
+  else
+    echo "using header $libclang_hdr and library $libclang_lib...";
+  fi
+fi
+
 # - check for perl ------------------------------------------------------------
 
-echo -n "  Checking for perl... "
+printf "  Checking for perl... "
 if test "$f_perl" = NO; then
   perl_names="perl perl5"
   perl_dirs="$bin_dirs /usr/bin /usr/local/bin /bin /sbin"
@@ -435,7 +527,7 @@ echo "using $f_perl";
 
 # - check for flex ------------------------------------------------------------
 
-echo -n "  Checking for flex... "
+printf "  Checking for flex... "
 if test "$f_flex" = NO; then
   flex_dirs="$bin_dirs /usr/bin /usr/local/bin /bin"
   flex_prog=NO
@@ -459,7 +551,7 @@ fi
 
 # - check for bison ------------------------------------------------------------
 
-echo -n "  Checking for bison... "
+printf "  Checking for bison... "
 if test "$f_bison" = NO; then
   bison_dirs="$bin_dirs /usr/bin /usr/local/bin /bin"
   bison_prog=NO
@@ -502,7 +594,7 @@ configPWD=`pwd`
 cat > .makeconfig <<EOF
 DOXYGEN   = $configPWD
 TMAKEPATH = $configPWD/tmake/lib/$f_platform
-ENV       = env TMAKEPATH=\$(TMAKEPATH)
+ENV       = env TMAKEPATH="\$(TMAKEPATH)"
 TMAKE     = $configPWD/tmake/bin/tmake
 MAKE      = $f_make
 PERL      = $f_perl
@@ -522,6 +614,7 @@ HAVE_DOT  = $f_dot
 EOF
 fi
 
+
 if test "$f_platform" = "m68k-atari-mint-g++"; then
   cat >> .makeconfig <<EOF
 TMAKE += -unix
@@ -640,9 +733,9 @@ EOF
        if test $f_wizard = YES; then
          EXTRADEPS=doxywizard
        fi
-       if test $f_search = YES; then
-         EXTRADEPS="$EXTRADEPS doxysearch"
-       fi
+#       if test $f_search = YES; then
+#         EXTRADEPS="$EXTRADEPS doxysearch"
+#       fi
        echo "all: src/version.cpp $EXTRADEPS" >> $DST
        echo "  \$(MAKE) -C qtools" >> $DST
        echo "  \$(MAKE) -C libmd5" >> $DST
@@ -698,7 +791,7 @@ EOF
      #if test "$f_thread" = YES; then
      #  realopts="$realopts thread"
      #fi
-     cat $SRC .tmakeconfig | sed -e "s/\$extraopts/$realopts/g" >> $DST
+     cat $SRC .tmakeconfig | sed -e "s/\$extraopts/$realopts/g" -e "s;%%SQLITE3_LIBS%%;$sqlite3_link;g" -e "s;%%LIBCLANG_LIBS%%;$libclang_link;g" >> $DST
      echo "  Created $DST from $SRC..."
 done
 
@@ -707,7 +800,7 @@ done
 if test -f "src/lang_cfg.h"; then
     chmod u+w src/lang_cfg.h   # make sure file can be overwritten
 fi
-echo -n "  Generating src/lang_cfg.h..."
+echo "  Generating src/lang_cfg.h..."
 echo $f_langs | $f_perl -e '@l=split(/,/,<STDIN>); 
         chomp @l; 
        @allowed=(split(/,/,"NL,SV,CZ,FR,ID,IT,DE,JP,JE,ES,FI,RU,HR,PL,PT,HU,KR,KE,RO,SI,CN,NO,MK,BR,DK,SK,UA,GR,TW,SR,CA,LT,ZA,AR,FA,SC,VI,TR,EO,AM"));
@@ -720,4 +813,29 @@ echo $f_langs | $f_perl -e '@l=split(/,/,<STDIN>);
             if ($r!=1) { die "ERROR: Invalid language $elem was selected!\n"; } 
             print "#define LANG_$elem\n";
         };' > ./src/lang_cfg.h   
+
+if test -f "src/config.h"; then
+    chmod u+w src/config.h
+fi
+echo "  Generating src/settings.h..."
+echo "#ifndef SETTINGS_H" > src/settings.h
+echo "#define SETTINGS_H" >> src/settings.h
+echo "" >> src/settings.h
+if test "$f_sqlite3" != NO; then
+echo "#define USE_SQLITE3  1" >> src/settings.h
+else
+echo "#define USE_SQLITE3  0" >> src/settings.h
+fi
+if test "$f_libclang" != NO; then
+echo "#define USE_LIBCLANG 1" >> src/settings.h
+else
+echo "#define USE_LIBCLANG 0" >> src/settings.h
+fi
+echo "" >> src/settings.h
+echo "#define IS_SUPPORTED(x) \\" >> src/settings.h
+echo "  ((USE_SQLITE3  && strcmp(\"USE_SQLITE3\",(x))==0)  || \\" >> src/settings.h 
+echo "   (USE_LIBCLANG && strcmp(\"USE_LIBCLANG\",(x))==0) || \\" >> src/settings.h 
+echo "  0)" >> src/settings.h 
+echo "" >> src/settings.h
+echo "#endif" >> src/settings.h
 echo
index 50cede6..7269989 100644 (file)
@@ -12,7 +12,7 @@
 # Documents produced by Doxygen are derivative works derived from the
 # input used in their production; they are not affected by this license.
 
-PROJECT_NAME      = 
+PROJECT_NAME      = "Doxygen"
 OUTPUT_DIRECTORY  = ..
 HTML_HEADER       = 
 HTML_FOOTER       = 
@@ -39,7 +39,7 @@ INPUT             = index.doc install.doc starting.doc docblocks.doc markdown.do
                     external.doc faq.doc trouble.doc features.doc \
                    doxygen_usage.doc doxywizard_usage.doc \
                    config.doc commands.doc htmlcmds.doc xmlcmds.doc language.doc \
-                    perlmod.doc perlmod_tree.doc arch.doc 
+                    perlmod.doc perlmod_tree.doc arch.doc changelog.doc
 FILE_PATTERNS     = *.cpp *.h *.doc
 EXAMPLE_PATH      = ../examples
 RECURSIVE         = NO
index aaa9b0e..591e327 100644 (file)
@@ -1,7 +1,7 @@
 #
 # 
 #
-# Copyright (C) 1997-2012 by Dimitri van Heesch.
+# Copyright (C) 1997-2013 by Dimitri van Heesch.
 #
 # Permission to use, copy, modify, and distribute this software and its
 # documentation under the terms of the GNU General Public License is hereby 
index a13b90f..f62f97a 100644 (file)
@@ -1,7 +1,7 @@
 #
 # 
 #
-# Copyright (C) 1997-2012 by Dimitri van Heesch.
+# Copyright (C) 1997-2013 by Dimitri van Heesch.
 #
 # Permission to use, copy, modify, and distribute this software and its
 # documentation under the terms of the GNU General Public License is hereby 
index 07c0679..c19b0e4 100644 (file)
@@ -1,7 +1,7 @@
 #
 # 
 #
-# Copyright (C) 1997-2012 by Dimitri van Heesch.
+# Copyright (C) 1997-2013 by Dimitri van Heesch.
 #
 # Permission to use, copy, modify, and distribute this software and its
 # documentation under the terms of the GNU General Public License is hereby 
index af8711c..f8705f3 100644 (file)
@@ -1,7 +1,7 @@
 #
 # 
 #
-# Copyright (C) 1997-2012 by Dimitri van Heesch.
+# Copyright (C) 1997-2013 by Dimitri van Heesch.
 #
 # Permission to use, copy, modify, and distribute this software and its
 # documentation under the terms of the GNU General Public License is hereby 
index f89b12a..62661bc 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -58,7 +58,7 @@ of macros. This is to allow macro names to appear in the type of
 function parameters for instance.
 
 Another difference is that the preprocessor parses, but not actually includes 
-code when it encounters a \#include (with the exception of \#include 
+code when it encounters a \c \#include (with the exception of \c \#include
 found inside { ... } blocks). The reasons behind this deviation from 
 the standard is to prevent feeding multiple definitions of the 
 same functions/classes to doxygen's parser. If all source files would 
@@ -67,7 +67,7 @@ definitions (and their documentation) would be present in each
 translation unit. 
 
 The preprocessor is written using \c flex and can be found in
-\c src/pre.l. For condition blocks (\#if) evaluation of constant expressions 
+\c src/pre.l. For condition blocks (\c \#if) evaluation of constant expressions 
 is needed. For this a \c yacc based parser is used, which can be found 
 in \c src/constexp.y and \c src/constexp.l.
 
@@ -237,6 +237,10 @@ utime $now, $now, $file
 
 \endverbatim
 
+\htmlonly
+Return to the <a href="index.html">index</a>.
+\endhtmlonly
+
 */
 
 
index 7dcb328..3c50435 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -131,4 +131,10 @@ typedef struct StructName TypeName
   Click <a href="$(DOXYGEN_DOCDIR)/examples/restypedef/html/restypedef_8cpp.html">here</a> 
   for the corresponding HTML documentation that is generated by Doxygen.
   \endhtmlonly
+
+\htmlonly
+Go to the <a href="output.html">next</a> section or return to the
+ <a href="index.html">index</a>.
+\endhtmlonly
+
 */
diff --git a/doc/changelog.doc b/doc/changelog.doc
new file mode 100644 (file)
index 0000000..04bb8b4
--- /dev/null
@@ -0,0 +1,1898 @@
+/** \page changelog Changelog
+\tableofcontents
+\section log_1_8 Release 1.8
+
+\subsection log_1_8_4 Release 1.8.4
+\htmlonly
+<b>(release date 19-05-2013)</b>
+<a name="1.8.3.1"></a>
+<h3>Changes</h3>
+<ul>
+<li>   id 686384: When INLINE_SIMPLE_STRUCTS is enabled, also structs with
+       simple typedefs will be inlined.
+<li>   Doxywizard: scrolling with mouse wheel no longer affects the values in
+       the expert view.
+<li>   id 681733: More consistent warnings and errors.
+</ul>
+<h3>New features</h3>
+<ul>
+<li>   Added support for "clang assisted parsing", which allows
+       the code to also be parsed via libclang (C/C++ frontend of LLVM) 
+       and can improve the quality of the syntax highting, cross-references, 
+       and call graphs, especially for template heavy C++ code. To enable 
+       this feature you have to configure doxygen with the --with-libclang 
+       option. Then you get two new configuration options: CLANG_ASSISTED_PARSING 
+       to enable or disable parsing via clang and CLANG_OPTIONS to pass additional 
+       compiler options needed to compile the files. Note that enabling this feature 
+       has a significant performance penality.
+<li>   Included patch donated by Intel which adds Docbook support.
+       This can be enabled via GENERATE_DOCBOOK and the output location can
+       be controlled using DOCBOOK_OUTPUT. Docbook specific sections can be
+       added using \docbookonly ... \enddocbookonly
+<li>   Added support for UNO IDL (interace language used in Open/Libre Office), thanks to
+       Michael Stahl for the patch.
+<li>   Included patch by Adrian Negreanu which stores data gathered by 
+       doxygen in a sqlite3 database. Currently still work in progress and
+       can only be enabled using --with-sqlite3 during ./configure.
+<li>   For interactive SVG graphs, edges are now highlighted when hovered by
+       the mouse.
+<li>   Include patch by Adrian Negreanu to show duration statistics after a run.
+       You can enable this by running doxygen with the "-d Time" option.
+<li>   Included patch by Markus Geimer which adds a new option 
+       LATEX_EXTRA_FILES which works similarily to HTML_EXTRA_FILES in that
+       it copied specified files to the LaTeX output directory.
+<li>   id 698223: Added support for C++11 keyword alignas
+<li>   id 693178: Added support for processing DocSets with Dash (thanks to
+       Bogdan Popescu for the patch 
+<li>   id 684782: Added option EXTERNAL_PAGES which can be used to determine
+       whether or not pages importated via tags will appear under related 
+       pages (similar to EXTERNAL_GROUPS).
+<li>   id 692227: Added new MathJax command MATHJAX_CODEFILE which supports
+       including a file with MathJax related scripting to be inserted before
+       the MathJax script is loaded. Thanks to Albert for the patch.
+<li>   id 693537: Comments in the config file starting with ## will now be 
+       kept when upgrading the file with doxygen -u (and doxygen -s -u).
+       Thanks to Albert for the patch.
+<li>   id 693422: Adds support for Latvian (thanks to a patch by Lauris).
+<li>   Included language updates for Ukrainian, Romanian, and Korean
+</ul>
+<h3>Bug fixes (ids refer to the <a href="http://bugzilla.gnome.org/buglist.cgi?product=doxygen&bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=NEEDINFO&bug_status=REOPENED&bug_status=RESOLVED&bug_status=VERIFIED&bug_status=CLOSED&email1=&emailtype1=substring&emailassigned_to1=1&email2=&emailtype2=substring&emailreporter2=1&changedin=&chfieldfrom=&chfieldto=Now&chfieldvalue=&short_desc=&short_desc_type=substring&long_desc=&long_desc_type=substring&bug_file_loc=&bug_file_loc_type=substring&status_whiteboard=&status_whiteboard_type=substring&keywords=&keywords_type=anywords&op_sys_details=&op_sys_details_type=substring&version_details=&version_details_type=substring&newqueryname=&form_name=query&order=bugs.bug_id">bugzilla</a> database)</h3>
+<ul>
+<li>   id 145294: Fixed parse issue when using less than inside a template
+       argument.
+<li>   id 325266 man page output was missing a linebreak before .SH when
+       definition a group with a section.
+<li>   id 338205: @anchor were wrong when CREATE_SUBDIRS was enabled.
+<li>   id 427012: Putting a @todo in front of an anonoymous namespace caused
+       bogus entry in the todo list.
+<li>   id 564462: Fixed alignment issue with tabs and multibyte characters.
+<li>   id 567542: Character entities in titles were not rendered correctly 
+       in the HTML navigation tree.
+<li>   id 571561: No space between * and tag (e.g. \endcode) made parser
+       misbehave
+<li>   id 583233: Included patch to limit generated Doxyfile comments to 80
+       columns
+<li>   id 592626: Fixed off-by-one with MAX_DOT_GRAPH_DEPTH.
+<li>   id 619790: Improved linking to template specializations.
+       Thanks to David Haney for the patch.
+<li>   id 627712: Doxygen Header in C Files makes empty Lines in HTML Source
+       Code when starts in Line 1
+<li>   id 639954: Fortran: array constructors with brackets were not correctly
+       recognized.
+<li>   id 646428: The generated man pages had a .PP just before the subject 
+       description
+<li>   id 646431: On generated manpages the return section is incorrectly 
+       indented
+<li>   id 650004: use \page now generates a man page were the . is not 
+       replaced by _8.
+<li>   id 657704: Fixed issue with PROJECT_LOGO when using backslashes in
+       the path.
+<li>   id 666008: Fortran: Using @var at module levele didn't work.
+       expect a file/path name.
+<li>   id 673218: Replaced "echo -n" with "printf" in the configure script.
+<li>   id 674856: Removed warning when using \endinternal
+<li>   id 675607: Added &, @, and # as allowed characters for commands that
+<li>   id 679626: Included patch by Abert to correctly link pages in the manual
+<li>   id 681874: Added support for single column Markdown tables.
+<li>   id 682369: Incomplete documentation on doxygen -w latex
+<li>   id 683516: Doxygen crashed when structural commands (like \var) appeared 
+       in .md files.
+<li>   id 686259: Fixed character encoding problem when multibytes characters
+       were used in anchors.
+<li>   id 691071: Documentation before an anonymous member did not appear.
+<li>   id 692162: Fixed Markdown related indentation problem.
+<li>   id 692320: Regression: Text after @copydoc was not visible anymore.
+<li>   id 692537: Linked to external pages was done using the page label 
+       rather than the file name.
+<li>   id 693331: build using ./configure ; make did not work if the path
+       contained a space.
+<li>   id 693406: Tag files are now identfied by the full path instead of
+       only the name of the tag file.
+<li>   id 694376: In some cases members were missing from the tag file.
+<li>   id 694027: Fortran: derive intent from documentation in case no 
+       intent is specified
+<li>   id 694610: Warning was not reported at the correct line in two cases.
+<li>   id 694631, 694632: @cond..@endcond did not work properly for removing
+       macro definitions.
+<li>   id 694685: Fixed crash when adding two different functions with the
+       same name to the same group.
+<li>   id 694726: VHDL: fixed issue generating LaTeX output.
+<li>   id 695277: Fortran: improved handling of protected statement
+<li>   id 695974: Fortran: Fixed issue resulting in 
+       "Stack buffers nested too deeply" error.
+<li>   id 696708: @cond was not handled properly by the preprocessor.
+<li>   id 697233: @copyright command did not end a brief description.
+<li>   id 697249: Markdown tables caused errors reported at wrong line number.
+<li>   id 697494: Removed double entry from the messages produced by doxygen.
+<li>   id 698818: Fixed problem handling @cond for #define's
+<li>   id 698007: Fixed potential crash when searching files.
+<li>   id 696925: #include's inside namespace could result in duplicate entries.
+<li>   id 696954: Doxywizard: Labels of items are now also grayed out 
+       when an item is disabled (thanks to Albert for the patch).
+<li>   id 699195: Changed Markdown page label to support multiple .md files
+       with the same name.
+<li>   id 699218: Fixed issue with margin computation in resize.js.
+<li>   id 699381: Lonely h4,h5,h6 end tag caused assert.
+<li>   id 699437: Trailing comments were not always rendered properly if
+       MARKDOWN_SUPPORT was enabled.
+<li>   id 699460: Updated doxygen man page (thanks to Manuel for the patch).
+<li>   id 699464: Added reference to \xmlonly and \docbookonly in \htmlonly
+<li>   id 699731: LaTeX: switch to using the xtabular package instead of
+       longtable to prevent overfull vbox errors.
+<li>   id 699732: Template parameters and Exceptions were rendered differently
+       than Parameters and Return Values in the LaTeX output.
+<li>   id 700153: Tcl: Fixed crash when parsing certain Tcl code.
+<li>   id 700345: Comment blocking ending with ///// made slashes appear in 
+       the output.
+<li>   id 700456: Added support for separating auto list items with an
+       empty paragraph.
+<li>   Included a couple of VHDL fixes (thanks to Martin Kreis for the patch)
+<li>   \include and \includelineno both showed line numbers.
+<li>   Putting '// @endverbatim' inside a C comment block was not handled
+       properly by the preprocessor.
+<li>   Fixed various typo's in the manual and improved cross referencing
+       (thanks to Albert and Guillem Jover for their help)
+<li>   Added a couple of missing configuration dependencies.
+</ul>
+\endhtmlonly
+
+\subsection log_1_8_3_1 Release 1.8.3.1
+\htmlonly
+<b>(release date 20-01-2013)</b>
+<a name="1.8.3.1"></a>
+<h3>Changes</h3>
+<ul>
+<li>   Changed to way the search results for multiple projects can be linked 
+       together. A project is now no longer identified by the tag files name but
+       via new option EXTERNAL_SEARCH_ID giving a bit more flexibility.
+<li>   Disabled the disk cache for member data. Allows removing quite some complexity
+       in doxygen and is not really needed now that 64bit systems with &gt;4GB RAM 
+       are becoming more common. Let me know if you think you benefit from this caching.
+<li>   id 691607: Using $relpath$ in a custom footer could lead to ambiguities
+       when followed by a name that could also be a marker, like 'search'.
+       Now $relpath^ should be used instead. $relpath$ is still supported for
+       backward compatibility.
+</ul>
+<h3>New features</h3>
+<ul>
+<li>   You can now use EXTENSION_MAPPING on files without any extension using
+       no_extension as placeholder (thanks to Jason Majors for the patch).
+<li>   To make navindex section inside a layout file that links to 
+       a specific URL you can use usergroup with the url attribute.
+<li>   To make navindex section without any link inside a layout file you 
+       can use usergroup with special title [none].
+</ul>
+<h3>Bug fixes</h3>
+<ul>
+<li>   id 644350: Fortran: Included patch to improve parsing line continuation 
+       characters.
+<li>   id 645423: Fortran: added support for protected attribute
+<li>   id 682550,691315: When using @copydoc, paragraphs breaks did not appear 
+       in the copied documentation.
+<li>   id 686581: Fortran: handle single quotes in normal Fortran comment.
+<li>   id 686689, 691335: Scope of forwardly declared template class was lost 
+       in the output.
+<li>   id 689713: Tcl: Inline source code was not rendered correctly.
+<li>   id 690787: Fixed case were a cyclic inheritance relation could crash 
+       doxygen.
+<li>   id 690831: Using @subpage in a -# style list was not handled properly.
+<li>   id 691000: For a mainpage without title the project name is now shown as
+       the title in the XML output.
+<li>   id 691277: The generated list of citations is now no longer included in 
+       the tag file.
+<li>   id 691073: Documenting strongly typed enum values outside of the enum 
+       did not work.
+<li>   id 691310: Python: = was missing in the output for variable assignment.
+<li>   id 691323: Doxygen could crash when creating inline msc graphs.
+<li>   id 691340: Members didn't have a More.. link to jump to detailed docs.
+<li>   id 691602: Doxygen did not probably distinguish between two template
+<li>   id 691798: regression: C++ style comments that started with a line of 
+       slashes did not get processed correctly anymore. 
+<li>   id 692031: Fixed parse error when left shift operator occurred as a 
+       default parameter.
+       members or functions that only differ in the return type.
+<li>   Setting SEARCH_INCLUDES to NO resulted in no include graphs and no
+       include files being listed in the output.
+<li>   Improved support for MinGW (thanks to a patch by Brecht Sanders).
+<li>   Removed the Graphviz/dot dependency when building the doxygen 
+       documentation.
+<li>   Anchors to sub pages were wrong in the XML output.
+<li>   Included VHDL patch by Martin Kreis that improves the flow chart 
+       generation.
+<li>   corrected several code pages and fontsets for proper RTF output for
+       a number of languages such as Greek.
+</ul>
+\endhtmlonly
+\subsection log_1_8_3 Release 1.8.3
+\htmlonly
+<a name="1.8.3"></a>
+<b>(release date 26-12-2012)</b>
+<h3>Changes</h3>
+<ul>
+<li>   Expanding the tree in an index page of the HTML output, will now 
+       expand only one level instead of the whole sub-tree (thanks to
+       Pez Cuckow for the patch).
+<li>   A blockquote in Markdown does no longer require a whitespace
+       after the last '&gt;' if the '&gt;' is followed by a newline.
+<li>   id 682718: Included patch to add version info to all generated 
+       template files (headers, footers, stylesheets, layout files, etc).
+</ul>
+<h3>New features</h3>
+<ul>
+<li>   Added support for using external tools to index and search through 
+       the HTML documentation. An example index tool is provided (doxyindexer) 
+       and an example search engine (doxysearch.cgi).
+       To configure the external search engine the following new options
+       are added to the configuration file: EXTERNAL_SEARCH (to enable the
+       feature), SEARCHENGINE_URL (to specify the URL of the search engine),
+       SEARCHDATA_FILE (to specify the name of the raw search data to index),
+       EXTRA_SEARCH_MAPPINGS (for search through multiple projects).
+       See the <a href="extsearch.html">manual</a> for details.
+<li>   Added USE_MDFILE_AS_MAINPAGE config option to select a markdown page to
+       be used as the main page.
+<li>   id 630645: This patch (contributed by Albert) adds support for 
+       simple logic expressions for \cond, \if, and friends, i.e. you can do
+       \if (SOME_SECTION_NAME &amp;&amp; (!THIS_ALTERNATIVE || THAT_ALTERNATIVE))
+<li>   id 684152: Patch (contributed by Albert) adds a new configuration 
+       option MATHJAX_FORMAT to select the MathJax output format. Options are
+       HTML-CSS, NativeMML, or SVG.
+</ul>
+<h3>Bug fixes</h3>
+<ul>
+<li>   id 670853: Fixed compile issues with 0 to QCString cast for 
+       old compilers.
+<li>   id 678139: A class A deriving from another class B inside a namespace
+       not known to doxygen, caused class B to appear in the global scope.
+<li>   id 681209: Fixed problem processing .bib files when they were located
+       in a path containing spaces.
+<li>   id 681830: Using \addindex in a page will now produce a link to the
+       word, instead of the start of the page.
+<li>   id 681831: The TREEVIEW_WIDTH option did not have any effect.
+<li>   id 681898: Jumping from a level 3 section to a level 1 section did
+       not appear correctly in the page TOC.
+<li>   id 681976: C++11: Improved handling of noexcept expressions, e.g.:
+       <code>Test() noexcept ( noexcept(T::T()) ) = default;</code>
+<li>   id 682048: Improved SIGINT handling when running multiple dot instances.
+<li>   id 682602: Fixed problem processing .bib files when using a non default
+       output directory.
+<li>   id 682713: Comment for IDL_PROPERTY_SUPPORT in the config file template 
+       did not have line wrapping.
+<li>   id 682728: Setting SHOW_FILES to NO prevented call graphs from being
+       generated.
+<li>   id 682740: Fortran: In initialization statement the "=" was missing
+<li>   id 683284: Fortran: ALIASes where not replaced in !! and !&lt; comments.
+<li>   id 683976: Added meta tag "generator" to HTML output (thanks to
+       Albert for the patch).
+<li>   id 684781: Sections of the main page did not appear in the 
+       navigation tree until the main page had sub pages.
+       Also fixed bug in treeview that caused mainpage with title and
+       sections to appear at the same level as the sections.
+<li>   id 685125: Doxygen could select the wrong overloaded method when 
+       the only difference in parameter types was the template type of 
+       a typedef.
+<li>   id 685181: Inheriting member documentation did not work in combination
+       with Java interfaces.
+<li>   id 685623: Enum values did not appear in the detailed documentation 
+       when using C++11 style enums.
+<li>   id 685879: Even though HIDE_UNDOC_MEMBERS was enabled, the navigation
+       still showed undocumented members.
+<li>   id 685940: Fixed back button behaviour when using the navigation tree.
+<li>   id 686284: Added anchors to refs in the index.qhp TOC.
+<li>   id 686826: Added XML declaration to index.qhp TOC.
+<li>   id 686956: When a class and its base class has the same nested class,
+       the collaboration diagram could point to the wrong class.
+<li>   id 686983: Comments inside a function macro parameter appeared before 
+       the expanded macro, instead of being treated as part of the parameter.
+<li>   id 687301: Allow minus in the name of a HTML attribute.
+<li>   id 687572: Code fragments were wrapped too early in the latex output.
+<li>   id 688226: Fixed Qt version number in ./configure --help text.
+<li>   id 688463: Included patch to prevent processing identifiers starting
+       with _ or __ as markdown.
+<li>   id 688531: Horizontal ruler inside paragraph caused missing &lt;/p&gt;
+<li>   id 688542: Using "usergroup" in the layout.xml caused missing &lt;div&gt;
+<li>   id 688739: Fixed problem with user defined entries in the eclipse help
+       index (thanks to Rene Papenhoven for the fix).
+<li>   id 688647: Fixed problem parsing initializer list with C++11 style
+       uniform types.
+<li>   id 689341: \if around list item preceded by whitespace caused wrong
+       list in the output. 
+<li>   id 689461: Correct link in documentation of SIP_SUPPORT option.
+<li>   id 689720: Fixed bug that could prevent refman.tex from being generated.
+<li>   id 689833: Fixed missing space in Chinese translation.
+<li>   id 690093: Files added via HTML_EXTRA_STYLESHEET did not correct refer 
+       to files that where placed in a subdirectory.
+<li>   id 690190: Searching for multibyte characters did not work with the 
+       server based search engine.
+<li>   id 690250: Fixed case where line numbers got out of sync with the code.
+<li>   id 690341: First member of an anonymous C++11 style enum was not shown
+       properly.
+<li>   id 690385: Fixed case where _'s where falsely converted to Markdown 
+       emphasis.
+<li>   id 690403: Title not used when \ref'ing to a \section imported via 
+       a tag file.
+<li>   id 690418: Behavior of @cond was accidentally reversed by new expression
+       parser.
+<li>   id 690602: Fixed problems handling @cond inside /// comments.
+<li>   id 690629: Fixed case where doxygen would during preprocessing.
+<li>   id 690685: A file specified using HTML_EXTRA_STYLEHSHEET did not end
+       up in the Qt Help index.
+<li>   Improved the way enum's are rendered in the HTML output.
+<li>   When inlining structs (INLINE_SIMPLE_STRUCTS=YES) a &lt;p&gt; was missing
+       for members with a detailed description, causing invalid XHTML.
+<li>   Fixed problem loading the navigation tree when using .xhtml as the
+       file extension.
+<li>   The navigation tree was not always correctly positioned upon initial
+       load when using Chrome.
+<li>   HTML Navigation tree showed static members even when EXTRACT_STATIC was
+       set to NO.
+<li>   Same word could appear multiple times in the match list for an entry 
+       in the search results when using server based search.
+</ul>
+\endhtmlonly
+\subsection log_1_8_2 Release 1.8.2
+\htmlonly
+<a name="1.8.2"></a>
+<b>(release date 11-08-2012)</b>
+<h3>Changes</h3>
+<ul>
+<li>   Using a fenched block (~~~~) in Markdown without explicit extension will 
+       now be interpreted as a @code..@endcode block instead 
+       of @verbatim..@endverbatim.
+<li>   Classes inheriting from an class that is outside the scope of doxygen
+       are still shown in diagrams. This does not hold for usage relations.
+</ul>
+<h3>New features</h3>
+<ul>
+<li>   Added support for C++11:
+       <ul>
+       <li> strongly typed enums, e.g.:
+            <pre>enum class E</pre>
+       <li> enums with explicit type, e.g.: 
+            <pre>enum E : unsigned int { ... }</pre>
+       <li> id 678097: added support for final keyword on classes and methods.
+       <li> support for override keyword for methods.
+       <li> <code>nullptr</code> is new a type keyword in code fragments.
+       <li> support for variables with initializer lists, 
+         e.g.: <pre>const int var {10};</pre>
+       <li> support for trailing return types, 
+         e.g.: <pre>auto foo() -&gt; Bar;</pre>
+       <li> id 672372: added support for template aliases, 
+         e.g.: <pre>template&lt;typename T&gt; using A = B&lt;T&gt;;</pre>
+       <li> support for C++11 variadic templates, 
+         e.g.: <pre>template&lt;typename... Values&gt; class C;</pre>
+       <li> support for documenting template class declarations.
+       <li> id 680098: <code>static_assert(...);</code> inside a class is now ignored.
+       <li> id 679740: Add support parameters with default lambda functions, 
+         e.g.:  <pre>int foo(int i, std::function&lt;int(int)&gt; f = [](int x) -&gt; int { return x / 2; })</pre>
+       <li> default initializers for non-static data members, 
+         e.g.:  <pre>class C { public: int x = 4; int y {6}; int z = y*func(); };</pre>
+       <li> support for decltype as a way selecting a type for a variable, 
+         e.g.: <pre>int x; decltype(x) y;</pre>
+       <li> support for new string literals, 
+         e.g.  <pre>u8"utf8", u"utf-16", U"utf-32", L"wchar"</pre>
+       <li> support for raw string literals (with and without user defined 
+         delimiter), 
+         e.g.  <pre>R"(some"thing)", u8R"raw(some)"thing)raw"</pre>
+       <li> support for explictly deleted and defaulted special members 
+         (<code>=default</code> and <code>=delete</code>).
+       </ul>
+<li>   Made several improvements to the way Objective-C categories and protocols 
+       are handled:
+       <ul>
+       <li> Class extensions are now treated as part of the class, whereas 
+         categories are listed separately.
+       <li> Fixed parse problem where category had a { } section.
+       <li> Fixed parse problem for categories that implemented protocols.
+       <li> Fixed render bug for protocols in class diagrams.
+       <li> Attributes with the same name as a method are now no longer matched.
+       <li> Internal properties are now also marked with [implementation]
+       <li> Members of categories are shown in the class they extend as well, and 
+         cross reference links are made between these members.
+       <li> Class extension implementing protocols are now shown as protocols
+         inherited by the class itself, including the "Implemented by" relation.
+       </ul>
+<li>   Added option HTML_EXTRA_STYLESHEET which allows adding an additional
+       stylesheet without completely replacing doxygen.css.
+<li>   Added option AUTOLINK_SUPPORT which can be used to enable/disable
+       autolinking globally.
+<li>   Included language updates for Czech, Spanish, Greek, Slovak, and 
+       Esparanto.
+</ul>
+<h3>Bug fixes</h3>
+<ul>
+<li>   Fixed render glitch where template member of a base class was not
+       properly hidden in the derived class.
+<li>   Privately nested classes no longer appear in the declaration section 
+       of their parent if EXTRACT_PRIVATE is disabled.
+<li>   In the declaration section the separator line was in between the
+       member and its brief description.
+<li>   Fixed a couple of compiler warning with the new XCode 4.4 compiler.
+<li>   Added compilation support for Mountain Lion (Mac OS X 10.8).
+<li>   id 679631: Nested namespaces did not appear in the namespace list if the 
+       parent namespace was undocumented.
+<li>   id 680227: Fixed some spelling errors in the code comments.
+<li>   id 680398: Fortran:  comma at begin of argument list description in 
+       case of implicit type
+<li>   id 680405: Fortran: Entities on line with USE, ONLY were not hyperlinked 
+       in code.
+<li>   id 680408: Fortran: handle carriage return in non terminated strings.
+<li>   id 680492: Using Markdown formatting in @todo/@bug/.. like descriptions
+       did not work.
+<li>   id 680575: Fixed potential crash when &lt;code&gt; appeared inside &lt;summary&gt;
+       for C# code.
+<li>   id 680697: \xrefitems of the same type are not grouped together under
+       the same heading (just like \todo and friends). 
+<li>   Fixed case where full directory path was shown even though
+       FULL_PATH_NAMES was set to NO.
+<li>   id 680709: HTML output of template-derived classes contained unescaped 
+       characters.
+<li>   id 679963: "Class Index" appeared twice in the PDF TOC, Index at the 
+       end did not appear at all.
+<li>   In a declaration no link was created when referring to a class inside 
+       an undocumented namespace imported via a tag file.
+<li>   id 681281: Make default for TAB_SIZE 4 and added remark in Markdown
+       section of the manual about the effect of TAB_SIZE on code block 
+       processing when using tabs in the comment block.
+<li>   id 681023: Project logo was not included in the Qt help output.
+<li>   id 680992: Fixed a couple of typos in the comments.
+<li>   id 681350: Fixed a problem with Markdown processing of a @code block
+       inside an indented /// style comment.
+<li>   id 679928: Disabled section level correction for Markdown pages as
+       is was confusing.
+</ul>
+\endhtmlonly
+\subsection log_1_8_1_2 Release 1.8.1.2
+\htmlonly
+<a name="1.8.1.2"></a>
+<b>(release date 12-07-2012)</b>
+<h3>Changes</h3>
+<ul>
+<li>   doxygen now strips the leading indentation shared by the lines in a 
+       @code..@endcode block.
+<li>   id 678218: Changed title of the SVG graphs from 'G' to the root node
+       of the graph.
+</ul>
+<h3>New features</h3>
+<ul>
+<li>   Added button in the navigation tree to allow enabling/disabling 
+       syncing the navigation tree with the content.
+<li>   Extended the number of HTML entities with Greek letters and other 
+       symbols (thanks to Charles Karney for the patch).
+<li>   id 663645: Added support for C++11 strongly typed enums 
+       (enum class E { ... }).
+</ul>
+<h3>Bug fixes</h3>
+<ul>
+<li>   id 590518: Added missing class member initialization to a
+       class in doxmlparser and made the library compile again.
+<li>   id 667678: Added support for Obj-C property attribute "unsafe_retained".
+<li>   id 674842,676984: Unmatched quote in a comment prevented alias expansion.
+<li>   id 676019: Fixed another case where local include path did not appear
+       correctly in the class documentation.
+<li>   id 676966: Fortran: Some keyword were not colored in the source view.
+<li>   id 676981: Fortran: Argument type was wrong type of in case of out of 
+       place !&gt; comment
+<li>   id 677935: Included patch to fix problem compiling for x86 release on
+       Windows.
+<li>   id 677992: Section without title could result in an invalid Qt Help
+       index.
+<li>   id 678022: Anonymous enum could result in an invalid Qt Help index.
+<li>   id 678102: Superfluous trailing comma in javascript 
+       prevented navigation tree to load in IE7.
+<li>   id 678177: a + at the start of a line inside a &lt;pre&gt; block, 
+       triggered the start of a list. Also -- and --- where not kept untouched 
+       inside a &lt;pre&gt; block.
+<li>   id 678180: ndash (--) appearing in a brief description could lead 
+       to invalid SVG images.
+<li>   id 678288: -- and --- inside a Markdown code block were not handled
+       properly.
+<li>   id 679331,675766: In body documentation with a different indentation then the
+       main documentation was not rendered correctly (MARKDOWN=YES).
+<li>   id 679436: Using an escaped pipe symbol in a Markdown table did not get 
+       unescaped in the output.
+<li>   id 679533: Code fragments did not appear properly in the doxygen manual.
+<li>   id 679615: Added missing delete call in a piece of debugging code.
+<li>   id 679626: Fixed some navigation issues in the manual
+<li>   Not all inherited members appeared in the "Additional inherited members"
+       list.
+<li>   Link to call after "Inherited members" was not correct when
+       CREATE_SUBDIRS was enabled.
+<li>   New VHDL diagram was not generated if the path contained spaces.
+<li>   Fixed a couple of problems handling Objective-C categories.
+</ul>
+\endhtmlonly
+\subsection log_1_8_1_1 Release 1.8.1.1
+\htmlonly
+<a name="1.8.1.1"></a>
+<b>(release date 10-06-2012)</b>
+<h3>Changes</h3>
+<ul>
+<li>   Integrated the root navigation tree in navtree.js for faster loading.
+<li>   When the navigation tree is enabled, clicking jump to a line in 
+       the source code view will now highlight the line.
+</ul>
+<h3>New features</h3>
+<ul>
+<li>   VHDL code now has a new Design Overview page (thanks for Martin Kreis
+       for the patch). Requires HAVE_DOT=YES, and DOT_IMAGE_FORMAT=svg.
+<li>   id 677678: Added support for strong and weak attributes in Objective-C
+       properties.
+</ul>
+<h3>Bug fixes</h3>
+<ul>
+<li>   id 618462: Fortran: Appearance of comments in the HTML output 
+       are now customizable via CSS again.
+<li>   id 673660: &lt;code&gt; inside a &lt;summary&gt; or &lt;remarks&gt; section is now treated
+       as @code (was already the code for C#).
+<li>   id 673921: When a comment started at indent &gt;= 4 after a /** and 
+       continued at the same indent without leading * after a blank line, 
+       the continued part appeared at as a code block when Markdown was enabled.
+<li>   id 675036: If a file was not indexed, the navigation tree became empty.
+<li>   id 676019: Include path using quotes did not work as documented.
+<li>   id 676877: @warning did not end at blank line when followed by
+       a numbered list.
+<li>   id 676902: An anonymous namespace could introduce an invalid entry in
+       the navigation list.
+<li>   id 676948: Breadcrumb navigation path had wrong links when 
+       CREATE_SUBDIRS was enabled.
+<li>   id 677315: Fixed case where function was incorrectly detected as a 
+       variable.
+<li>   id 677589: Fixed typo in the documentation of the LAYOUT_FILE option.
+<li>   id 677771: Fixed visual misalignment for first argument.
+<li>   The "arrow out" button in interactive SVG did not work when 
+       served from a web server, due to the use of an absolute path.
+<li>   If a declation was too wide for a page, the content in HTML spilled 
+       over the boundary of its box, which looked ugly.
+<li>   Empty lines in a code fragment were collapsed.
+<li>   Navigation tree entries of the hierarchy appeared under class index as
+       well.
+<li>   Grouped globals and enum values were not added to the navigation index.
+<li>   Inlined class were not properly shows in the navigation index.
+<li>   Documented class in undocumented namespace did not show up in 
+       class list and navigation tree.
+<li>   ALLEXTERNALS=YES did not show all external classes in the class list.
+<li>   External reference via URL did not work for new
+       "Additional Inherited Members" section + inherited from class link.
+<li>   Objective-C protocols and C# generics were not index and listed 
+       properly in the navigation tree and indices.
+<li>   Undocumented files could produce a broken link in the navigation tree.
+<li>   Additional Inherited Members could turn up empty of all members of
+       the inherited class were grouped and SUBGROUPING was set to NO.
+</ul>
+<\endhtmlonly
+\subsection log_1_8_1 Release 1.8.1
+\htmlonly
+<a name="1.8.1"></a>
+<b>(release date 19-05-2012)</b>
+<h3>Changes</h3>
+<ul>
+<li>   Changed the way indexes (Class,File,Namespace,Groups) are rendered:
+       <p>
+       There are now shown in a uniform way in the HTML output as a tree.
+       Trees can be expanded and collapsed interactively 
+       (this makes USE_INLINE_TREES obsolete). 
+       <p>
+       The class list now also shows namespaces and nested classes. 
+       The file list now also shows directories (this makes SHOW_DIRECTORIES 
+       obsolete). 
+       <p>
+       Member sections are now each rendered in a separate table.
+       This makes the HTML_ALIGN_MEMBERS option obsolete.
+       <p>
+<b>Note:</b> If you use a custom header for the HTML output (HTML_HEADER) 
+make sure you add the following:
+       <pre>
+&lt;script type="text/javascript" src="$relpath$jquery.js"&gt;&lt;/script&gt;
+&lt;script type="text/javascript" src="$relpath$dynsections.js"&gt;&lt;/script&gt;</pre>
+       Otherwise the interactivity of the trees does not work.
+       <p>
+
+<li>   Included a couple of performance improvements (thanks to Dirk Reiners)
+<li>   Changed the way member attributes (like protected, virtual, and static)
+       are rendered in the HTML output.
+<li>   Changed the look of the source code output.
+<li>   Included language updates for Chinese, Czech, German, Esperanto, 
+       Italian, Slovak, Spanish, Hungarian, and Polish.
+<li>   Syntax highlighing in source code fragments is no longer dependent
+       on LATEX_SOURCE_CODE being set to YES.
+<li>   Added natural scrolling for tablet devices (like the iPad) 
+       when using the treeview.
+<li>   For interactive SVGs the print button has been replaced by a 
+       "arrow out" button that opens the original non-interactive SVG in a 
+       new window for easy printing or saving. 
+<li>   id 661499: Long names are now wrapped in the dot nodes to avoid
+       very wide graphs.
+</ul>
+<h3>New features</h3>
+<ul>
+<li>   id 666527: Added support for &lt;inheritdoc/&gt; C# XML command
+       (thanks to John Werner for the patch).
+<li>   id 670965, Added support for resolving environment variables of the
+       form $(PROGRAMFILES(X86)) inside the config file
+<li>   Doxygen now shows Objective-C properties in collaboration diagrams
+       (thanks to Sven Weidauer for the patch).
+<li>   Added ability to search for group or page titles.
+<li>   Inherited class members are now shown as expandable sections in the
+       member overview (default is collapsed). Each section is rendered as
+       a table. 
+<li>   id 674349: Included build support for NetBSD.
+<li>   A -- will now be rendered as an 'en dash', similarly, --- will produce an
+       mdash.
+</ul>
+<h3>Bug fixes</h3>
+<ul>
+<li>   id 523156: Fortran: Prefix of routines got stripped.
+<li>   id 666088: Include VHDL patch (thanks to Martin Kreis).
+<li>   id 670235: Fixed include guard detection problem when using
+       #pragma once
+<li>   id 670805: A numbered list (1. 2. 3.) where each list item ended with 
+       an empty line is no longer treated as a set of separate lists (all 
+       starting with 1.).
+<li>   id 670889: Java: last enum value did not appear in the output unless it was
+       followed by a comma.
+<li>   id 671023, 671312: Regression: Autolist items starting on a new paragraph 
+       at indent level larger than 0 were not processed correctly. 
+<li>   id 671076: Sections could be missing from the navigation tree in 
+       some situations.
+<li>   id 671158: @tableofcontents did not work for the main page (@mainpage)
+<li>   id 671159: Sections in a separate markdown page did not appear in the 
+       table of contents.
+<li>   id 671166: Fortran: Fixed problem causing call/caller graphs not to be
+       generated.
+<li>   id 671171: RPM spec file was updated to make it work with RHEL 6.2
+       (thanks to Peter Klotz for the patch)
+<li>   id 671240: Corrected line number of error message reported for
+       pages.
+<li>   id 671291: C# regression: enum values where not shown in the docs.
+<li>   id 671395: When #some_member appeared at the start of a line it was
+       seen as a level one header instead of a link to a member when
+       Markdown processing was enable. Now at least one space is required
+       after the # to make it a header.
+<li>   id 671426: Fixed case where doxygen could crash when a section and
+       subsection had the same label.
+<li>   id 671591: docset creating could fail due to invalid Nodes.xml
+<li>   id 671702: Using \internal in a group or member did not hide it
+       from the navigation tree if there was no documentation.
+<li>   id 671709: Backticks in C# comments did not appear as inline 
+       fragments, like was the case for other languages.
+<li>   id 672119: PHP: defines are now shown as constants rather than enums.
+<li>   id 672662: File with .md or .markdown extension were not included
+       with the default setting of FILE_PATTERNS.
+<li>   id 672366: mailto style URLs did not work correctly in combination with
+       CREATE_SUBDIRS = YES.
+<li>   id 672472: Removed bogus &lt;/b&gt; when using @par.
+<li>   id 672475: Added "warning:" prefix to "missing \endcode" message.
+<li>   id 672479: Doxygen comments after a macro definition were not
+       removed in the source browser view.
+<li>   id 672526: Removed black line in front of custom paragraphs.
+<li>   id 672536: PHP: use keyword was not handled correctly when importing
+       classes from another namespace.
+<li>   id 672620: Switched to using "Macro" in the output instead of "Define".
+<li>   id 672656: Using ![caption](filename.png) did not work correctly for 
+       local images pointed to with IMAGE_PATH.
+<li>   id 673045: A block of ///'s inside a verbatim block inside a .md 
+       file was replaced by /** ..  */
+<li>   id 673066: Doxygen now skips scanning files in directories starting with
+       a dot (e.g. .svn).
+<li>   id 673219: Included patch by Ryan Schmidt to make the Mac versions
+       in qglobal.h match that of Apple header files.
+<li>   id 673870: Added C++11 classes when BUILTIN_STL_SUPPORT is enabled.
+<li>   id 673983: Using a backslash in a section cause 026E30F to appear in the
+       latex TOC.
+<li>   id 674563: Fortran: case sensitiveness for routines and functions 
+       did not work
+<li>   id 674583: Fortran: continuation by ampersand not placed in code output.
+<li>   id 675757: Fixed indenting issue after the end of a markdown code block
+       inside a list.
+<li>   id 676116: Use new index style for page index.
+<li>   id 676294: Fixed LaTeX error when backslash appeared in a hyperlinked
+       code fragment.
+<li>   Tag files had wrong character encoding set in the header.
+<li>   C# in/out did not appear in generics using covariance or contravariance.
+<li>   When marker of an alias appeared at the end of the alias text it was
+       not expanded.
+<li>   Aliases did not work in Markdown files.
+<li>   Fixed some problems with the navigation tree for IE9 and Opera.
+<li>   Included patch by Jake Colman to make the configgen.py work with older
+       Python version such as 2.4.3.
+<li>   Fixed problem parsing \code{.py}...\endcode 
+<li>   UML_LIMIT_NUM_FIELDS did not work correctly in all cases.
+<li>   Setting SORT_GROUP_NAMES to YES, had no effect on child groups within
+       a group.
+</ul>
+\endhtmlonly
+\subsection log_1_8_0 Release 1.8.0
+\htmlonly
+<a name="1.8.0"></a>
+<b>(release date 25-02-2012)</b>
+<h3>Changes</h3>
+<ul>
+<li>   Auto list items can now consist of multiple paragraphs.
+       The indentation of the (first line) of a new paragraph detemines
+       to which list item the paragraph belongs or if it marks the end of the
+       list. 
+<li>   When UML_LOOK is enabled, relations shown on the edge of a graph
+       are not shown as attributes (conform to the UML notation)
+<li>   Updated the manual and improved the look.
+<li>   Made the contents in the navigation tree more consistent for
+       groups, pages with subpages, and grouped subpages.
+<li>   id 669079: Latex: made the margins of latex page layout smaller using 
+       the geometry package.
+<li>   The tool doxytag has been declared obsolete and is removed
+       (it wasn't working properly anyway). Same goes for the installdox 
+       script.
+<li>   Updated the copyright in source code and doxywizard "about" to 2012.
+<li>   id 668008: HTML version of the manual now has the treeview enabled
+       for easier navigation.
+</ul>
+<h3>New features</h3>
+<ul>
+<li>   Added support for 
+       <a href="http://daringfireball.net/projects/markdown/">Markdown</a>
+       formatting.
+       This is enabled by default, but can be disabled by 
+       setting MARKDOWN_SUPPORT to NO. When enabled the following is 
+       processed differently:
+       <ul>
+       <li> tabs are converted to spaces according to TAB_SIZE.
+       <li> blockquotes are created for lines that start with one or more &gt;'s
+            (amount of &gt;'s detemine the indentation level).
+       <li> emphasis using *emphasize this* or _emphasis this_ or
+            strong emphasis using **emphasis this**. Unlike classic
+            Markdown 'some_great_indentifier' is not touched.
+       <li> code spans can be created using back-ticks, i.e. `here's an example`
+       <li> Using three or more -'s or *'s alone on a line with only spaces
+            will produce a horizontal ruler.
+       <li> A header can be created by putting a ===== (for h1) or ----- (for h2)
+            on the next line or by using 1 to 6 #'s at the start of a line
+            for h1-h6.
+       <li> auto lists item can also start with + or * instead of only -
+       <li> ordered lists can be made using 1. 2. ... labels.
+       <li> verbatim blocks can be produced by indenting 4 additional spaces.
+            Note that doxygen uses a relative indent of 4 spaces, not an
+            absolute indent like Markdown does. 
+       <li> Markdown style hyperlinks and hyperlink references.
+       <li> Simple tables can be created using the <a href="http://michelf.com/projects/php-markdown/extra/#table">Markdown Extra format</a>.
+       <li> <a href="http://freewisdom.org/projects/python-markdown/Fenced_Code_Blocks">Fenced code blocks</a> are also supported, include language selection.
+       <li> files with extension .md or .markdown are converted to related pages.
+       </ul>
+       See the section about Markdown support in the manual for details.
+<li>   It is now possible to add user defined tabs or groups of tabs to
+       the navigation menu using the layout file (see the section of the manual
+       about customizing the output for details).
+<li>   Added new command \tableofcontents (or [TOC] if you prefer Markdown)
+       which can be used in a related page with sections to produce a 
+       table of contents at the top of the HTML page (for other formats the
+       command has no effect).
+<li>   When using SVG images and INTERACTIVE_SVG is enabled, a print icon
+       will be visible along with the navigation controls to facilitate 
+       printing of the part of the graph that is visible on screen.
+<li>   Added obfuscation of email addresses for the HTML output to make
+       email harvesting more difficult.
+<li>   Added build targets for 64 bit Windows (thanks to Vladimir Simonov).
+       The installer script is also updated to install a 64 bit version of
+       doxygen on 64 bit systems and the 32 bit version on 32 bit systems.
+<li>   Added support for using the HTML tag &lt;blockquote&gt; in comments.
+<li>   Included patch by Gauthier Haderer that fixes some issues with the
+       dbus XML parser.
+<li>   Added support for Markdown style fenced code blocks.
+<li>   Added option to @code command to force parsing and syntax highlighting
+       according to a particular language.
+<li>   Section of pages are now added to the navigation index.
+<li>   Added support for cell alignment and table header shading in
+       LaTeX and RTF output. 
+<li>   Added -d filteroutput option to show the output of an input filter
+       (thanks to Albert for the patch).
+<li>   id 668010: Latex: for Windows doxygen new generates a makepdf.bat
+       file in the latex output dir to create the latex documentation.
+</ul>
+<h3>Bug fixes</h3>
+<ul>
+<li>   id 498703: Fixed encoding issue in CHM index file for group titles.
+<li>   id 510975: FORTRAN: Keywords like .GT. recognized as symbols for 
+       cross ref.
+<li>   id 511906, 581303, 622749: \copydoc did copy the brief description 
+       into the detailed section, causing a difference between the original  
+       and the copy.
+<li>   id 555327: Using @ref for an example file, caused it to appear as
+       file::ext.
+<li>   id 567494: Fortran: Included patch for blockdata sub-programs.
+<li>   id 628417: Fortran: doxygen filter, preparsing fixed form of null
+<li>   id 662286: TCL: Inlcuded patch to fixed UTF-8 support.
+<li>   id 662289: TCL: Included patch to prevent ##### from appearing in the
+       output.
+<li>   id 646319: Using a file name with path for HTML_STYLESHEET caused the
+       path to appear in the HTML output.
+<li>   id 664826: Fixed one more problem with include guard detection.
+<li>   id 665629: Fixed parse problem when a #define appeared inside an enum.
+<li>   id 665855: Fixed problem parsing C++ template specialization of the
+       form A&lt;func(T*)&gt; such as used in boost::signal2 types.
+<li>   id 666047: A &lt;/p&gt; followed by an htmlonly..endhtmlonly section
+       caused invalid XHTML output.
+<li>   id 666085: Fixed include handling in case the include guard was 
+       documented.
+<li>   id 666124: Fixed problem loading the navigation tree in IE8 when
+       serving pages via a web server.
+<li>   id 666337: Included patch to avoid hypenation hints in front of the 
+       first captial in a word.
+<li>   id 666568: When SHOW_FILES was NO, a grouped function did not appear
+       in the javascript based search index.
+<li>   id 666909: \copybrief introduced extra spacing in the HTML output.
+<li>   id 666986: Fixed case where search engine specific code appeared
+       twice in the HTML output.
+<li>   id 666993: Fixed bug in the generated makefile causing index not
+       to be generated when using pdflatex.
+<li>   id 667020: HTML output for example pages was not well-formed.
+<li>   id 667192: Include statements in latex output where placed all on 
+       one line in the LaTeX output.
+<li>   id 667835: PHP: Fixed problem handling heredoc blocks
+<li>   id 667844: For aliases with a single argument it is no longer required 
+       to escape commas that appear inside the argument text.
+<li>   id 668037: Latex: tables can now span multiple pages by using the xtab
+       package.
+<li>   id 668218: Doxygen will ignore the common prefix shared by all
+       directories when computing a names for the directory's output files.
+       This will make the names of the output more stable.
+<li>   id 668519: Added missing newline in man page output.
+<li>   id 669071, 669072: Fixed parse problem for Q_PROPERTY when a template
+       with a namespaced type was used.
+<li>   id 669078: Included patch which changes MATHJAX_RELPATH to use the
+       content delivery network by default.
+<li>   id 669138: Fortran: Fixed problem handling multiple definition 
+       statements on one line.
+<li>   id 669406: Using -d Preprocessor now also works when QUIET is YES.
+<li>   id 669434: Latex: citations where only generated properly if the
+       bib files specified via CITE_BIB_FILES did not have a path.
+<li>   id 669758: Tcl: Same function in multiple Tcl namespaces not added.
+<li>   id 670289: Fixed case where doxygen would not correctly detect
+       &gt;&gt; as a termination of a nested template.
+<li>   id 670571: subpages generate empty pages in latex/rtf output and
+       broken links when SHORT_NAME was set to YES.
+<li>   Included VHDL fixes provided by Martin Kreis.
+<li>   The word "dummy" wrongly appeared before the first parameter type in 
+       the LaTeX output for an Objective-C method.
+<li>   Fixed several small glitches in the tree view javascript code.
+<li>   Included a patch by Vladimir Simonov to make it possible to compile
+       doxygen with Visual Studio 2005.
+<li>   Fixed some typos in the manual (thanks Albert).
+</ul>
+\endhtmlonly
+\section log_1_7 Release 1.7
+\htmlonly
+<a name="1.7.6.1"></a>
+<h1>Doxygen Release 1.7.6.1</h1>
+<h2>(release date 10-12-2011)</h2>
+<h3>Changes</h3>
+<ul>
+<li>   Doxygen now reports its cache usage (for the symbol and the 
+       lookup cache) at the end of a run (if QUIET=NO), and recommends 
+       settings for SYMBOL_CACHE_SIZE and LOOKUP_CACHE_SIZE for your 
+       project if either cache is too small.
+</ul>
+<h3>New features</h3>
+<ul>
+<li>   Added new option LOOKUP_CACHE_SIZE to control the internal cache
+       doxygen uses to find symbols given their name and a context.
+<li>   Python: added support for @staticmethod
+</ul>
+<h3>Bug fixes</h3>
+<ul>
+<li>   Python: scopes are now shown with . instead of ::
+<li>   id 665313: Space before @if was not preserved, causing problems
+       with inline @if .. @endif constructs.
+<li>   id 665583: Fixed XHTML validity problem when using mscgen graphs.
+<li>   id 665641: Fixed XHTML validity problem when GENERATE_TREEVIEW was
+       disabled.
+<li>   id 665720: Included patch to fix hang issue when non-empty 
+       INCLUDE_PATH was used.
+<li>   id 665778: Fixed parse issue when a comma appeared as part of an 
+       enum's value.
+</ul>
+<a name="1.7.6"></a>
+<h1>Doxygen Release 1.7.6</h1>
+<h2>(release date 03-12-2011)</h2>
+<h3>Changes</h3>
+<ul>
+<li>   To improve the performance of loading the navigation tree,
+       the data is now split into multiple javascript files which
+       are loaded dynamically.
+<li>   The selected member is now briefly highlighted in the HTML output
+       (when GENERATE_TREEVIEW is enabled).
+<li>   The navigation tree (GENERATE_TREEVIEW) now shows the same information
+       as the index.
+<li>   The navindex section of layout now also controls what is shown in
+       the navigation tree.
+<li>   Improved HTML output support for IE9.
+<li>   Included redesigned VHDL parser (thanks to Martin Kreis for the patch)
+<li>   When a class/structs has many (&gt;15) members of the same type, only 
+       the first 10 are shown in the UML diagram.  
+<li>   Made the output of the javascript based search engine more compact.
+</ul>
+<h3>New features</h3>
+<ul>
+<li>   Update of the French translation.
+<li>   id 607305: Added support for PHP heredoc and nowdoc constructs.
+<li>   Added support for cross-referencing in case of operator-&gt; overloading.
+       This includes support for std::auto_ptr,std::smart_ptr,std::unique_ptr 
+       and std::weak_ptr when BUILTIN_STL_SUPPORT is enabled.
+</ul>
+<h3>Bug fixes</h3>
+<ul>
+<li>   Regression: some information was no longer available for a class, 
+       due to accidental deletion of a code block.
+<li>   Regression: fixed matching problem in the code parser.
+<li>   Included fixes for TCL to support commands with \ and command 
+       definitions preceded by whitespace (thanks to Rene Zaumseil)
+<li>   When using "static int a,b" variable "b" incorrectly appeared in the 
+       output even though EXTRACT_STATIC was set to NO.
+<li>   id 521717: .spec file was only updated after running ./configure
+<li>   id 656642: Fixed potential crash when using doxygen for large projects.
+<li>   id 656878: Fixed problem running bibtex with \cite command on Windows.
+<li>   id 657152: Fixed constant expression evaluation error in the 
+       preprocessor.
+<li>   id 652277: Removed bogus ' from the man page output.
+<li>   id 659244: Quotes in the brief description could appear unescaped in 
+       the tooltip.
+<li>   id 641336: #includes with ../ were not always processed correctly.
+<li>   Fixed potential crash when INLINE_GROUPED_CLASSES and INLINE_SIMPLE_STRUCTS 
+       are set to YES.
+<li>   id 658896: Fixed preprocessor problem handling #defines whose value was
+       a constant string containing ///.
+<li>   id 660332: Using a \ at the end of a comment line could cause 
+       parsing problems for C# as the \ was treated as a line continuation.
+<li>   id 658033: Fixed parser problem when using multiple member groups 
+       inside a macro definition.
+<li>   id 503239: Fixed several issues related to \cite handling.
+<li>   id 658587: Improved the way macro definitions are collected.
+<li>   id 660501: Fixed LaTeX error when using \name with a description.
+<li>   id 661292: The documentation for \mainpage incorrectly mentioned that
+       one has to use \ref main in case GENERATE_TREEVIEW was set to YES, which
+       is no longer the case.
+<li>   id 659096: Nested aliases definitions where not always expanded properly
+       (regression w.r.t version 1.7.4)
+<li>   id 658038: Fixed preprocessor problem where the @ character inside a
+       macro definition could appear as @@.
+<li>   id 658646: Fixed problem running mscgen for LaTeX and RTF output.
+<li>   id 661723: Using ClassName%'s did not work anymore, and also
+       ClassName's wasn't autolinked.
+<li>   id 662044: Fixed potential printing of null pointer when using
+       a version filter that returned blanks.
+<li>   id 625518: Fortran: first problem where subroutine using results 
+       variable appeared as a function.
+<li>   id 654153: If an URL appeared at the end of a sentence, the period
+       was included in the URL.
+<li>   id 656560: Fortran: Added support for the Double Complex type.
+<li>   id 663640: Included workaround for Solaris CC issue in index.cpp
+<li>   id 662190: Included patch to fix some TCL issues and add the TCL_SUBST 
+       configuration option.
+<li>   id 661672: Fortran: Added support for ALIAS expansion in comment blocks.
+<li>   id 663101: Fixed case where a macro was not corrected found in the header
+       file when it could only be found via INCLUDE_PATH.
+<li>   id 664718: using multiple &lt;para&gt;'s inside a &lt;summary&gt; block caused 
+       text to be joined without spacing.
+<li>   id 656556: Java enums are now parsed as classes. 
+<li>   id 664826: Fixed problem in the preprocessor regarding the handling 
+       of include guards.
+<li>   id 664893: Fixed typo in the docs for EXCLUDE_SYMLINKS.
+<li>   id 665466: Using a relative URL with &lt;a href&gt; did not work when
+       CREATE_SUBDIRS was enabled.
+<li>   id 665464: Using an absolute URL with &lt;img&gt; did not work when
+       CREATE_SUBDIRS was enabled.
+</ul>
+<a name="1.7.5.1"></a>
+<h1>Doxygen Release 1.7.5.1</h1>
+<h2>(release date 21-08-2011)</h2>
+<h3>New features</h3>
+<ul>
+<li>Update of the French translation.
+</ul>
+<h3>Bug fixes</h3>
+<ul>
+<li>id 521717: .spec file was only updated after running ./configure
+<li>id 656642: Fixed potential crash when using doxygen for large projects.
+<li>id 656878: Fixed problem running bibtex with \cite command on Windows.
+<li>Regression: some information was no longer available for a class, 
+    due to accidental deletion of a code block.
+<li>Regression: fixed matching problem in the code parser.
+</ul>
+<a name="1.7.5"></a>
+<h1>Doxygen Release 1.7.5</h1>
+<h2>(release date 14-08-2011)</h2>
+<h3>Changes</h3>
+<ul>
+<li>   id 641904: Function in the call graphs are now shown based on first 
+       appearance rather then alphabetical order.
+<li>   id 616213: When customizing the HTML header $title now only generates
+       the title excluding the project name (which can still be added using
+       $projectname)
+<li>   Improved the look of the class index: all items now have equal spacing.
+</ul>
+<h3>New features</h3>
+<ul>
+<li>   New option INTERACTIVE_SVG which when set to YES in combination
+       with DOT_IMAGE_FORMAT=svg will make doxygen
+       generate interactive SVG diagrams that support zooming and 
+       panning via the mouse (only for large graphs). 
+<li>   Added support for the Tcl programming language 
+       (thanks to Rene Zaumseil and Samuel Bentley for the patch).
+<li>   Added @copyright command.
+<li>   added option MATHJAX_EXTENSIONS to provide additional extensions for
+       MathJax (thanks to David Munger for the patch).
+<li>   added option INLINE_SIMPLE_STRUCTS which when enabled shows the fields
+       of simple classes and structs (with only public data fields) as a table
+       and inline in context (file/group/namespace/class) provided this context 
+       is documented.
+<li>   When using the server based search engine (SEARCHENGINE=YES and
+       SERVER_BASED_SEARCH=YES) doxygen now advertises a opensearch provider
+       for your project, that allows integrating the search directly in
+       the search field of the browser (thanks to Phil Lello for the patch).
+<li>   id 503239: Added new option CITE_BIB_FILES and LATEX_BIB_STYLE and a new 
+       command \cite, allowing you to make references to literature (as defined 
+       in one or more .bib files). This also works for output formats other 
+       than LaTeX. The tool bibtex is required for this to work though. Thanks
+       to David Munger for the initial patch upon which this feature is based.
+<li>   PHP namespaces are now shown as A\B in the output.
+<li>   Added new \snippet command that can be used to include marked 
+       sections from a source file. See 
+       http://www.doxygen.org/commands.html#cmdsnippet for more info.
+<li>   Added translation support for Armenian, thank to Armen Tangamyan.
+       and included translation updates for a number of languages.
+</ul>
+<h3>Bug fixes</h3>
+<ul>
+<li>   Fixed a couple of potential race conditions found by Helgrind while 
+       running dot from multiple threads.
+<li>   Graphs did not appear when enabling both INTERACTIVE_SVG and 
+       HTML_DYNAMIC_SECTIONS.
+<li>   PDFs generated by newer versions of dot (i.e. 2.28) did not appear 
+       in the output, because doxygen failed to extract the bounding box.
+<li>   Improved call graph and cross-reference support for Python.
+<li>   INTERACTIVE_SVG now also works with IE9 if the html file extension is
+       set to xhtml.
+<li>   Fixed several cases where the LaTeX output could produce too long
+       lines.
+<li>   id 318061: Putting two functions in the same group that only
+       different in the number of template arguments did not work.
+<li>   id 437346,564614: Fixed proper encoding of multibyte output in RTF
+       depending on the code page (thanks to Hirao for the patch).
+<li>   id 521717: The .spec file in the source distribution did not get
+       updated to the latest version.
+<li>   id 521861: Fortran: Continuation character was not recognised in 
+       fixed format code.
+<li>   id 522496: Fortran: @param checking was not case insensitive.
+<li>   id 560105: Fixed problem combining @cond with preprocessor directives.
+<li>   id 577359: Using "struct A : C, D {};" showed a private inheritance
+       relation for D.
+<li>   id 584194: Some links to typedef where pointing to the typedef'ed
+       class instead. 
+<li>   id 619560: Anonymous enums caused an invalid entry in the LaTeX TOC.
+<li>   id 622935: Deriving from an unknown template class could cause the
+       class to appear with a -g postfix in C# 
+<li>   id 625731: Fortran: Fixed issue handling private subroutines.
+<li>   id 632946: LaTeX now starts a new page when starting a new module.
+<li>   id 634837: Fortran: Prefix of function was overwritten and the word 
+       'function' not specified.
+<li>   id 637099: Fortran: Included fix for using collaboration diagrams.
+<li>   id 642468: Added PHP support for namespace with curly braces.
+<li>   id 643219: Fortran: Improved handling of semicolons.
+<li>   id 643617: Fortran: Added support for "type is".
+<li>   id 643944: A macro added to a group appeared twice in the group 
+       documentation if was also made related to a class using \relates.
+<li>   id 646321: Fixed problem were the search box was missing when using
+       a custom HTML header.
+<li>   id 646447: Fixed unterminated img tab in the XHTML output.
+<li>   id 646463: Fixed problem handling MSCFILE_DIRS option with multiple
+       paths.
+<li>   id 646533: Included patch to sort overloaded members by appearance in
+       the code.
+<li>   id 646747,646879: Putting an autolist inside a @todo, @bug or similar
+       section did not work anymore.
+<li>   id 646922: Referring to a logo with a relative path, caused 
+       a broken image target when using a custom HTML header.
+<li>   id 647499: Fixed HTML rendering problem on older browsers when 
+       GENERATE_TREEVIEW was enabled.
+<li>   id 647768: Linking to a section on the main page could result in a
+       broken link when GENERATE_TREEVIEW was enabled.
+<li>   id 647889: Fixed invalid warning when using @deparated method with
+       default values for parameters.
+<li>   id 648302: A function made related using @relates could end up in
+       the wrong class if there was already a method with a matching
+       argument list in that other class.
+<li>   id 649103: Return types containing multiple *'s ended up in the
+       output with only one * in some cases.
+<li>   id 650397: Fixed problem with alias substitution if the alias had
+       more then 9 parameters.
+<li>   id 650430: For nested anonymous structs @xx markers could appear in
+       the output.
+<li>   id 650463: Added compilation support for MacOSX 10.7 (aka Lion).
+<li>   id 650958: Fixed issue printing HTML pages when the
+       GENERATE_TREEVIEW option is set to YES.
+<li>   id 651611: Fixed broken link to an undocumented namespace.
+<li>   id 652138: Fixed potential crash while parsing Fortran code.
+<li>   id 652188: Fixed problem parsing comment which included 
+       an unterminated alias within quotes (i.e. "\word{")
+<li>   id 652277: Lines starting with . did not appear in the man page output.
+<li>   id 652389: Fortran: Fixed text is detailed function section.
+<li>   id 652396: When enabling INTERACTIVE_SVG wide graphs are now also
+       fit to the screen width.
+<li>   id 652695: Added missing space between parameter type and name in 
+       the RTF output.
+<li>   id 652741: Use background-color instead of background in doxygen.css.
+<li>   id 653344: Fixed potential segfault while creating man pages.
+<li>   id 653666: Fortran: add a space to "type" in argument list.
+<li>   id 653801: Fixed problem handling include guard when multiple 
+       blocks guarded by the same guard were used in a header file. 
+<li>   id 653963: Fortran: Unified handling of @params at various places.
+<li>   id 654108: make clean failed on a system without qmake.
+<li>   id 654244: Fixed compile issue for HP Itanium.
+<li>   id 654779: Fortran: Interface was seen as a class with constructor / 
+       destructor.
+<li>   id 654869: Using the word "property" as a type in C caused wrong 
+       results.
+<li>   id 654866: Fortran: fixed issue parsing function type that looked like
+       C function pointers.
+<li>   id 655178: Fortran: Fixed parse issue when using variable name 
+                  starting with the word interface.
+<li>   id 655591: Improved error handling for empty html style list.
+<li>   id 655935: Fixed case where %s could end up in a warning messge.
+<li>   id 656005: Methods of Objective-C categories defined in an .m file are
+       now marked as private.
+</ul>
+<a name="1.7.4"></a>
+<h1>Doxygen Release 1.7.4</h1>
+<h2>(release date 28-03-2011)</h2>
+<h3>Changes</h3>
+<ul>
+<li>   doxygen -w html now reads the default Doxyfile even if not specified
+       explicitly
+<li>   doxygen -w html now produces a template header and footer that can
+       be used independent of the configuration options used.
+</ul>
+<h3>New features</h3>
+<ul>
+<li>   New option INLINE_GROUPED_CLASSES that when enabled shows grouped
+       classes inside the group documentation, instead of on a separate page.
+<li>   Included updates for the Italian and Russian translation.
+<li>   id 640875: Added option HTML_EXTRA_FILES which makes it easier to copy
+       additional files to the HTML output and also add them to the index files.
+<li>   id 642579: Included patch that adds new LATEX_FOOTER option to 
+       customize the end of refman.tex in the LaTeX output.
+</ul>
+<h3>Bug fixes</h3>
+<ul>
+<li>   id 140259: Jumping to a @section did not work in the RTF output.
+<li>   id 521854: Fortran: included patch for supporting multiple argument 
+                  declarations on one line.
+<li>   id 521861: Fixed problem with line continuation in Fortran.
+<li>   id 566921: %A::B now prevents a link for A::B, instead of only for A
+                  and generating a warning that ::B cannot be linked.
+<li>   id 598481: Fortran: Added support for extends keyword.
+<li>   id 618374: Added support for inlining code in the VHDL output.
+<li>   id 625519: Fortran: argument name starting with a reserved word was
+                  not handled properly.
+<li>   id 634415: Fixed problem parsing an array of character literals.
+<li>   id 635537: Links to file members were not made when found in tag files.
+<li>   id 638637: The Doxyfile documentation contained some very long lines.
+<li>   id 638655: Double quote in page or group title broke treeview.
+<li>   id 638733: Improved documentation for DOT_IMAGE_FORMAT option.
+<li>   id 638829: Added documentation to warn for consequences of using
+                  HTML_HEADER.
+<li>   id 638856: Fixed problem autolinking to struct field using #S::a
+<li>   id 639272: using @dot...@endot produced an image referenced with
+                  absolute path.
+<li>   id 639521: \mscfile did not work properly for LaTeX output.
+<li>   id 639716: Fixed problem where #include's could cause phantom __pad__
+                  members to appear in the output (appeared on Windows only).
+<li>   id 640259: Options PROJECT_LOGO and PROJECT_BRIEF were missing
+                  from the manual.
+<li>   id 640463: Fixed problem parsing PHP "use" statement when the argument
+                  did not have a namespace scope.
+<li>   id 640588: Included fix for proper splitting of multiple arguments
+                  given to the QHP_CUST_FILTER_ATTRS option.
+<li>   id 640646: Long error messages could cause memory corruption.
+<li>   id 640742: XML: switched indent option to no in the combine.xslt script.
+<li>   id 640754: Comment with XML style list of type table was not rendered 
+                  properly.
+<li>   id 640822: Added support for overloading of C# indexer operators.
+<li>   id 640828: Internal section marked with @internal was not shown as
+                  such anymore in the XML output.
+<li>   id 640847: PHP: Fixed parse problem referring to class in global  
+                  namespace.
+<li>   id 640924: Included patch by Haffmans to make the custom header and
+                  footer independent of the chosen config options.
+<li>   id 640927: Included fix to prevent a warning in the server side PHP
+                  search script.
+<li>   id 641026: Included patch to fix broken hyperlink to page entry 
+                  in xreflists.
+<li>   id 641188: Header of \page was wrong in Man page output.
+<li>   id 641336: #include's to other directories were not always linked.
+<li>   id 641673: Using "use Foo\Foo;" in PHP could cause doxygen to hang.
+<li>   id 641814: In some cases the HTML output could contain an extra &lt;/p&gt;.
+<li>   id 642030: Tooltips with HTML entities could be wrongly truncated.
+<li>   id 642475: Include graphs could be incomplete.
+<li>   id 643056: Fixed problem with macro expansion.
+<li>   id 643279: Fixed potential crash when generating a warning for
+                  void f(int %x) style parameter, which is valid in C++/CLI.
+<li>   id 643280: Included patch to enabled LargeAddressAware for Windows 
+                  builds.
+<li>   id 643276: Fixed cases where FILE_VERSION_FILTER was called for 
+                  dummy files with name "generated".
+<li>   id 643655: Fixed argument matching issue when one of match candidates
+                  was a typedef of a method pointer.
+<li>   id 645754: mscfile tag was closed with dotfile in the XML output.
+<li>   doxygen -w html now ignores the values for HTML_HEADER and HTML_FOOTER
+       found in the config file.
+<li>   Importing a group via a tag file could overrule a local group with 
+       the same name even when EXTERNAL_GROUPS was disabled.
+</ul>
+<a name="1.7.3"></a>
+<h1>Doxygen Release 1.7.3</h1>
+<h2>(release date 03-01-2011)</h2>
+<h3>Changes</h3>
+<ul>
+<li>   Added a header for each HTML page above the navigation menu, 
+       showing the project name and logo and a short descriptin (all optional).
+       Disabling the index (with DISABLE_INDEX) still shows the new header
+       (you can still customize this using HTML_HEADER). This now works
+       nicely in combination with GENERATE_TREEVIEW = YES and/or
+       SEARCH_ENGINE = YES.
+<li>   Redesigned the treeview feature. Instead of using frames, the
+       navigation tree is now loaded on each page dynamically. This allows
+       bookmarking a page and always keeps the top menu visible. Also the
+       current item is automatically highlighted in the tree.
+       Also updated the icons in the treeview to match the overall look'n'feel.
+       Note: if you now use a custom HTML header, please update it using
+       doxygen with the -w and the edit the default header.
+</ul>
+<h3>New features</h3>
+<ul>
+<li>   id 499544: Added SVG support to doxygen's dot output 
+       (setting DOT_IMAGE_FORMAT to svg now works as expected)
+<li>   Added control to the wizard to configure the color of the output
+       visually.
+<li>   Added options to specify project synopsis and select a 
+       project logo to the wizard.
+<li>   Added option PROJECT_LOGO which can be used to specify an image
+       which will be shown in the header of each HTML page along with
+       the project name (PROJECT_NAME option).
+<li>   Added option PROJECT_BRIEF which can be used to specify a brief
+       description which will be shown in the header of each HTML page
+       just below the project name.
+<li>   Added new option FILTER_SOURCE_PATTERNS which can be used 
+       in combination with FILTER_SOURCE_FILES to filter files used for 
+       the source browser based on file extension, which can overwrite 
+       the filter set by FILTER_PATTERNS and/or INPUT_FILTER.
+<li>   Added new option STRICT_PROTO_MATCHING which is disabled by default,
+       and makes the parameter matching to be less strict, resulting in 
+       fewer "No matching class member found" warnings.
+</ul>
+<h3>Bug fixes</h3>
+<ul>
+<li>   id 306076: code blocks with using directives did not get hyperlinked.
+<li>   id 313527: enum values with bitfields did not get parsed correctly.
+<li>   id 565715,630582: Included a patch that fixes a couple of Fortran issues
+       (thanks to Albert).
+<li>   id 615507: Fixed problem handling @cond..@endcond in Fortran code.
+<li>   id 619040: Scope was missing in Tokens.xml when using docsets.
+<li>   id 625517,523156: Applied patch tp avoid stripping prefixes for Fortran 
+       subroutines.
+<li>   id 626476: allow label before end statement in Fortran
+<li>   id 630901: &lt;/see&gt; was not handled properly in comment block.
+<li>   id 632311: Fixed potential crash for empty verbatim section.
+<li>   id 632426: closing brace of a function with one parameter has wrong
+       color in HTML.
+<li>   id 632543: Added support for Fortan TYPEs with languge bindings.
+       (thanks to a patch by Daniel Franke)
+<li>   id 632879: An explicit link request such as #blah did not longer produce
+       a warning if no symbol named blah was found.
+<li>   id 633891: warnings in "inbody" documentation were shown with "unknown"
+       file name.
+<li>   id 634116: Titles customized via the layout file did not appear in
+       the title page and navigation tree, only in the top menu.
+<li>   id 634600: Fixed problem resolving typedef.
+<li>   id 634775: Fixed a problem were // inside a code block got removed.
+<li>   id 634857: Added support for escaping :: by using \:: (or @::)
+<li>   id 634962: #include with relative path to parent dir did not get
+       hyperlinked.
+<li>   id 634986: Removed double definition of docParamName in compound.xsd.
+<li>   id 635198: C++/CLI Finalizer methods were not parsed properly.
+<li>   id 636475: Objective-C method names can now be used as the 
+       the first argument of \ref.
+<li>   id 636588: Fixed a couple of problems in the compound.xsd schema used
+       for XML output.
+<li>   id 636598: DISTRIBUTE_GROUP_DOC now works again for enum values.
+<li>   id 636947: Improved matching of typedef'ed array parameter and non 
+       typedef'ed array parameter.
+<li>   id 637610: Added a number of fixed for Fortran interfaces.
+<li>   id 637712: Handle files with the .for extension as Fortran.
+<li>   id 637987: Fixed error in the grouping documentation.
+<li>   Fixed line number sync problem when using Objective-C #import 
+       statements.
+<li>   Fixed problem handling /** @cond */ in the preprocessor.
+<li>   Member groups could get reordered in the output.
+</ul>
+<a name="1.7.2"></a>
+<h1>Doxygen Release 1.7.2</h1>
+<h2>(release date 09-10-2010)</h2>
+
+<h3>Changes</h3>
+<ul>
+<li>   Changed the default font of the LaTeX output to helvetica.
+<li>   Changed the way parameters and return values are represented in the
+       LaTeX and RTF output. They are now listed using tables.
+</ul>
+<h3>New features</h3>
+<ul>
+<li>   added support for Apple's block object extension for C/Obj-C/C++.
+<li>   added support for detecting Python constructors and destructors.
+<li>   id 624575: Added \endinternal command that can be used to force
+       the end of a section started with \internal.
+<li>   id 552605: Added parsing support for PHP 5.3+ style namespaces.
+<li>   id 582532: added \mscfile command which can be used to insert a 
+       message sequence chart given a .msc file. 
+       Also added a new config option MSCFILE_DIRS to provide directories
+       were msc files are searched (Thanks to Adrien for the patch).
+<li>   Added support for type specifiers for documenting PHP parameters,
+       format: "@param type $paramname docs"
+<li>   Added support for rendering formulas in the HTML output 
+       using MathJax instead of using prerendered bitmaps. 
+       For this purpose the options USE_MATHJAX and MATHJAX_RELPATH were
+       added.
+</ul>
+<h3>Bug fixes</h3>
+<ul>
+<li>   id 306076: Fixed case where using of a namespace did not work inside
+       an example.
+<li>   id 336053,487871: /// were not stripped from formulas and \dot..\enddot
+<li>   id 563698: dropped support for a4wide paper format for LaTeX, since
+       it is on the LaTeX taboo list.
+<li>   id 571014: Behaviour of CLASS_DIAGRAM=NO in combination with
+       HAVE_DOT=YES, was not propely documented.
+<li>   id 576291: Python comments for next class or method could end up in
+       code of a method/class when enabling INLINE_SOURCES.
+<li>   id 611174: Fixed problem handling nestes classes in Python.
+<li>   id 621733: removed unexpected warnings about undocumented return types
+<li>   id 622737: Undefined function macros could cause constant expression
+       errors.
+<li>   id 622780: updated copyright statement in PDF docs.
+<li>   id 622935: C# generics appeared with -g extension in the output in 
+       some situations.
+<li>   id 623023: Fixed parsing problem for "int &amp;foo1(),&amp;foo2();"
+<li>   id 623052: Link to destructor was wrong in the member index.
+<li>   id 623424: Fixed problem where struct description gets added to variable
+       of struct type.
+<li>   id 623673: Anchors were missing in the Qhp index for members.
+<li>   id 623733: Fixed potential crash due to uninitialized line number.
+<li>   id 623765: closed.png was wrongly linked when GENERATE_SUBDIRS and
+       HTML_DYNAMIC_SECTIONS were enabled.
+<li>   id 624014: Function macro was not handled properly when there was
+       a line continuation directly after the name.
+<li>   id 624095: Linking to a class via a tag file did not work if the class
+       was in an undocumented namespace.
+<li>   id 624104: Fixed a couple of typos in lodepng.h
+<li>   id 624323: Graph legend image was missing form the index files.
+<li>   Fixed a number of typos in the config file documentation 
+       (thanks to Jens Schweikhardt)
+<li>   id 624514: Some enums were not cross-referenced.
+<li>   id 624829: Missing \endcond could cause preprocessor issues in 
+       next file(s) to be parsed.
+<li>   id 625070: a function definition in a namespace, documented in the
+       header did not always get cross-referenced.
+<li>   id 625296: Removed superfluous &lt;td&gt;&lt;/td&gt; from parameter list in
+       HTML output.
+<li>   id 625317: Unterminated comment could crash doxygen.
+<li>   id 625531: Inherited documentation was only included for the
+       last derived class in case of multiple inheritance.
+<li>   id 625578: In the HTML output &lt;/div&gt; was missing for built-in
+       class diagrams.
+<li>   id 625555: References in example files with underscores were wrong.
+<li>   id 625982: When using japanese characters mixed with ascii characters
+       doxygen incorrected ended the brief description with a dot.
+<li>   id 625952: setting MULTILINE_CPP_IS_BRIEF to YES, cause /// to appear
+       in the output.
+<li>   id 626033,567774: EXTENSION_MAPPING did not work if a the mapped 
+       language was handled by the same parser as used for the original  
+       extension.
+<li>   id 626175: Fixed bracket bug in LaTeX fancy headers.
+<li>   id 626508: Allow hyphen in key argument of \xrefitem.
+<li>   id 626647: \copydoc did not work for array type arguments (e.g. int[]).
+<li>   Use \dotfile did not produce the correct map file, so URLs in dot
+       files did not work.
+<li>   id 627371: #define's in files only found via INCLUDE_PATH were not
+       correctly handled.
+<li>   id 628065: auto brief description ending with .) cause the ) to
+       end up in the detailed part.
+<li>   id 628242: Fixed encoding issue for the Spanish translation.
+<li>   id 628678: Fixed segmentation fault in case of very long errors.
+<li>   id 629040: Fixed type in search page of the documentation.
+<li>   id 629182: Fixed problem detecting include guard.
+<li>   id 629270: Made file extension to parser mapping case insensitive.
+<li>   id 629485: Latex makefile clean target used rm command also for Windows.
+<li>   id 629942: the EXCLUDE_SYMBOLS option was missing form the online docs.
+<li>   id 631094: \htmlinclude and \verbinclude ended the brief description.
+<li>   id 631380: Inconsistent behaviour when a brief description was given 
+       following by a detailed comment block with JAVADOC_AUTOBRIEF enabled.
+<li>   Fixed a number of typos in the documentation 
+       (thanks to Albert van der Meer)
+<li>   Fixed potential hangup when scanning directories defined as 
+       symlinks to absolute paths.
+<li>   HTML attributes other than src were not copied for the &lt;img&gt; tag.
+</ul>
+<a name="1.7.1"></a>
+<h1>Doxygen Release 1.7.1</h1>
+<h2>(release date 25-06-2010)</h2>
+<h3>Changes</h3>
+<ul>
+<li>   id 621695: Made warning and error messages appear with lower case 
+       "warning:" and "error:" prefix to make it easier to use the messages 
+       from Visual Studio.
+</ul>
+<h3>New features</h3>
+<ul>
+<li>   id 621908: Added new config option FORMULA_TRANSPARENT which allows
+       selecting between transparent (YES) or non-transparent (NO) PNGs for
+       formulas in the HTML output.
+<li>   Update for Turkish translation.
+</ul>
+<h3>Bug fixes</h3>
+<ul>
+<li>   id 533821: Inheritance relation for a C# class deriving from
+       a generic class was not handled correctly.
+<li>   id 554638: Changing DOT_IMAGE_FORMAT did not cause the graphs to be
+       regenerated.
+<li>   id 576533: A field of the form "enum E *p" was ignore.
+<li>   id 597016: Hide scope name was not working properly for todo items
+       inside class members, where the class was inside a namespace.
+<li>   id 617761: In dot graphs now also @ref worked (previously only \ref was
+       supported).
+<li>   id 621653: Fixed error when compiling doxygen for Solaris 8.
+<li>   id 621733: Removed bogus warning about undocument return type for 
+       define when WARN_NO_PARAMDOC was enabled.
+<li>   id 621780: Fixed parsing support for a function that returns a 
+       struct definition.
+<li>   id 621785: Doxygen could hang when using \copydoc in a function with
+       \param.
+<li>   id 621805: Using //!&lt; after a #define no longer worked.
+<li>   id 621854,622219,622593: html help compiler (and also the Qt 
+       help compiler) was called before all dot images were generated.
+<li>   id 621984: Using a auto-list in combination with \subpage cause the
+       items to be inlined.
+<li>   id 622018: Fixed problem parsing a @param command where the
+       text part started with a formula.
+<li>   id 622019: Added some instructions how to document Fortran code.
+<li>   id 622041: Using \var multiple times in a comment block did not
+       work properly.
+<li>   id 622413: Tooltips could get wrongly truncated when multi-byte
+       UTF-8 characters were used.
+<li>   id 622471: Argument matching failed for typedef in another namespace.
+<li>   Fixed crash situation while handling commands inside a @ref section.
+<li>   Treeview icons were missing in the HTML output when setting
+       GENERATE_TREEVIEW to NO and USE_INLINE_TREES to YES.
+</ul>
+
+<a name="1.7.0"></a>
+<h1>Doxygen Release 1.7.0</h1>
+<h2>(release date 15-06-2010)</h2>
+<h3>Changes</h3>
+<ul>
+<li>   Changed the look of the HTML output.
+<li>   Made several internal changes that should have a positive effect on the 
+       overall performance.
+</ul>
+<h3>New features</h3>
+<ul>
+<li>   The color of the HTML output can now easily be adjusted using three new 
+       options: HTML_COLORSTYLE_HUE, HTML_COLORSTYLE_SAT, 
+       and HTML_COLORSTYLE_GAMMA, which control respectively the hue, 
+       saturation, and gamma of all elements in the HTML output.
+<li>   Moved dot invocations to the end of a doxygen run. Doxygen will now
+       run multiple instances of dot in parallel (for better CPU utilisation
+       on multi-core systems). The new config option DOT_NUM_THREADS 
+       determines the number of threads used (were 0 is auto-detect).
+<li>   Added option EXT_LINKS_IN_WINDOW which controls whether or not
+       links to symbols imported via tag files will be opened in a new window.
+<li>   Included various language updates (thanks to Petr for coordinating).
+<li>   Included patch by Stefan Oberhumer that allows customizing the
+       way parameter lists are shown in the LaTeX output.
+</ul>
+<h3>Bug fixes</h3>
+<ul>
+<li>   id 306076: source browser could miss links for used namespaces.
+<li>   id 361476,620924: \if and \endif did not work properly inside auto lists.
+<li>   id 557164: No warning for missing return type documentation even though
+       WARN_NO_PARAMDOC was set to YES.
+<li>   id 577005: Handling of nesting \defgroup's was not always working
+       properly.
+<li>   id 578739: &oslash; was not translated correctly in the LaTeX output.
+<li>   id 583526: Use relative paths for mscgen diagrams to avoid errors in the
+       LaTeX output.
+<li>   id 592991: The "Use current settings at startup" feature of Doxywizard
+       was broken.
+<li>   id 593679: Links in the search results were broken if they pointed to
+       symbols imported via tag files using an absolute path or URL.
+<li>   id 593760,615682: Fixed man page output problem when using @par.
+<li>   id 594021: A C comment before a #endif caused the preprocessor 
+       statement to be ignored.
+<li>   id 597013: When HIDE_SCOPE_NAMES was enabled also the scope for
+       nested classes was stripped. Now only the namespace scope will be 
+       stripped as before.
+<li>   id 600829: Autolinks to namespace members did not work if
+       an explicit # or :: was used.
+<li>   id 602732: Slashes inside strings in java annotations were not handled
+       properly.
+<li>   id 606335: Fixed the "show html output" button in doxywizard 
+       for Windows when IE was set as the default browser.
+<li>   id 608292: Formatting was lost for section copied with \copydoc.
+<li>   id 608359: Fixed C++ parse issue for "class : public base {} var;" 
+       construct.
+<li>   id 611056: Generated HTML footer file did not have UTF-8 encoding and
+       the relative path marker needed when using CREATE_SUBDIRS = YES.
+<li>   id 611193: Fixed parsing problem with try-functions having multiple
+       catch handlers.
+<li>   id 611642: Specialized private template member function appeared as 
+       public.
+<li>   id 611888: Include dependency graphs were sometimes wrong.
+<li>   id 612170: Some lines in the generated Doxyfile where too long.
+<li>   id 612275: Fixed auto-link problem for certain URLs.
+<li>   id 612292: Improved handling of ellipsis inside brief description when
+       JAVADOC_AUTOBRIEF is enabled.
+<li>   id 612364: Accessibility of macros was not handled properly in all cases.
+<li>   id 612310: Enabling REFERENCED_BY_RELATION without SOURCE_BROWSER could
+       result in broken links.
+<li>   id 612458: Fixed problem handling @copydoc for function operators.
+<li>   id 612609: A raw C# string constant could end up in the next string.
+<li>   id 612969: subpages were not part of the XML output.
+<li>   id 613024: First list item in the paragraph after a @todo
+       item was not parsed properly.
+<li>   id 614204: Generated man page links were having a heading underscore.
+<li>   id 614443: Made include guard detect a bit more strict to avoid false
+       positives.
+<li>   id 614447: The labels of CVS tags were missing a colon.
+<li>   id 614438: Fixed problem parsing Q_PROPERTY with template type and
+       spaces.
+<li>   id 615165: Made the date string in the HTML footer translatable, 
+       along with some other sentences on the directory pages.
+<li>   id 612858: Inline attribute was shown also for non-inline template 
+       members.
+<li>   id 615583: Fixed problem handling @copy for operators with 
+       const qualifier.
+<li>   id 615755: Fixed problem handling '"' inside comments.
+<li>   id 615957: Made the LaTeX output a bit less spatious using \input.
+<li>   id 615695: Fixed preprocessor issue where a macro that was redefined
+       was not resolved.
+<li>   Fixed character encoding issue on the search results page.
+<li>   id 615670: C# namespaces are now extracted also without comment block
+       (the language spec does not allow XML documentation).
+<li>   id 616209: included patch that fixes some typos in the code.
+<li>   id 616344,610604: Pages with an underscore in the label generated a 
+       file name containing two underscores.
+<li>   id 616387: text of the form something.symbol got autolinked when
+       symbol had a global scope.
+<li>   id 616761: Call graph could be wrong when local variable has the same
+       name as a global function.
+<li>   id 616947: Added documentation patch on how to create URL links with 
+       custom text.
+<li>   id 616988: Doxywizard now removes non-existant files from the 
+       recent list and has an option to clear the list completely.
+<li>   id 617051: A macro defined via PREDEFINED did not always overrule a
+       macro definition in the code.
+<li>   id 617278: Enabling call graphs produced invalid XHTML output.
+<li>   id 617871: Non ascii characters in file or directory names 
+       caused problems on Windows.
+<li>   id 618079: An ALIAS with parameters spanning multiple lines
+       caused problems with /// style comments. 
+<li>   id 618632: Included patch to prevent image overflowing the page in 
+       the LaTeX output.
+<li>   id 619728: Fixed problem using EXTENSION_MAPPING for C# (thanks to
+       Vsevolod Kukol for the patch).
+<li>   id 619978: Links to external files could be wrong when CREATE_SUBDIR
+       was enabled.
+<li>   id 620229: /* characters in a print broke parsing within an conditional
+       section.
+<li>   id 620926: \if and \endif did not work properly inside HTML tables.
+<li>   Using @include in combination with LATEX_SOURCE_CODE caused wrong
+       output.
+<li>   Included a patch by Guido Tack which adds two new options
+       for docsets (DOCSET_PUBLISHER_ID and DOCSET_PUBLISHER_NAME) and 
+       fixes an issue with linking to docset members.
+<li>   Included patch by Stefan Oberhumer to support escaped {}'s in alias
+       definition and parameters.
+
+</ul>
+\endhtmlonly
+\section log_1_6 Release 1.6
+\htmlonly
+<a name="1.6.3"></a>
+<h1>Doxygen Release 1.6.3</h1>
+<h2>(release date 21-02-2010)</h2>
+<h3>New features</h3>
+<ul>
+<li>   id 608480: Using \dir without argument will create directory 
+                  documentation for the directory in which the \dir command 
+                  was found.
+</ul>
+<h3>Bug fixes</h3>
+<ul>
+<li>   id 590161: perlmod output was wrong when using paragraph commands.
+<li>   id 600525: Included patch for VHDL.
+<li>   id 605698: Replaced size attribute of hr tag by class attribute in the
+                  HTML output.
+<li>   id 606030,606192,607563: 
+                  Using \dot produced "Error opening map file" or 
+                  could even crash doxygen.
+<li>   id 606084: Loading a new config file in doxywizard did not reset all
+                  values of a previously loaded config file.
+<li>   id 606104: Grouped members with todo-like items were shown with 
+                  "GlobalScope" prefix.
+<li>   id 606156: Fixed RTF rendering problem with group index.
+<li>   id 606206,610133: Added missing line break in LaTeX output.
+<li>   id 606330, 608056: The title of pages whose label had an underscore
+                  was not shown
+<li>   id 606717: Include guard not starting with #ifndef SOME_GUARD_H were not
+                  recognised as such.
+<li>   id 606718: Setting SEARCHENGINE to YES and GENERATE_HTML to NO caused
+                  error that search results directory could not be created.
+<li>   id 606772,608493: typedef'ed enums or struct with the same as the 
+                  typedef did no longer show up.
+<li>   id 607088,607946: Related pages (manual and automatic like the todo page) 
+                  caused broken links when SHORT_NAMES was enabled.
+<li>   id 607432,608002: Automatically generated related pages (like the 
+                  todo page) caused broken links when CREATE_SUBDIR was enabled.
+<li>   id 607736: comments after #if could cause next function call not to be
+                  cross-referenced.
+<li>   id 607743: \internal inside a conditional section caused warning.
+<li>   id 608016: Using \internal inside a \section did not end at the
+       next \section as documented.
+<li>   id 608018: \internal command produced message with .: in 
+       the LaTeX output.
+<li>   id 608072: HTML Tables with custom attributes were not rendered 
+                  properly.
+<li>   id 608227: Man pages with underscore got double underscore in the name.
+<li>   id 608590: Buffer overflow when using non-ascii characters as class
+                  name.
+<li>   id 608921: Macro definition had effect even if the definition was not
+                  actually included.
+<li>   id 609504: config.h and config.l where missing from the SVN repository.
+<li>   id 609624: Todo items were merged for overloaded functions.
+<li>   id 609709: C# enum values with @todo items were missing from the todo
+                  list.
+<li>   id 610437: Removed bogus warning when using &lt;br/&gt; tag.
+<li>   Fixed parsing problem for function pointer type starting with
+       "typedef enum".
+<li>   Preprocessor did not take EXCLUDE_PATTERNS into account, which 
+       could cause parse issues when importing a .tlb file.
+</ul>
+
+
+<a name="1.6.2"></a>
+<h1>Doxygen Release 1.6.2</h1>
+<h2>(release date 30-12-2009)</h2>
+<h3>Changes</h3>
+<ul>
+<li>   id 594787: Autolinking to all-lower case words has been disabled,
+                  in accordance with the documentation.
+<li>   id 604543: Doxygen now allows any extension supported by dot via the
+       DOT_IMAGE_FORMAT option.
+<li>   Switched back to using PNGs for built-in diagrams and formulas using
+       the Lode Vandevenne's PNG encoder.
+</ul>
+<h3>New features</h3>
+<ul>
+<li>   Added new option SERVER_BASED_SEARCH to re-enable searching via a
+       PHP enabled web browser instead of only using javascript locally.
+       This method better scales to larger projects and allows full text
+       search.
+<li>   Added new options GENERATE_ECLIPSEHELP and ECLIPSE_DOC_ID
+       to generate an index file that can be used to embed doxygen's HTML 
+       output into Eclipse as a help plugin 
+       (thanks to a patch by Ondrej Starek).
+<li>   Wrote new <a href="http://www.doxygen.org/searching.html">documentation</a> 
+       regarding the methods of searching in the HTML output.
+<li>   Included patch by Ed Rosten to render formulas with 
+       proper anti-aliasing on non-white backgrounds using transparency.
+<li>   Add new option FORCE_LOCAL_INCLUDES to make the default #include
+       appearance in class documentation with "" i.s.o sharp brackets.
+<li>   id 558457: Make \addindex put keywords into the .qhp file.
+<li>   id 595214: #cmakedefine is now treated the same was as #define
+                  (for users of the CMake build system).
+<li>   Added compilation support for OSX 10.6 (aka Snow Leopard)
+<li>   Included language update for Brazilian.
+</ul>
+<h3>Bug fixes</h3>
+<ul>
+<li>   Doxywizard did not warn when it failed to save its config file.
+<li>   id 557035: Empty class definitions were not included in Tokens file
+                  for docsets.
+<li>   id 563233: GENERATE_QHP details was considered even though it is
+                  not defined.
+<li>   id 567346: Comment parser could get stuck in certain cases.
+<li>   id 570369: GENERATE_QHP should generate keywords for classes in
+                  generated *.qhc.
+<li>   id 571964: Fixed two issues in the compound.xsd schema definition.
+<li>   id 592991: Fixed wrong default destination directory.
+<li>   id 593040: Fixed problem with distributing member group documentation
+                  for anonymous member groups.
+<li>   id 593273: GENERATE_TODOLIST=NO and friends not longer worked.
+<li>   id 593928: Added support for UCS-2 encoded input files.
+<li>   id 594391: Fixed problem parsing fully-qualified java annotations.
+<li>   id 594592,596815: Fixed problem handling quotes.
+<li>   id 595191: Not all configuration options appeared in the index of
+                  the documentation and some were not sorted correctly.
+<li>   id 595253: formulas had the .png extension while they were gifs.
+<li>   id 595833: Fixed recursive lockup while resolving template relations.
+<li>   id 595935: Doxygen's preprocessor got confused when /**/ appeared as
+                  part of a macro definition.
+<li>   id 596085: Removed obsolete option USE_WINDOWS_ENCODING from the docs.
+<li>   id 596233: RTF output was missing a new paragraph for brief 
+                  member descriptions.
+<li>   id 596807,596819: Code reformatting done for the LaTeX output could 
+                  break multibyte UTF-8 characters causing invalid output.
+<li>   id 596809: Using multibyte characters in a page label caused invalid
+                  output.
+<li>   id 596816: Documented the interaction between LATEX_CMD_NAME and 
+                  USE_PDFLATEX.
+<li>   id 597015: Todo items for two inner classes with the same name where
+                  collapsed together in the todo list when HIDE_SCOPE_NAMES 
+                  was enabled.
+<li>   id 597016: Scope was not hidden for members in the todo list even
+                  though HIDE_SCOPE_NAMES was set to YES.
+<li>   id 598497: Struct variable with explicit struct keyword got labelled 
+                  with [read] attribute.
+<li>   id 596902: PHP was not parsed properly when it appeared in a
+                  &lt;script language="php"&gt; section.
+<li>   id 597415: Fixed problem matching base class member against the
+                  member in the derived class.
+<li>   id 597518: Makefile for Docsets now honors DESTDIR.
+<li>   id 598298: Made browsing for HHC_LOCATION via the wizard 
+                  yield an absolute path.
+<li>   id 599128: Changed default for CHM_INDEX_ENCODING to CP1250 to avoid
+                  issues in a Solaris environment.
+<li>   id 595931: Removed unnecessary paragraphs from HTML table cells.
+<li>   id 597541: referring to page labels of the form a-1 did not work.
+<li>   id 599224: Code generators could produce extra &lt;/span&gt; tags.
+<li>   id 599974: Included the PHP search engine again (with new config 
+                  option SERVER_BASED_SEARCH to enable it)
+<li>   id 600544: Doxygen produced invalid Latex output for RCS tags.
+<li>   id 600563: Fixed issue with include dependency tracking that could 
+                  cause macro expansion not to work properly.
+<li>   id 600940: Fixed issue with VHDL call graph (thank to Martin Kreis
+                  for the fix).
+<li>   id 601138: Fixed problem parsing C++ function-try-blocks.
+<li>   id 601222: #include inside a class could cause line numbers to be off.
+<li>   id 601223: Fixed parsing problem skipping over /**/ comment.
+<li>   id 601694: Fixed problem handling Javadoc style {@code ... } blocks.
+<li>   id 601771: Special commands did not work in the title of 
+                  the @mainpage.
+<li>   id 602818: Fixed problem parsing files that start with UTF-8 BOM.
+<li>   id 603001: Fixed problem parsing friend function with explicit scope.
+<li>   id 603238: Fixed perlmod generation issue.
+<li>   id 604948: Project number was not centered anymore in the HTML output.
+<li>   id 604503: Using %word in a page title incorrectly did show the %.
+</ul>
+
+<a name="1.6.1"></a>
+<h1>Doxygen Release 1.6.1</h1>
+<h2>(release date 25-08-2009)</h2>
+<h3>Bug fixes</h3>
+<ul>
+<li>   Fixed file handle leak when parsing include files. Also fixed
+       the logic that determines whether or not an include file need to be
+       parsed.
+<li>   Search result pages were not using UTF-8 character encoding.
+<li>   Search results pointing to external references were not linked correctly.
+<li>   id 133418: Multiline second argument of \ref caused unexpected " warning.
+<li>   id 592454: Feeding invalid XML could crash doxygen's DBus XML parser.
+<li>   id 592485: Include patch to fix problem with building rpms.
+<li>   id 592511,592625: Doxywizard problem with GENERATE_TREEVIEW.
+<li>   id 592650: SHOW_USED_FILES now works again.
+<li>   id 592808: xrefitems (like @todo) did not appear in the list when
+       found in comments marked with @enum or @name.
+</ul>
+<h1>Doxygen Release 1.6.0</h1>
+<h2>(release date 20-08-2009)</h2>
+<h3>Changes</h3>
+<ul>
+<li>   id 580924, 541234: Replaced the PHP based search engine by a 
+       Javascript/DHTML based one.
+       As a result the search feature no longer requires a HTTP server
+       with PHP enabled to be usable. Searching is limited to symbols
+       though, but it is now possible to filter on symbol type.
+<li>   id 519886: Make the HTML output XHTML 1.0 compliant.
+<li>   id 579950: Objective-C categories are now merged with their base 
+       class, unless there is no base class.
+<li>   Member groups with the same header within the same scope are now
+       merged. This also works for Objective-C categories.
+<li>   Changed the LaTeX style sheet such that more of the markup is 
+       configurable. Please update your style sheet if you use a custom one.
+<li>   id 584844: Treat \details inside a brief description as a new paragraph
+       command.
+<li>   Split GENERATE_TREEVIEW into two separate options:
+       GENERATE_TREEVIEW and USE_INLINE_TREES.
+<li>   Removed the dependencies on libpng and libz, doxygen now generates
+       gifs again for internal class diagrams (like it did 7 years ago ;-)
+</ul>
+<h3>New features</h3>
+<ul>
+<li>   Added option SORT_MEMBERS_CTORS_1ST, which when enabled places the
+       constructors and destructors first in an otherwise sorted list.
+<li>   id 581518: Applied patch by Tobias Hunger that adds support for
+       documenting DBus XML interface descriptions. 
+<li>   Included QtHelp patch by Karsten Heimrich which adds missing 
+       reference and keyword for methods.
+<li>   Included updates for the Korean and Polish translation.
+</ul>
+<h3>Bug fixes</h3>
+<ul>
+<li>   id 131989: Fixed preprocessor handling for C# code.  
+<li>   id 133418: -- was not rendered correctly for LaTeX output
+<li>   id 157485: Missing link in todo page.
+<li>   id 318061: Two template functions that only differed in the number
+       of template arguments were seen as the same function.
+<li>   id 443939: HIDE_UNDOC_CLASSES did not work properly.
+<li>   id 509348: Fixed problem with syncing the information of 
+       declaration and definition in the presence of an extra forward 
+       declaration in the source code.
+<li>   id 522193: For C# enum values were merged together if the same enum 
+       name was used in different scopes.
+<li>   id 523167: Included patch to handle PROGRAM statement in Fortran as
+       subroutines/functions.
+<li>   id 554636: Remove spacing around brackets for Obj-C protocols.
+<li>   id 557026: Included patch for fixing wrongly labeled items in docsets.
+<li>   id 560512: Improved parser to better disambiguate
+       nested templates ending with &gt;&gt; from the bitshift right operator.
+<li>   id 570238: Fixed matching problem for method in nested class, where
+       the outer class is a template.
+<li>   id 581746: Segfault/realloc error when a very long path was used.
+<li>   id 582469: documented #define with guard caused wrong documentation.
+<li>   id 582276: Doxywizard could crash on exit in some cases.
+<li>   id 582676: Regression: a struct ivar in ObjC class screws up method 
+                  identification.
+<li>   id 583213: Included patch that avoids trailing spaces in the
+       generated Doxyfile template.
+<li>   id 584192: Included VHDL patch by Martin Klein
+<li>   id 585543: Fixed case where matching declaration and definition did
+       not work correctly.
+<li>   id 585260: The "more..." link for files was broken, since the anchor
+       was not generated.
+<li>   id 586925: Fixed parsing problem when an unpaired apostrophe 
+       appeared in a Python comment.
+<li>   id 588291: Included fix for doxywizard makefile. 
+<li>   id 588587: Added missing virtual destructor to CompAccept base class.
+<li>   id 588968: Fixed segmentation fault for specific case in PHP code.
+<li>   Fixed some issues building for Windows.
+<li>   id 589514: Fixed problem handling strings like a"\b" within a comment.
+<li>   id 589616: Fixed problem matching explicitly scoped parameter in a 
+       template class.
+<li>   id 590712: A namespaced with name "internal" (C++/CLI keyword)
+       could confuse doxygen's C++ parser.
+<li>   id 591749: @optional/@required attributes for Objective-C were missing
+       from the XML output.
+</ul>
+<h1><a href="http://www.doxygen.org/changelog_1.5.html">Doxygen Release 1.5 and earlier</a></h1>
+<p>
+<hr>
+<p>
+Go <a href="index.html">back</a> to the main page.
+
+\endhtmlonly
+*/
index 03d6d3c..9cada6e 100644 (file)
@@ -2,7 +2,7 @@
  *
  *
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby
@@ -35,6 +35,7 @@ If in addition to the above argument specifiers [square] brackets are used the a
 
 Here is an alphabetically sorted list of all commands with references to their
 documentation:
+\anchor showsecreflist
 \secreflist
 \refitem cmda \\a
 \refitem cmdaddindex \\addindex
@@ -65,6 +66,7 @@ documentation:
 \refitem cmddeprecated \\deprecated
 \refitem cmddetails \\details
 \refitem cmddir \\dir
+\refitem cmddocbookonly \\docbookonly
 \refitem cmddontinclude \\dontinclude
 \refitem cmddot \\dot
 \refitem cmddotfile \\dotfile
@@ -74,6 +76,7 @@ documentation:
 \refitem cmdem \\em
 \refitem cmdendcode \\endcode
 \refitem cmdendcond \\endcond
+\refitem cmdenddocbookonly \\enddocbookonly
 \refitem cmdenddot \\enddot
 \refitem cmdendhtmlonly \\endhtmlonly
 \refitem cmdendif \\endif
@@ -83,6 +86,7 @@ documentation:
 \refitem cmdendmanonly \\endmanonly
 \refitem cmdendmsc \\endmsc
 \refitem cmdendrtfonly \\endrtfonly
+\refitem cmdendsecreflist \\endsecreflist
 \refitem cmdendverbatim \\endverbatim
 \refitem cmdendxmlonly \\endxmlonly
 \refitem cmdenum \\enum
@@ -100,6 +104,7 @@ documentation:
 \refitem cmdhideinitializer \\hideinitializer
 \refitem cmdhtmlinclude \\htmlinclude
 \refitem cmdhtmlonly \\htmlonly
+\refitem cmdidlexcept \\idlexcept 
 \refitem cmdif \\if
 \refitem cmdifnot \\ifnot
 \refitem cmdimage \\image
@@ -134,14 +139,16 @@ documentation:
 \refitem cmdpost \\post
 \refitem cmdpre \\pre
 \refitem cmdprivate \\private
-\refitem cmdprivate \\privatesection
+\refitem cmdprivatesection \\privatesection
 \refitem cmdproperty \\property
 \refitem cmdprotected \\protected
-\refitem cmdprotected \\protectedsection
+\refitem cmdprotectedsection \\protectedsection
 \refitem cmdprotocol \\protocol
 \refitem cmdpublic \\public
-\refitem cmdpublic \\publicsection
+\refitem cmdpublicsection \\publicsection
+\refitem cmdpure \\pure
 \refitem cmdref \\ref
+\refitem cmdrefitem \\refitem
 \refitem cmdrelated \\related
 \refitem cmdrelates \\relates
 \refitem cmdrelatedalso \\relatedalso
@@ -154,6 +161,7 @@ documentation:
 \refitem cmdretval \\retval
 \refitem cmdrtfonly \\rtfonly
 \refitem cmdsa \\sa
+\refitem cmdsecreflist \\secreflist
 \refitem cmdsection \\section
 \refitem cmdsee \\see
 \refitem cmdshort \\short
@@ -196,6 +204,7 @@ documentation:
 \refitem cmdquot \\\"
 \refitem cmdchardot \\\.
 \refitem cmddcolon \::
+\refitem cmdpipe \\|
 \endsecreflist
 
 The following subsections provide a list of all commands that are recognized by
@@ -249,7 +258,7 @@ Structural indicators
 
   \addindex \\callgraph
   When this command is put in a comment block of a function or method
-  and \ref cfg_have_dot "HAVE_DOT" is set to YES, then doxygen will
+  and \ref cfg_have_dot "HAVE_DOT" is set to \c YES, then doxygen will
   generate a call graph for that function (provided the implementation of the
   function or method calls other documented functions). The call graph will be
   generated regardless of the value of \ref cfg_call_graph "CALL_GRAPH".
@@ -263,7 +272,7 @@ Structural indicators
 
   \addindex \\callergraph
   When this command is put in a comment block of a function or method
-  and \ref cfg_have_dot "HAVE_DOT" is set to YES, then doxygen will
+  and \ref cfg_have_dot "HAVE_DOT" is set to \c YES, then doxygen will
   generate a caller graph for that function (provided the implementation of the
   function or method calls other documented functions). The caller graph will be
   generated regardless of the value of \ref cfg_caller_graph "CALLER_GRAPH".
@@ -356,7 +365,7 @@ Structural indicators
   the documentation block is located outside the class definition,
   the scope of the class should be specified as well.
   If a comment block is located directly in front of an enum declaration,
-  the \\enum comment may be omitted.
+  the \c \\enum comment may be omitted.
 
   \par Note:
   The type of an anonymous enum cannot be documented, but the values
@@ -389,7 +398,7 @@ Structural indicators
   to disambiguate it.
 
   If more than one source file is needed for the example,
-  the \\include command can be used.
+  the \ref cmdinclude "\\include" command can be used.
 
   \par Example:
   \verbinclude example.cpp
@@ -407,9 +416,9 @@ Structural indicators
 
   \addindex \\endinternal
   This command ends a documentation fragment that was started with a
-  \ref cmdinternal "\\internal" command. The text between \c \\internal and
+  \ref cmdinternal "\\internal" command. The text between \ref cmdinternal "\\internal" and
   \c \\endinternal will only be visible
-  if \ref cfg_internal_docs "INTERNAL_DOCS" is set to YES.
+  if \ref cfg_internal_docs "INTERNAL_DOCS" is set to \c YES.
 
 <hr>
 \section cmdextends \\extends <name>
@@ -436,8 +445,8 @@ Structural indicators
   Indicates that a comment block contains documentation for a source or
   header file with name \<name\>. The file name may include (part of) the
   path if the file-name alone is not unique. If the file name is omitted
-  (i.e. the line after \\file is left blank) then the documentation block that
-  contains the \\file command will belong to the file it is located in.
+  (i.e. the line after \c \\file is left blank) then the documentation block that
+  contains the \c \\file command will belong to the file it is located in.
 
   \par Important:
   The documentation of global functions, variables, typedefs, and enums will
@@ -451,7 +460,7 @@ Structural indicators
   \endhtmlonly
 
   \note In the above example \ref cfg_javadoc_autobrief "JAVADOC_AUTOBRIEF"
-  has been set to YES in the configuration file.
+  has been set to \c YES in the configuration file.
 
 <hr>
 \section cmdfn \\fn (function declaration)
@@ -467,10 +476,11 @@ Structural indicators
   should) be omitted.
 
   A full function declaration including arguments should be specified after the
-  \\fn command on a \e single line, since the argument ends at the end
+  \c \\fn command on a \e single line, since the argument ends at the end
   of the line!
 
-  This command is equivalent to \\var, \\typedef, and \\property.
+  This command is equivalent to \ref cmdvar "\\var", \ref cmdtypedef "\\typedef",
+  and \ref cmdproperty "\\property".
 
   \warning Do not use this command
   if it is not absolutely needed, since it will lead to duplication of
@@ -509,8 +519,8 @@ Structural indicators
 
   If a pair of double quotes is given for either the \<header-file\> or
   \<header-name\> argument, the current file (in which the command was found)
-  will be used but with quotes. So for a comment block with a \\headerfile
-  command inside a file test.h, the following three commands are equivalent:
+  will be used but with quotes. So for a comment block with a \c \\headerfile
+  command inside a file <code>test.h</code>, the following three commands are equivalent:
   \verbatim
   \headerfile test.h "test.h"
   \headerfile test.h ""
@@ -544,6 +554,13 @@ Structural indicators
   \sa section \ref cmdshowinitializer "\\showinitializer".
 
 <hr>
+\section cmdidlexcept \\idlexcept <name> 
+  \addindex \\idlexcept
+
+  Indicates that a comment block contains documentation for a
+  IDL exception with name \<name\>.
+
+<hr>
 \section cmdimplements \\implements <name>
 
   \addindex \\implements
@@ -565,7 +582,7 @@ Structural indicators
 \section cmdingroup \\ingroup (<groupname> [<groupname> <groupname>])
 
   \addindex \\ingroup
-  If the \\ingroup command is placed in a comment block of a
+  If the \c \\ingroup command is placed in a comment block of a
   class, file or namespace, then it will be added to the group or
   groups identified by \<groupname\>.
 
@@ -577,8 +594,8 @@ Structural indicators
 
   \addindex \\interface
   Indicates that a comment block contains documentation for an
-  interface with name \<name\>. The arguments are equal to the arguments of the \\class
-  command.
+  interface with name \<name\>. The arguments are equal to the arguments of the 
+  \ref cmdclass "\\class" command.
 
   \sa section \ref cmdclass "\\class".
 
@@ -591,7 +608,7 @@ Structural indicators
   You can also force the internal section to end earlier by using the
   \ref cmdendinternal "\\endinternal" command.
 
-  If the \\internal command is put inside a section
+  If the \c \\internal command is put inside a section
   (see for example \ref cmdsection "\\section") all subsections after the
   command are considered to be internal as well. Only a new section at the
   same level will end the fragment that is considered internal.
@@ -607,13 +624,13 @@ Structural indicators
 
   \addindex \\mainpage
 
-  If the \\mainpage command is placed in a comment block the
+  If the \c \\mainpage command is placed in a comment block the
   block is used to customize the index page (in HTML) or
   the first chapter (in \f$\mbox{\LaTeX}\f$).
 
   The title argument is optional and replaces the default title that
   doxygen normally generates. If you do not want any title you can
-  specify \c notitle as the argument of \\mainpage.
+  specify \c notitle as the argument of \c \\mainpage.
 
   Here is an example:
 \verbatim
@@ -631,7 +648,7 @@ Structural indicators
  */
 \endverbatim
 
- You can refer to the main page using \\ref index.
+ You can refer to the main page using: <code>\ref cmdref "\\ref" index</code>.
 
  \sa section \ref cmdsection "\\section",
      section \ref cmdsubsection "\\subsection", and
@@ -694,6 +711,7 @@ Structural indicators
   \sa sections \ref cmdpublicsection "\\publicsection",
       \ref cmdprotectedsection "\\protectedsection" and
       \ref cmdprivatesection "\\privatesection".
+
 <hr>
 \section cmdoverload \\overload [(function declaration)]
 
@@ -715,9 +733,9 @@ Structural indicators
     You are responsible that there is indeed an
     earlier documented member that is overloaded by this one.
     To prevent that document reorders the documentation you should set
-    \ref cfg_sort_member_docs "SORT_MEMBER_DOCS" to NO in this case.
+    \ref cfg_sort_member_docs "SORT_MEMBER_DOCS" to \c NO in this case.
   \par Note 2:
-    The \\overload command does not work inside a one-line comment.
+    The \c \\overload command does not work inside a one-line comment.
   \par Example:
   \verbinclude examples/overload.cpp
   \htmlonly
@@ -753,7 +771,7 @@ Structural indicators
      The \<name\> argument consists of a combination of letters and number
      digits. If you wish to use upper case letters (e.g. \c MYPAGE1), or
      mixed case letters (e.g. \c MyPage1) in the \<name\> argument, you
-     should set \c CASE_SENSE_NAMES to \c YES. However, this is advisable
+     should set \ref cfg_case_sense_names "CASE_SENSE_NAMES" to \c YES. However, this is advisable
      only if your file system is case sensitive. Otherwise (and for better
      portability) you should use all lower case letters (e.g. \c mypage1)
      for \<name\> in all references to the page.
@@ -766,7 +784,7 @@ Structural indicators
 \section cmdprivate \\private
 
   \addindex \\private
-  Indicates that the member documented in the comment block is private,
+  Indicates that the member documented by the comment block is private,
   i.e., should only be accessed by other members in the same class.
 
   Note that Doxygen automatically detects the protection level of members
@@ -775,7 +793,7 @@ Structural indicators
   (e.g. C, PHP 4).
 
   For starting a section of private members, in a way similar to the
-  "private:" class marker in C++, use \\privatesection.
+  "private:" class marker in C++, use \ref cmdprivatesection "\\privatesection".
 
   \sa sections \ref cmdmemberof "\\memberof", \ref cmdpublic "\\public",
       \ref cmdprotected "\\protected" and \ref cmdprivatesection "\\privatesection".
@@ -786,7 +804,7 @@ Structural indicators
   \addindex \\privatesection
   Starting a section of private members, in a way similar to the
   "private:" class marker in C++.
-  Indicates that the member documented in the comment block is private,
+  Indicates that the member documented by the comment block is private,
   i.e., should only be accessed by other members in the same class.
 
   \sa sections \ref cmdmemberof "\\memberof", \ref cmdpublic "\\public",
@@ -798,7 +816,8 @@ Structural indicators
   \addindex \\property
   Indicates that a comment block contains documentation for a
   property (either global or as a member of a class).
-  This command is equivalent to \\var, \\typedef, and \\fn.
+  This command is equivalent to \ref cmdfn "\\fn",
+  \ref cmdtypedef "\\typedef", and \ref cmdvar "\\var".
 
   \sa sections \ref cmdfn "\\fn", \ref cmdtypedef "\\typedef", and
                \ref cmdvar "\\var".
@@ -807,7 +826,7 @@ Structural indicators
 \section cmdprotected \\protected
 
   \addindex \\protected
-  Indicates that the member documented in the comment block is protected,
+  Indicates that the member documented by the comment block is protected,
   i.e., should only be accessed by other members in the same or derived
   classes.
 
@@ -817,7 +836,7 @@ Structural indicators
   (e.g. C, PHP 4).
 
   For starting a section of protected members, in a way similar to the
-  "protected:" class marker in C++, use \\protectedsection.
+  "protected:" class marker in C++, use \ref cmdprotectedsection "\\protectedsection".
 
   \sa sections \ref cmdmemberof "\\memberof", \ref cmdpublic "\\public",
       \ref cmdprivate "\\private" and \ref cmdprotectedsection "\\protectedsection".
@@ -828,7 +847,7 @@ Structural indicators
   \addindex \\protectedsection
   Starting a section of protected members, in a way similar to the
   "protected:" class marker in C++.
-  Indicates that the member documented in the comment block is protected,
+  Indicates that the member documented by the comment block is protected,
   i.e., should only be accessed by other members in the same or derived
   classes.
 
@@ -841,7 +860,7 @@ Structural indicators
   \addindex \\protocol
   Indicates that a comment block contains documentation for a
   protocol in Objective-C with name \<name\>. The arguments are equal
-  to the \\class command.
+  to the \ref cmdclass "\\class" command.
 
   \sa section \ref cmdclass "\\class".
 
@@ -849,7 +868,7 @@ Structural indicators
 \section cmdpublic \\public
 
   \addindex \\public
-  Indicates that the member documented in the comment block is public,
+  Indicates that the member documented by the comment block is public,
   i.e., can be accessed by any other class or function.
 
   Note that Doxygen automatically detects the protection level of members
@@ -858,7 +877,7 @@ Structural indicators
   (e.g. C, PHP 4).
 
   For starting a section of public members, in a way similar to the
-  "public:" class marker in C++, use \\publicsection.
+  "public:" class marker in C++, use \ref cmdpublicsection "\\publicsection".
 
   \sa sections \ref cmdmemberof "\\memberof", \ref cmdprotected "\\protected",
       \ref cmdprivate "\\private" and \ref cmdpublicsection "\\publicsection".
@@ -869,13 +888,24 @@ Structural indicators
   \addindex \\publicsection
   Starting a section of public members, in a way similar to the
   "public:" class marker in C++.
-  Indicates that the member documented in the comment block is public,
+  Indicates that the member documented by the comment block is public,
   i.e., can be accessed by any other class or function.
 
   \sa sections \ref cmdmemberof "\\memberof", \ref cmdprotected "\\protected",
       \ref cmdprivate "\\private" and \ref cmdpublic "\\public".
 
 <hr>
+\section cmdpure \\pure
+
+  \addindex \\pure
+  Indicates that the member documented by the comment block is pure virtual,
+  i.e., it is abstract and has no implementation associated with it.
+
+  This command is intended for use only when
+  the language does not support the concept of pure virtual methods natively
+  (e.g. C, PHP 4).
+
+<hr>
 \section cmdrelates \\relates <name>
 
   \addindex \\relates
@@ -932,12 +962,22 @@ Structural indicators
   \sa section \ref cmdhideinitializer "\\hideinitializer".
 
 <hr>
+\section cmdstatic \\static
+
+  \addindex \\static
+  Indicates that the member documented by the comment block is static,
+  i.e., it works on a class, instead of on an instance of the class.
+
+  This command is intended for use only when
+  the language does not support the concept of static methods natively (e.g. C).
+
+<hr>
 \section cmdstruct \\struct <name> [<header-file>] [<header-name>]
 
   \addindex \\struct
   Indicates that a comment block contains documentation for a
-  struct with name \<name\>. The arguments are equal to the arguments of the \\class
-  command.
+  struct with name \<name\>. The arguments are equal to the arguments of the 
+  \ref cmdclass "\\class" command.
 
   \sa section \ref cmdclass "\\class".
 
@@ -947,7 +987,8 @@ Structural indicators
   \addindex \\typedef
   Indicates that a comment block contains documentation for a
   typedef (either global or as a member of a class).
-  This command is equivalent to \\var, \\property, and \\fn.
+  This command is equivalent to \ref cmdfn "\\fn",
+  \ref cmdproperty "\\property", and \ref cmdvar "\\var".
 
   \sa section \ref cmdfn "\\fn", \ref cmdproperty "\\property", and
               \ref cmdvar "\\var".
@@ -957,8 +998,8 @@ Structural indicators
 
   \addindex \\union
   Indicates that a comment block contains documentation for a
-  union with name \<name\>. The arguments are equal to the arguments of the \\class
-  command.
+  union with name \<name\>. The arguments are equal to the arguments of the 
+  \ref cmdclass "\\class" command.
 
   \sa section \ref cmdclass "\\class".
 
@@ -968,7 +1009,8 @@ Structural indicators
   \addindex \\var
   Indicates that a comment block contains documentation for a variable or
   enum value (either global or as a member of a class).
-  This command is equivalent to \\typedef, \\property, and \\fn.
+  This command is equivalent to \ref cmdfn "\\fn",
+  \ref cmdproperty "\\property", and \ref cmdtypedef "\\typedef".
 
   \sa section \ref cmdfn "\\fn", \ref cmdproperty "\\property", and \ref cmdtypedef "\\typedef".
 
@@ -1008,8 +1050,8 @@ Section indicators
   The paragraph will be indented.
   The text of the paragraph has no special internal structure. All visual
   enhancement commands may be used inside the paragraph.
-  Multiple adjacent \\attention commands will be joined into a single paragraph.
-  The \\attention command ends when a blank line or some other
+  Multiple adjacent \c \\attention commands will be joined into a single paragraph.
+  The \c \\attention command ends when a blank line or some other
   sectioning command is encountered.
 
 <hr>
@@ -1020,9 +1062,9 @@ Section indicators
   The paragraph will be indented.
   The text of the paragraph has no special internal structure. All visual
   enhancement commands may be used inside the paragraph.
-  Multiple adjacent \\author commands will be joined into a single paragraph.
-  Each author description will start a new line. Alternatively, one \\author command
-  may mention several authors. The \\author command ends when a blank line or some other
+  Multiple adjacent \c \\author commands will be joined into a single paragraph.
+  Each author description will start a new line. Alternatively, one \c \\author command
+  may mention several authors. The \c \\author command ends when a blank line or some other
   sectioning command is encountered.
 
   \par Example:
@@ -1049,10 +1091,10 @@ Section indicators
   detailed description. A brief description may span several lines (although
   it is advised to keep it brief!). A brief description ends when a
   blank line or another sectioning command is encountered. If multiple
-  \\brief commands are present they will be joined. See section
+  \c \\brief commands are present they will be joined. See section
   \ref cmdauthor "\\author" for an example.
 
-  Synonymous to \\short.
+  Synonymous to \ref cmdshort "\\short".
 
 <hr>
 \section cmdbug \\bug { bug description }
@@ -1062,10 +1104,10 @@ Section indicators
   The paragraph will be indented.
   The text of the paragraph has no special internal structure. All visual
   enhancement commands may be used inside the paragraph.
-  Multiple adjacent \\bug commands will be joined into a single paragraph.
+  Multiple adjacent \c \\bug commands will be joined into a single paragraph.
   Each bug description will start on a new line.
-  Alternatively, one \\bug command may mention
-  several bugs. The \\bug command ends when a blank line or some other
+  Alternatively, one \c \\bug command may mention
+  several bugs. The \c \\bug command ends when a blank line or some other
   sectioning command is encountered. See section \ref cmdauthor "\\author"
   for an example.
 
@@ -1079,11 +1121,11 @@ Section indicators
   commands is to (conditionally) exclude part of a file from processing
   (in older version of doxygen this could only be achieved using C preprocessor commands).
 
-  The section between \\cond and \\endcond commands can be included by
+  The section between \c \\cond and \ref cmdendcond "\\endcond" can be included by
   adding its section label to the \ref cfg_enabled_sections "ENABLED_SECTIONS"
   configuration option. If the section label is omitted, the section will
   be excluded from processing unconditionally. The section label can be a 
-  logical expression build of section lavels, round brackets, && (AND), || (OR) and ! (NOT).
+  logical expression build of section labels, round brackets, && (AND), || (OR) and ! (NOT).
   If you use an expression you need to wrap it in round brackets, i.e 
   <tt>\\cond (!LABEL1 && LABEL2)</tt>.
 
@@ -1135,10 +1177,10 @@ class Implementation : public Intf
 /// @endcond
 \endverbatim
 
-The output will be different depending on whether or not \c ENABLED_SECTIONS
+The output will be different depending on whether or not \ref cfg_enabled_sections "ENABLED_SECTIONS"
 contains \c TEST, or \c DEV
 
-  \sa section \ref cmdendcond "\\endcond".
+  \sa sections \ref cmdendcond "\\endcond" and  \ref cfg_enabled_sections "ENABLED_SECTIONS".
 
 <hr>
 \section cmdcopyright \\copyright { copyright description }
@@ -1157,10 +1199,10 @@ contains \c TEST, or \c DEV
   The paragraph will be indented.
   The text of the paragraph has no special internal structure. All visual
   enhancement commands may be used inside the paragraph.
-  Multiple adjacent \\date commands will be joined into a single paragraph.
+  Multiple adjacent \c \\date commands will be joined into a single paragraph.
   Each date description will start on a new line.
-  Alternatively, one \\date command may mention
-  several dates. The \\date command ends when a blank line or some other
+  Alternatively, one \c \\date command may mention
+  several dates. The \c \\date command ends when a blank line or some other
   sectioning command is encountered. See section \ref cmdauthor "\\author"
   for an example.
 
@@ -1176,9 +1218,9 @@ contains \c TEST, or \c DEV
 \section cmddetails \\details { detailed description }
 
   \addindex \\details
-  Just like \ref cmdbrief "\\brief" starts a brief description, \\details
+  Just like \ref cmdbrief "\\brief" starts a brief description, \c \\details
   starts the detailed description. You can also start a new paragraph (blank line)
-  then the \\details command is not needed.
+  then the \c \\details command is not needed.
 
 <hr>
 \section cmdelse \\else
@@ -1186,7 +1228,8 @@ contains \c TEST, or \c DEV
   \addindex \\else
   Starts a conditional section if the previous conditional section
   was not enabled. The previous section should have been started with
-  a \c \\if, \c \\ifnot, or \c \\elseif command.
+  a \ref cmdif "\\if", \ref cmdifnot "\\ifnot", or \ref cmdelseif "\\elseif"
+  command.
 
   \sa \ref cmdif "\\if", \ref cmdifnot "\\ifnot", \ref cmdelseif "\\elseif",
       \ref cmdendif "\\endif."
@@ -1219,8 +1262,9 @@ contains \c TEST, or \c DEV
 \section cmdendif \\endif
 
   \addindex \\endif
-  Ends a conditional section that was started by \c \\if or \c \\ifnot
-  For each \c \\if or \c \\ifnot one and only one matching \c \\endif must follow.
+  Ends a conditional section that was started by \ref cmdif "\\if" or \ref cmdifnot "\\ifnot"
+  For each \ref cmdif "\\if" or \ref cmdifnot "\\ifnot" one and only one matching 
+  \ref cmdendif "\\endif" must follow.
 
   \sa sections \ref cmdif "\\if" and \ref cmdifnot "\\ifnot".
 
@@ -1233,9 +1277,9 @@ contains \c TEST, or \c DEV
   The existence of the exception object is not checked.
   The text of the paragraph has no special internal structure. All visual
   enhancement commands may be used inside the paragraph.
-  Multiple adjacent \\exception commands will be joined into a single paragraph.
+  Multiple adjacent \c \\exception commands will be joined into a single paragraph.
   Each exception description will start on a new line.
-  The \\exception description ends when a blank line or some other
+  The \c \\exception description ends when a blank line or some other
   sectioning command is encountered. See section \ref cmdfn "\\fn" for an
   example.
 
@@ -1244,7 +1288,7 @@ contains \c TEST, or \c DEV
 
   \addindex \\if
   Starts a conditional documentation section. The section ends
-  with a matching \c \\endif command. A conditional section is
+  with a matching \ref cmdendif "\\endif" command. A conditional section is
   disabled by default. To enable it you must put the
   section-label after the \ref cfg_enabled_sections "ENABLED_SECTIONS"
   tag in the configuration file.  
@@ -1300,24 +1344,26 @@ ALIASES  = "english=\if english" \
            "enddutch=\endif"
 \endverbatim
 
-  and \c ENABLED_SECTIONS can be used to enable either \c english or \c dutch.
+  and \ref cfg_enabled_sections "ENABLED_SECTIONS" can be used to enable either \c english or \c dutch.
 
   \sa sections \ref cmdendif "\\endif", \ref cmdifnot "\\ifnot",
-              \ref cmdelse "\\else", and \ref cmdelseif "\\elseif".
+               \ref cmdelse "\\else", \ref cmdelseif "\\elseif", and
+               \ref cfg_enabled_sections "ENABLED_SECTIONS".
 
 <hr>
 \section cmdifnot \\ifnot (section-label)
 
   \addindex \\ifnot
   Starts a conditional documentation section. The section ends
-  with a matching \c \\endif command. This conditional section is
+  with a matching \ref cmdendif "\\endif" command. This conditional section is
   enabled by default. To disable it you must put the
   section-label after the \ref cfg_enabled_sections "ENABLED_SECTIONS"
   tag in the configuration file.  The section label can be a logical expression
   build of section names, round brackets, && (AND), || (OR) and ! (NOT).
 
   \sa sections \ref cmdendif "\\endif", \ref cmdif "\\if",
-              \ref cmdelse "\\else", and \ref cmdelseif "\\elseif".
+               \ref cmdelse "\\else", and \ref cmdelseif "\\elseif", and
+               \ref cfg_enabled_sections "ENABLED_SECTIONS".
 
 <hr>
 \section cmdinvariant \\invariant { description of invariant }
@@ -1327,10 +1373,10 @@ ALIASES  = "english=\if english" \
   The paragraph will be indented.
   The text of the paragraph has no special internal structure. All visual
   enhancement commands may be used inside the paragraph.
-  Multiple adjacent \\invariant commands will be joined into a single paragraph.
+  Multiple adjacent \c \\invariant commands will be joined into a single paragraph.
   Each invariant description will start on a new line.
-  Alternatively, one \\invariant command may mention
-  several invariants. The \\invariant command ends when a blank line or some other
+  Alternatively, one \c \\invariant command may mention
+  several invariants. The \c \\invariant command ends when a blank line or some other
   sectioning command is encountered.
 
 <hr>
@@ -1340,10 +1386,10 @@ ALIASES  = "english=\if english" \
   Starts a paragraph where a note can be entered. The paragraph will be
   indented. The text of the paragraph has no special internal structure.
   All visual enhancement commands may be used inside the paragraph.
-  Multiple adjacent \\note commands will be joined into a single paragraph.
+  Multiple adjacent \c \\note commands will be joined into a single paragraph.
   Each note description will start on a new line.
-  Alternatively, one \\note command may mention
-  several notes. The \\note command ends when a blank line or some other
+  Alternatively, one \c \\note command may mention
+  several notes. The \c \\note command ends when a blank line or some other
   sectioning command is encountered. See section \ref cmdpar "\\par"
   for an example.
 
@@ -1357,11 +1403,11 @@ ALIASES  = "english=\if english" \
 
   If no paragraph title is given this command will start a new paragraph.
   This will also work inside other paragraph commands
-  (like \\param or \\warning) without ending that command.
+  (like \ref cmdparam "\\param" or \ref cmdwarning "\\warning") without ending that command.
 
   The text of the paragraph has no special internal structure. All visual
   enhancement commands may be used inside the paragraph.
-  The \\par command ends when a blank line or some other
+  The \c \\par command ends when a blank line or some other
   sectioning command is encountered.
 
   \par Example:
@@ -1381,11 +1427,11 @@ ALIASES  = "english=\if english" \
   the documentation of this (or any other) parameter is missing or not
   present in the function declaration or definition.
 
-  The \\param command has an optional attribute, (dir), specifying the direction
+  The \c \\param command has an optional attribute, (dir), specifying the direction
   of the parameter. Possible values are "[in]", "[in,out]", and "[out]",
   note the [square] brackets in this description.
   When a parameter is both input and output, [in,out] is used as attribute.
-  Here is an example for the function memcpy:
+  Here is an example for the function \c memcpy:
   \code
 /*!
  * Copies bytes from a source memory area to a destination memory area,
@@ -1400,14 +1446,14 @@ void memcpy(void *dest, const void *src, size_t n);
   The parameter description is a paragraph with no special internal structure.
   All visual enhancement commands may be used inside the paragraph.
 
-  Multiple adjacent \\param commands will be joined into a single paragraph.
+  Multiple adjacent \c \\param commands will be joined into a single paragraph.
   Each parameter description will start on a new line.
-  The \\param description ends when a blank line or some other
+  The \c \\param description ends when a blank line or some other
   sectioning command is encountered. See section \ref cmdfn "\\fn" for an
   example.
 
   Note that you can also document multiple parameters with a single
-  \\param command using a comma separated list. Here is an example:
+  \c \\param command using a comma separated list. Here is an example:
 
 \code
 /** Sets the position.
@@ -1444,10 +1490,10 @@ void setPosition(double x,double y,double z,double t)
   The paragraph will be indented.
   The text of the paragraph has no special internal structure. All visual
   enhancement commands may be used inside the paragraph.
-  Multiple adjacent \\post commands will be joined into a single paragraph.
+  Multiple adjacent \c \\post commands will be joined into a single paragraph.
   Each postcondition will start on a new line.
-  Alternatively, one \\post command may mention
-  several postconditions. The \\post command ends when a blank line or some other
+  Alternatively, one \c \\post command may mention
+  several postconditions. The \c \\post command ends when a blank line or some other
   sectioning command is encountered.
 
 <hr>
@@ -1458,10 +1504,10 @@ void setPosition(double x,double y,double z,double t)
   The paragraph will be indented.
   The text of the paragraph has no special internal structure. All visual
   enhancement commands may be used inside the paragraph.
-  Multiple adjacent \\pre commands will be joined into a single paragraph.
+  Multiple adjacent \c \\pre commands will be joined into a single paragraph.
   Each precondition will start on a new line.
-  Alternatively, one \\pre command may mention
-  several preconditions. The \\pre command ends when a blank line or some other
+  Alternatively, one \c \\pre command may mention
+  several preconditions. The \c \\pre command ends when a blank line or some other
   sectioning command is encountered.
 
 <hr>
@@ -1472,10 +1518,10 @@ void setPosition(double x,double y,double z,double t)
   The paragraph will be indented.
   The text of the paragraph has no special internal structure. All visual
   enhancement commands may be used inside the paragraph.
-  Multiple adjacent \\remark commands will be joined into a single paragraph.
+  Multiple adjacent \c \\remark commands will be joined into a single paragraph.
   Each remark will start on a new line.
-  Alternatively, one \\remark command may mention
-  several remarks. The \\remark command ends when a blank line or some other
+  Alternatively, one \c \\remark command may mention
+  several remarks. The \c \\remark command ends when a blank line or some other
   sectioning command is encountered.
 
 <hr>
@@ -1497,8 +1543,8 @@ void setPosition(double x,double y,double z,double t)
   Starts a return value description for a function.
   The text of the paragraph has no special internal structure. All visual
   enhancement commands may be used inside the paragraph.
-  Multiple adjacent \\return commands will be joined into a single paragraph.
-  The \\return description ends when a blank line or some other
+  Multiple adjacent \c \\return commands will be joined into a single paragraph.
+  The \c \\return description ends when a blank line or some other
   sectioning command is encountered. See section \ref cmdfn "\\fn" for an
   example.
 
@@ -1517,9 +1563,9 @@ void setPosition(double x,double y,double z,double t)
   The text of the paragraph that forms the description has no special
   internal structure. All visual enhancement commands may be used inside the
   paragraph.
-  Multiple adjacent \\retval commands will be joined into a single paragraph.
+  Multiple adjacent \c \\retval commands will be joined into a single paragraph.
   Each return value description will start on a new line.
-  The \\retval description ends when a blank line or some other
+  The \c \\retval description ends when a blank line or some other
   sectioning command is encountered.
 
 <hr>
@@ -1556,9 +1602,9 @@ void setPosition(double x,double y,double z,double t)
 
   \addindex \\since
   This tag can be used to specify since when (version or time) an
-  entity is available. The paragraph that follows \\since does not have any
+  entity is available. The paragraph that follows \c \\since does not have any
   special internal structure. All visual enhancement commands may be
-  used inside the paragraph. The \\since description ends when a blank
+  used inside the paragraph. The \c \\since description ends when a blank
   line or some other sectioning command is encountered.
 
 <hr>
@@ -1575,10 +1621,10 @@ void setPosition(double x,double y,double z,double t)
 \section cmdthrow \\throw <exception-object> { exception description }
 
   \addindex \\throw
-  Synonymous to \\exception (see section \ref cmdexception "\\exception").
+  Synonymous \ref cmdexception "\\exception".
 
   \par Note:
-  the tag \\throws is a synonym for this tag.
+  the tag \c \\throws is a synonym for this tag.
 
   \sa section \ref cmdexception "\\exception"
 
@@ -1606,9 +1652,9 @@ void setPosition(double x,double y,double z,double t)
   The paragraph will be indented.
   The text of the paragraph has no special internal structure. All visual
   enhancement commands may be used inside the paragraph.
-  Multiple adjacent \\version commands will be joined into a single paragraph.
+  Multiple adjacent \c \\version commands will be joined into a single paragraph.
   Each version description will start on a new line.
-  Alternatively, one \\version command may mention
+  Alternatively, one \c \\version command may mention
   several version strings.
   The \\version command ends when a blank line or some other
   sectioning command is encountered. 
@@ -1622,10 +1668,10 @@ void setPosition(double x,double y,double z,double t)
   The paragraph will be indented.
   The text of the paragraph has no special internal structure. All visual
   enhancement commands may be used inside the paragraph.
-  Multiple adjacent \\warning commands will be joined into a single paragraph.
+  Multiple adjacent \c \\warning commands will be joined into a single paragraph.
   Each warning description will start on a new line.
-  Alternatively, one \\warning command may mention
-  several warnings. The \\warning command ends when a blank line or some other
+  Alternatively, one \c \\warning command may mention
+  several warnings. The \c \\warning command ends when a blank line or some other
   sectioning command is encountered. See section \ref cmdauthor "\\author"
   for an example.
 
@@ -1645,9 +1691,9 @@ void setPosition(double x,double y,double z,double t)
  is a quoted string representing the heading of the section under which
  text passed as the fourth argument is put. The third argument (list title)
  is used as the title for the related page containing all items with the
- same key. The keys "todo", "test", "bug" and "deprecated" are predefined.
+ same key. The keys \c "todo", \c "test", \c "bug" and \c "deprecated" are predefined.
 
- To get an idea on how to use the \\xrefitem command and what its effect
+ To get an idea on how to use the \c \\xrefitem command and what its effect
  is, consider the todo list, which (for English output) can be seen an
  alias for the command
  \verbatim \xrefitem todo "Todo" "Todo List" \endverbatim
@@ -1656,11 +1702,11 @@ void setPosition(double x,double y,double z,double t)
  parameters of the command for each section, the command is meant to
  be used in combination with the \ref cfg_aliases "ALIASES" option in the
  configuration file.
- To define a new command \\reminder, for instance, one should add the following
+ To define a new command \c \\reminder, for instance, one should add the following
  line to the configuration file:
  \verbatim ALIASES += "reminder=\xrefitem reminders \"Reminder\" \"Reminders\"" \endverbatim
  Note the use of escaped quotes for the second and third argument of the
- \\xrefitem command.
+ \c \\xrefitem command.
 
 <hr>
 
@@ -1683,7 +1729,7 @@ Commands to create links
 
   \addindex \\anchor
   This command places an invisible, named anchor into the documentation
-  to which you can refer with the \\ref command.
+  to which you can refer with the \ref cmdref "\\ref" command.
 
   \note Anchors can currently only be put into a comment block
   that is marked as a page (using \ref cmdpage "\\page") or mainpage
@@ -1707,7 +1753,7 @@ Commands to create links
 \section cmdendlink \\endlink
 
   \addindex \\endlink
-  This command ends a link that is started with the \\link command.
+  This command ends a link that is started with the \ref cmdlink "\\link" command.
 
   \sa section \ref cmdlink "\\link".
 
@@ -1718,13 +1764,13 @@ Commands to create links
   The links that are automatically generated by doxygen always have the
   name of the object they point to as link-text.
 
-  The \\link command can be used to create a link to an object (a file,
+  The \c \\link command can be used to create a link to an object (a file,
   class, or member) with a user specified link-text.
-  The link command should end with an \\endlink command. All text between
-  the \\link and \\endlink commands serves as text for a link to
-  the \<link-object\> specified as the first argument of \\link.
+  The link command should end with an \ref cmdendlink "\\endlink" command. All text between
+  the \c \\link and \ref cmdendlink "\\endlink" commands serves as text for a link to
+  the \<link-object\> specified as the first argument of \c \\link.
 
-  See section \ref autolink "autolink" for more information on automatically
+  \sa Section \ref autolink "autolink" for more information on automatically
   generated links and valid link-objects.
 
 <hr>
@@ -1741,7 +1787,28 @@ Commands to create links
   page number if \<name\> refers to an anchor.
 
   \sa
-    Section \ref cmdpage "\\page" for an example of the \\ref command.
+    Section \ref cmdpage "\\page" for an example of the \c \\ref command.
+
+<hr>
+\section cmdrefitem \\refitem <name>
+  \addindex \\refitem
+  Just like the \ref cmdref "\\ref" command, this command creates a reference 
+  to a named section, but this reference appears in a list that is started by 
+  \ref cmdsecreflist "\\secreflist"
+  and ends with \ref cmdendsecreflist "\\endsecreflist".
+  An example of such a list can be seen 
+  \ref showsecreflist "at the top of the page".
+
+<hr>
+\section cmdsecreflist \\secreflist
+  \addindex \\secreflist
+  Starts an index list of item, created with \ref cmdrefitem "\\refitem" 
+  that each link to a named section.
+
+<hr>
+\section cmdendsecreflist \\endsecreflist
+  \addindex \\endsecreflist
+  End an index list started with \ref cmdsecreflist "\\secreflist".
 
 <hr>
 \section cmdsubpage \\subpage <name> ["(text)"]
@@ -1749,7 +1816,7 @@ Commands to create links
   \addindex \\subpage
   This command can be used to create a hierarchy of pages. The
   same structure can be made using the \ref cmddefgroup "\\defgroup" and
-  \ref cmdingroup "\\ingroup" commands, but for pages the \\subpage command
+  \ref cmdingroup "\\ingroup" commands, but for pages the \c \\subpage command
   is often more convenient. The main page (see \ref cmdmainpage "\\mainpage")
   is typically the root of hierarchy.
 
@@ -1757,7 +1824,7 @@ Commands to create links
   it creates a reference to a page labeled \<name\> with the optional
   link text as specified in the second argument.
 
-  It differs from the \\ref command in that it only works for pages,
+  It differs from the \ref cmdref "\\ref" command in that it only works for pages,
   and creates a parent-child relation between pages, where the
   child page (or sub page) is identified by label \<name\>.
 
@@ -1811,7 +1878,7 @@ Make sure you have first read \ref intro "the introduction".
 
   \addindex \\section
   Creates a section with name \<section-name\>. The title of the
-  section should be specified as the second argument of the \\section
+  section should be specified as the second argument of the \c \\section
   command.
 
   \warning This command only works inside related page documentation and
@@ -1819,14 +1886,14 @@ Make sure you have first read \ref intro "the introduction".
 
   \sa
    Section \ref cmdpage "\\page" for an example of the
-           \ref cmdsection "\\section" command.
+           \c \\section command.
 
 <hr>
 \section cmdsubsection \\subsection <subsection-name> (subsection title)
 
   \addindex \\subsection
   Creates a subsection with name \<subsection-name\>. The title of the
-  subsection should be specified as the second argument of the \\subsection
+  subsection should be specified as the second argument of the \c \\subsection
   command.
 
   \warning This command only works inside a section of a related page
@@ -1835,7 +1902,7 @@ Make sure you have first read \ref intro "the introduction".
 
   \sa
    Section \ref cmdpage "\\page" for an example of the
-           \ref cmdsubsection "\\subsection" command.
+           \c \\subsection command.
 
 <hr>
 \section cmdsubsubsection \\subsubsection <subsubsection-name> (subsubsection title)
@@ -1843,7 +1910,7 @@ Make sure you have first read \ref intro "the introduction".
   \addindex \\subsubsection
   Creates a subsubsection with name \<subsubsection-name\>. The title of the
   subsubsection should be specified as the second argument of the
-  \\subsubsection command.
+  \c \\subsubsection command.
 
   \warning This command only works inside a subsection of a
            related page documentation block and
@@ -1860,7 +1927,7 @@ Make sure you have first read \ref intro "the introduction".
   \addindex \\paragraph
   Creates a named paragraph with name \<paragraph-name\>. The title of the
   paragraph should be specified as the second argument of the
-  \\paragraph command.
+  \c \\paragraph command.
 
   \warning This command only works inside a subsubsection of a
            related page documentation block and
@@ -1881,7 +1948,7 @@ Commands for displaying examples
 
   \addindex \\dontinclude
   This command can be used to parse a source file without actually
-  verbatim including it in the documentation (as the \\include command does).
+  verbatim including it in the documentation (as the \ref cmdinclude "\\include" command does).
   This is useful if you want to divide the source file into smaller pieces and
   add documentation between the pieces.
   Source files or directories can be specified using the
@@ -1890,12 +1957,13 @@ Commands for displaying examples
 
   The class and member declarations and definitions inside the code fragment
   are 'remembered' during the parsing of the comment block that contained
-  the \\dontinclude command.
+  the \c \\dontinclude command.
 
   For line by line descriptions of source files, one or more lines
-  of the example can be displayed using the \\line, \\skip, \\skipline, and
-  \\until commands. An internal pointer is used for these commands. The
-  \\dontinclude command sets the pointer to the first line of the example.
+  of the example can be displayed using the \ref cmdline "\\line", 
+  \ref cmdskip "\\skip", \ref cmdskipline "\\skipline", and
+  \ref cmduntil "\\until" commands. An internal pointer is used for these commands. The
+  \c \\dontinclude command sets the pointer to the first line of the example.
 
   \par Example:
   \verbinclude include.cpp
@@ -1928,11 +1996,11 @@ Commands for displaying examples
   by the \ref cfg_example_path "EXAMPLE_PATH" tag, you can include part
   of the absolute path to disambiguate it.
 
-  Using the \\include command is equivalent to inserting the file into
+  Using the \c \\include command is equivalent to inserting the file into
   the documentation block and surrounding it
   with \ref cmdcode "\\code" and \ref cmdendcode "\\endcode" commands.
 
-  The main purpose of the \\include command is to avoid code
+  The main purpose of the \c \\include command is to avoid code
   duplication in case of example blocks that consist of multiple
   source and header files.
 
@@ -1956,7 +2024,7 @@ Commands for displaying examples
 \section cmdincludelineno \\includelineno <file-name>
 
   \addindex \\includelineno
-  This command works the same way as \\include, but will add line
+  This command works the same way as \ref cmdinclude "\\include", but will add line
   numbers to the included file.
 
   \sa section \ref cmdinclude "\\include".
@@ -1966,7 +2034,8 @@ Commands for displaying examples
 
   \addindex \\line
   This command searches line by line through the example that was last
-  included using \\include or \\dontinclude until it finds a non-blank
+  included using \ref cmdinclude "\\include" or
+  \ref cmddontinclude "\\dontinclude" until it finds a non-blank
   line. If that line contains the specified pattern, it is written
   to the output.
 
@@ -1982,7 +2051,8 @@ Commands for displaying examples
 
   \addindex \\skip
   This command searches line by line through the example that was last
-  included using \\include or \\dontinclude until it finds a line that contains
+  included using \ref cmdinclude "\\include" or
+  \ref cmddontinclude "\\dontinclude" until it finds a line that contains
   the specified pattern.
 
   The internal pointer that is used to keep track of the current line in
@@ -1996,7 +2066,8 @@ Commands for displaying examples
 
   \addindex \\skipline
   This command searches line by line through the example that was last
-  included using \\include or \\dontinclude until it finds a line that contains
+  included using \ref cmdinclude "\\include" or
+  \ref cmddontinclude "\\dontinclude" until it finds a line that contains
   the specified pattern. It then writes the line to the output.
 
   The internal pointer that is used to keep track of the current line in
@@ -2031,7 +2102,7 @@ Commands for displaying examples
 
  The text following the file name is the unique identifier for the snippet. 
  This is used to delimit the quoted code in the relevant snippet file as 
- shown in the following example that corresponds to the above \\snippet 
+ shown in the following example that corresponds to the above \c \\snippet 
  command:
 
 \code
@@ -2064,7 +2135,8 @@ Commands for displaying examples
 
   \addindex \\until
   This command writes all lines of the example that was last
-  included using \\include or \\dontinclude to the output, until it finds
+  included using \ref cmdinclude "\\include" or
+  \ref cmddontinclude "\\dontinclude"  to the output, until it finds
   a line containing the specified pattern. The line containing the pattern
   will be written as well.
 
@@ -2080,7 +2152,8 @@ Commands for displaying examples
   \addindex \\verbinclude
   This command includes the file \<file-name\> verbatim in the documentation.
   The command is equivalent to pasting the file in the documentation and
-  placing \\verbatim and \\endverbatim commands around it.
+  placing \ref cmdverbatim "\\verbatim" and \ref cmdendverbatim "\\endverbatim"
+  commands around it.
 
   Files or directories that doxygen should look for can be specified using the
   \ref cfg_example_path "EXAMPLE_PATH" tag of doxygen's configuration file.
@@ -2091,7 +2164,8 @@ Commands for displaying examples
   \addindex \\htmlinclude
   This command includes the file \<file-name\> as is in the HTML documentation.
   The command is equivalent to pasting the file in the documentation and
-  placing \\htmlonly and \\endhtmlonly commands around it.
+  placing \ref cmdhtmlonly "\\htmlonly" and \ref cmdendhtmlonly "\\endhtmlonly"
+  commands around it.
 
   Files or directories that doxygen should look for can be specified using the
   \ref cfg_example_path "EXAMPLE_PATH" tag of doxygen's configuration file.
@@ -2120,7 +2194,7 @@ Commands for visual enhancements
   This will result in the following text:<br><br>
   ... the \a x and \a y coordinates are used to ...
 
-  Equivalent to \ref cmda "\\e" and \ref cmdem "\\em".
+  Equivalent to \ref cmde "\\e" and \ref cmdem "\\em".
   To emphasize multiple words use \<em\>multiple words\</em\>.
 
 <hr>
@@ -2128,10 +2202,10 @@ Commands for visual enhancements
 
   \addindex \\arg
   This command has one argument that continues until the first
-  blank line or until another \\arg is encountered.
+  blank line or until another \c \\arg is encountered.
   The command can be used to generate a simple, not nested list of
   arguments.
-  Each argument should start with a \\arg command.
+  Each argument should start with a \c \\arg command.
 
   \par Example:
   Typing:
@@ -2193,12 +2267,12 @@ Commands for visual enhancements
   replaced by links to the documentation.
 
   By default the language that is assumed for syntax highlighting is based
-  on the location where the \\code block was found. If this part of
+  on the location where the \c \\code block was found. If this part of
   a Python file for instance, the syntax highlight will be done according
   to the Python syntax. 
 
   If it unclear from the context which language is meant (for instance the
-  comment is in a .txt or .markdown file) then you can also explicitly
+  comment is in a <code>.txt</code> or <code>.markdown</code> file) then you can also explicitly
   indicate the language, by putting the file extension typically
   that doxygen associated with the language in curly brackets after the
   code block. Here is an example:
@@ -2251,7 +2325,7 @@ Commands for visual enhancements
   Qualified names are only needed if the context in which the documentation
   block is found requires them.
 
-  The \\copydoc command can be used recursively, but cycles in the \\copydoc
+  The \c \\copydoc command can be used recursively, but cycles in the \c \\copydoc
   relation will be broken and flagged as an error.
 
   Note that <code>\\copydoc foo()</code> is roughly equivalent to doing:
@@ -2276,6 +2350,21 @@ Works in a similar way as \ref cmdcopydoc "\\copydoc" but will
 only copy the detailed documentation, not the brief description.
 
 <hr>
+\section cmddocbookonly \\docbookonly
+
+  \addindex \\docbookonly
+  Starts a block of text that will be verbatim included in the
+  generated docbook documentation only. The block ends with a
+  \ref cmdenddocbookonly "\\enddocbookonly" command.
+
+  \sa section \ref cmdmanonly "\\manonly", 
+              \ref cmdxmlonly "\\xmlonly", 
+              \ref cmdlatexonly "\\latexonly", 
+              \ref cmdrtfonly "\\rtfonly", 
+              \ref cmdxmlonly "\\xmlonly", and 
+              \ref cmdhtmlonly "\\htmlonly".
+
+<hr>
 \section cmddot \\dot
 
   \addindex \\dot
@@ -2322,7 +2411,7 @@ class C {};
   \note You need to install the <code>mscgen</code> tool, if you want to use this
   command.
 
-Here is an example of the use of the \\msc command.
+Here is an example of the use of the \c \\msc command.
 \code
 /** Sender class. Can be used to send a command to the server.
  *  The receiver will acknowledge the command by calling Ack().
@@ -2441,22 +2530,30 @@ class Receiver
   \sa section \ref cmdcode "\\code"
 
 <hr>
+\section cmdenddocbookonly \\enddocbookonly
+
+  \addindex \\enddocbookonly
+  Ends a block of text that was started with a \ref cmddocbookonly "\\docbookonly" command.
+
+  \sa section \ref cmddocbookonly "\\docbookonly".
+
+<hr>
 \section cmdenddot \\enddot
 
   \addindex \\enddot
-  Ends a blocks that was started with \ref cmddot "\\dot".
+  Ends a block that was started with \ref cmddot "\\dot".
 
 <hr>
 \section cmdendmsc \\endmsc
 
   \addindex \\endmsc
-  Ends a blocks that was started with \ref cmdmsc "\\msc".
+  Ends a block that was started with \ref cmdmsc "\\msc".
 
 <hr>
 \section cmdendhtmlonly \\endhtmlonly
 
   \addindex \\endhtmlonly
-  Ends a block of text that was started with a \\htmlonly command.
+  Ends a block of text that was started with a \ref cmdhtmlonly "\\htmlonly" command.
 
   \sa section \ref cmdhtmlonly "\\htmlonly".
 
@@ -2464,7 +2561,7 @@ class Receiver
 \section cmdendlatexonly \\endlatexonly
 
   \addindex \\endlatexonly
-  Ends a block of text that was started with a \\latexonly command.
+  Ends a block of text that was started with a \ref cmdlatexonly "\\latexonly" command.
 
   \sa section \ref cmdlatexonly "\\latexonly".
 
@@ -2472,7 +2569,7 @@ class Receiver
 \section cmdendmanonly \\endmanonly
 
   \addindex \\endmanonly
-  Ends a block of text that was started with a \\manonly command.
+  Ends a block of text that was started with a \ref cmdmanonly "\\manonly" command.
 
   \sa section \ref cmdmanonly "\\manonly".
 
@@ -2480,7 +2577,7 @@ class Receiver
 \section cmdendrtfonly \\endrtfonly
 
   \addindex \\endrtfonly
-  Ends a block of text that was started with a \\rtfonly command.
+  Ends a block of text that was started with a \ref cmdrtfonly "\\rtfonly" command.
 
   \sa section \ref cmdrtfonly "\\rtfonly".
 
@@ -2489,7 +2586,7 @@ class Receiver
 \section cmdendverbatim \\endverbatim
 
   \addindex \\endverbatim
-  Ends a block of text that was started with a \\verbatim command.
+  Ends a block of text that was started with a \ref cmdverbatim "\\verbatim" command.
 
   \sa section \ref cmdverbatim "\\verbatim".
 
@@ -2497,7 +2594,7 @@ class Receiver
 \section cmdendxmlonly \\endxmlonly
 
   \addindex \\endxmlonly
-  Ends a block of text that was started with a \\xmlonly command.
+  Ends a block of text that was started with a \ref cmdxmlonly "\\xmlonly" command.
 
   \sa section \ref cmdxmlonly "\\xmlonly".
 
@@ -2531,7 +2628,7 @@ class Receiver
 \section cmdfcurlyopen \\f{environment}{
 
   Marks the start of a formula that is in a specific environment.
-  \note The second { is optional and is only to help editors (such as Vim) to
+  \note The second \c { is optional and is only to help editors (such as \c Vim) to
   do proper syntax highlighting by making the number of opening and closing braces
   the same.
   \sa section \ref cmdfcurlyclose "\\f}" and section \ref formulas "formulas".
@@ -2548,19 +2645,23 @@ class Receiver
   \addindex \\htmlonly
   Starts a block of text that will be verbatim included in the
   generated HTML documentation only. The block ends with a
-  \ref cmdhtmlonly "\\endhtmlonly" command.
+  \ref cmdendhtmlonly "\\endhtmlonly" command.
 
   This command can be used to include HTML code that is too complex
   for doxygen (i.e. applets, java-scripts, and HTML tags that
-  require attributes). You can use the \\latexonly and \\endlatexonly
+  require attributes). You can use the \ref cmdlatexonly "\\latexonly" and 
+  \ref cmdendlatexonly "\\endlatexonly"
   pair to provide a proper \f$\mbox{\LaTeX}\f$ alternative.
 
   \note environment variables (like \$(HOME) ) are resolved inside a
     HTML-only block.
 
-  \sa section \ref cmdmanonly "\\manonly", section
-              \ref cmdlatexonly "\\latexonly", and section
-              \ref cmdrtfonly "\\rtfonly".
+  \sa section \ref cmdmanonly "\\manonly", 
+              \ref cmdxmlonly "\\xmlonly", 
+              \ref cmdlatexonly "\\latexonly", 
+              \ref cmdrtfonly "\\rtfonly", 
+              \ref cmdxmlonly "\\xmlonly", and 
+              \ref cmddocbookonly "\\docbookonly".
 
 <hr>
 \section cmdimage \\image <format> <file> ["caption"] [<sizeindication>=<size>]
@@ -2627,17 +2728,18 @@ class Receiver
 
   This command can be used to include \f$\mbox{\LaTeX}\f$ code that is too
   complex for doxygen (i.e. images, formulas, special characters). You can
-  use the \\htmlonly and \\endhtmlonly pair to provide a proper HTML
-  alternative.
+  use the \ref cmdhtmlonly "\\htmlonly" and \ref cmdendhtmlonly "\\endhtmlonly"
+  pair to provide a proper HTML alternative.
 
   \b Note:
     environment variables (like \$(HOME) ) are resolved inside a
     \f$\mbox{\LaTeX}\f$-only block.
 
-  \sa section \ref cmdrtfonly "\\rtfonly",
-      section \ref cmdxmlonly "\\xmlonly",
-      section \ref cmdmanonly "\\manonly", and
-      section \ref cmdhtmlonly "\\htmlonly".
+  \sa sections \ref cmdrtfonly "\\rtfonly",
+               \ref cmdxmlonly "\\xmlonly",
+               \ref cmdmanonly "\\manonly",
+               \ref cmdhtmlonly "\\htmlonly", and
+               \ref cmdhtmlonly "\\docbookonly".
 
 <hr>
 \section cmdmanonly \\manonly
@@ -2648,24 +2750,27 @@ class Receiver
   \ref cmdendmanonly "\\endmanonly" command.
 
   This command can be used to include groff code directly into
-  MAN pages. You can use the \\htmlonly and \\latexonly and
-  \\endhtmlonly and \\endlatexonly pairs to provide proper
+  MAN pages. You can use the \ref cmdhtmlonly "\\htmlonly" and
+  \ref cmdendhtmlonly "\\endhtmlonly" and
+  \ref cmdlatexonly "\\latexonly" and
+  \ref cmdendlatexonly "\\endlatexonly" pairs to provide proper
   HTML and \f$\mbox{\LaTeX}\f$ alternatives.
 
-  \sa section \ref cmdhtmlonly "\\htmlonly",
-      section \ref cmdxmlonly "\\xmlonly",
-      section \ref cmdrtfonly "\\rtfonly", and
-      section \ref cmdlatexonly "\\latexonly".
+  \sa sections \ref cmdhtmlonly "\\htmlonly",
+               \ref cmdxmlonly "\\xmlonly",
+               \ref cmdrtfonly "\\rtfonly",
+               \ref cmdlatexonly "\\latexonly", and
+               \ref cmddocbookonly "\\docbookonly".
 
 <hr>
 \section cmdli \\li { item-description }
 
   \addindex \\li
   This command has one argument that continues until the first
-  blank line or until another \\li is encountered.
+  blank line or until another \c \\li is encountered.
   The command can be used to generate a simple, not nested list of
   arguments.
-  Each argument should start with a \\li command.
+  Each argument should start with a \c \\li command.
 
   \par Example:
   Typing:
@@ -2694,7 +2799,7 @@ class Receiver
 
   \addindex \\n
   Forces a new line. Equivalent to \<br\> and inspired by
-  the printf function.
+  the \c printf function.
 
 <hr>
 \section cmdp \\p <word>
@@ -2729,10 +2834,11 @@ class Receiver
     environment variables (like \$(HOME) ) are resolved inside a
     RTF-only block.
 
-  \sa section \ref cmdmanonly "\\manonly", section
-              \ref cmdxmlonly "\\xmlonly", section
-              \ref cmdlatexonly "\\latexonly", and section
-              \ref cmdhtmlonly "\\htmlonly".
+  \sa sections \ref cmdmanonly "\\manonly",
+               \ref cmdxmlonly "\\xmlonly",
+               \ref cmdlatexonly "\\latexonly",
+               \ref cmdhtmlonly "\\htmlonly", and
+               \ref cmddocbookonly "\\docbookonly".
 
 <hr>
 \section cmdverbatim \\verbatim
@@ -2740,14 +2846,15 @@ class Receiver
   \addindex \\verbatim
   Starts a block of text that will be verbatim included in
   the documentation. The block should end with a
-  \ref cmdendverbatim "\\endverbatim" block.
+  \ref cmdendverbatim "\\endverbatim" command.
   All commands are disabled in a verbatim block.
 
-  \warning Make sure you include a \\endverbatim command for each
-  \\verbatim command or the parser will get confused!
+  \warning Make sure you include a \ref cmdendverbatim "\\endverbatim" command for each
+  \c \\verbatim command or the parser will get confused!
 
-  \sa section \ref cmdcode "\\code", and
-      section \ref cmdverbinclude "\\verbinclude".
+  \sa sections \ref cmdcode "\\code",
+               \ref cmdendverbatim "\\endverbatim", and
+               \ref cmdverbinclude "\\verbinclude".
 
 <hr>
 \section cmdxmlonly \\xmlonly
@@ -2755,20 +2862,21 @@ class Receiver
   \addindex \\xmlonly
   Starts a block of text that will be verbatim included in the
   generated XML output only. The block ends with a
-  endxmlonly command.
+  \ref cmdendxmlonly "\\endxmlonly" command.
 
   This command can be used to include custom XML tags.
 
-  \sa section \ref cmdmanonly "\\manonly", section
-              \ref cmdrtfonly "\\rtfonly", section
-              \ref cmdlatexonly "\\latexonly", and section
-              \ref cmdhtmlonly "\\htmlonly".
+  \sa sections \ref cmdmanonly "\\manonly",
+               \ref cmdrtfonly "\\rtfonly",
+               \ref cmdlatexonly "\\latexonly",
+               \ref cmdhtmlonly "\\htmlonly", and
+               \ref cmddocbookonly "\\docbookonly".
 
 <hr>
 \section cmdbackslash \\\\
 
   \addindex \\\\
-  This command writes a backslash character (\\) to the
+  This command writes a backslash character (\c \\) to the
   output. The backslash has to be escaped in some
   cases because doxygen uses it to detect commands.
 
@@ -2776,7 +2884,7 @@ class Receiver
 \section cmdat \\\@
 
   \addindex \\\@
-  This command writes an at-sign (\@) to the output.
+  This command writes an at-sign (\c \@) to the output.
   The at-sign has to be escaped in some cases
   because doxygen uses it to detect JavaDoc commands.
 
@@ -2785,14 +2893,14 @@ class Receiver
   \addindex \\~
   This command enables/disables a language specific filter. This can be
   used to put documentation for different language into one comment block
-  and use the \c OUTPUT_LANGUAGE tag to filter out only a specific language.
-  Use \\~language_id to enable output for a specific language only and
-  \\~ to enable output for all languages (this is also the default mode).
+  and use the \ref cfg_output_language "OUTPUT_LANGUAGE" tag to filter out only a specific language.
+  Use \c \\~language_id to enable output for a specific language only and
+  \c \\~ to enable output for all languages (this is also the default mode).
 
   Example:
 \verbatim
-/*! \~english This is english \~dutch Dit is Nederlands \~german Dieses ist
-    deutsch. \~ output for all languages.
+/*! \~english This is English \~dutch Dit is Nederlands \~german Dies ist
+    Deutsch. \~ output for all languages.
  */
 \endverbatim
 
@@ -2801,14 +2909,14 @@ class Receiver
 \section cmdamp \\\&
 
   \addindex \\\&
-  This command writes the \& character to output.
+  This command writes the \c \& character to output.
   This character has to be escaped because it has a special meaning in HTML.
 
 <hr>
 \section cmddollar \\\$
 
   \addindex \\\$
-  This command writes the \$ character to the output.
+  This command writes the \c \$ character to the output.
   This character has to be escaped in some cases, because it is used to expand
   environment variables.
 
@@ -2816,7 +2924,7 @@ class Receiver
 \section cmdhash \\\#
 
   \addindex \\\#
-  This command writes the \# character to the output. This
+  This command writes the \c \# character to the output. This
   character has to be escaped in some cases, because it is used to refer
   to documented entities.
 
@@ -2824,21 +2932,21 @@ class Receiver
 \section cmdlt \\\<
 
   \addindex \\\<
-  This command writes the \< character to the output.
+  This command writes the \c \< character to the output.
   This character has to be escaped because it has a special meaning in HTML.
 
 <hr>
 \section cmdgt \\\>
 
   \addindex \\\>
-  This command writes the \> character to the output. This
+  This command writes the \c \> character to the output. This
   character has to be escaped because it has a special meaning in HTML.
 
 <hr>
 \section cmdperc \\\%
 
   \addindex \\\%
-  This command writes the \% character to the output. This
+  This command writes the \c \% character to the output. This
   character has to be escaped in some cases, because it is used to
   prevent auto-linking to word that is also a documented class or struct.
 
@@ -2846,7 +2954,7 @@ class Receiver
 \section cmdquot \\"
 
   \addindex \\\"
-  This command writes the \" character to the output. This
+  This command writes the \c \" character to the output. This
   character has to be escaped in some cases, because it is used in pairs
   to indicate an unformatted text fragment.
 
@@ -2854,7 +2962,7 @@ class Receiver
 \section cmdchardot \\.
 
   \addindex \\\.
-  This command writes a dot to the output. This can be useful to 
+  This command writes a dot (\c .) to the output. This can be useful to 
   prevent ending a brief description when JAVADOC_AUTOBRIEF is enabled
   or to prevent starting a numbered list when the dot follows a number at
   the start of a line.
@@ -2863,9 +2971,17 @@ class Receiver
 \section cmddcolon \\::
 
   \addindex \\\::
-  This command write a double colon (\::) to the output. This
+  This command write a double colon (\c \::) to the output. This
   character sequence has to be escaped in some cases, because it is used
-  to ref to documented entities.
+  to reference to documented entities.
+
+<hr>
+\section cmdpipe \\|
+
+  \addindex \\|
+  This command write a pip symbol (\|) to the output. This
+  character has to be escaped in some cases, because it is used
+  for Markdown tables.
 
 <hr>
 \htmlonly <center> \endhtmlonly
@@ -2891,5 +3007,11 @@ browser generator. Do \e not use these commands in your own documentation.
 </ul>
 <hr>
 
+
+\htmlonly
+Go to the <a href="htmlcmds.html">next</a> section or return to the
+ <a href="index.html">index</a>.
+\endhtmlonly
+
 */
 
index 2fdabb0..6bd0b84 100644 (file)
@@ -1,8 +1,8 @@
-/******************************************************************************
+e******************************************************************************
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
 \section config_format Format
 
 A configuration file is a free-form ASCII text file with a structure
-that is similar to that of a Makefile, with the default name \c Doxyfile. It is
-parsed by \c doxygen.  The file may contain tabs and newlines for
-formatting purposes.  The statements in the file are case-sensitive.
+that is similar to that of a \c Makefile, with the default name \c Doxyfile. It is
+parsed by \c doxygen. The file may contain tabs and newlines for
+formatting purposes. The statements in the file are case-sensitive.
 Comments may be placed anywhere within the file (except within quotes).
-Comments begin with the \# character and end at the end of the line.
+Comments beginning with two hash characters (\c \#\#) are kept when updating
+the configuration file and are placed in front of the TAG are in front of.
+Comments beginning with two hash characters (\c \#\#) at the end of the
+configuration file are also kept and placed at the end of the file.
+Comments begin with the hash character (\c \#) and ends at the end of the line.
 
 The file essentially consists of a list of assignment statements.
 Each statement consists of a \c TAG_NAME written in capitals,
-followed by the <code>=</code> character and one or more values. If the same tag
+followed by the equal sign (<code>=</code>) and one or more values. If the same tag
 is assigned more than once, the last assignment overwrites any earlier
-assignment. For options that take a list as their argument,
+assignment. For tags that take a list as their argument,
 the <code>+=</code> operator can be used instead of <code>=</code> to append 
 new values to the list. Values are sequences of non-blanks. If the value should 
-contain one or more blanks it must be surrounded by quotes (&quot;...&quot;).
-Multiple lines can be concatenated by inserting a backslash (\\)
+contain one or more blanks it must be surrounded by quotes (<code>&quot;...&quot;</code>).
+Multiple lines can be concatenated by inserting a backslash (\c \\)
 as the last character of a line. Environment variables can be expanded 
 using the pattern <code>\$(ENV_VARIABLE_NAME)</code>.
 
@@ -71,6 +75,8 @@ followed by the descriptions of the tags grouped by category.
 \refitem cfg_chm_file CHM_FILE
 \refitem cfg_chm_index_encoding CHM_INDEX_ENCODING
 \refitem cfg_cite_bib_files CITE_BIB_FILES
+\refitem cfg_clang_assisted_parsig CLANG_ASSISTED_PARSING
+\refitem cfg_clang_options CLANG_OPTIONS
 \refitem cfg_class_diagrams CLASS_DIAGRAMS 
 \refitem cfg_class_graph CLASS_GRAPH
 \refitem cfg_collaboration_graph COLLABORATION_GRAPH
@@ -82,6 +88,7 @@ followed by the descriptions of the tags grouped by category.
 \refitem cfg_directory_graph DIRECTORY_GRAPH
 \refitem cfg_disable_index DISABLE_INDEX 
 \refitem cfg_distribute_group_doc DISTRIBUTE_GROUP_DOC
+\refitem cfg_docbook_output DOCBOOK_OUTPUT
 \refitem cfg_docset_bundle_id DOCSET_BUNDLE_ID
 \refitem cfg_docset_feedname DOCSET_FEEDNAME
 \refitem cfg_docset_publisher_id DOCSET_PUBLISHER_ID
@@ -114,13 +121,16 @@ followed by the descriptions of the tags grouped by category.
 \refitem cfg_ext_links_in_window EXT_LINKS_IN_WINDOW
 \refitem cfg_extension_mapping EXTENSION_MAPPING
 \refitem cfg_external_groups EXTERNAL_GROUPS
+\refitem cfg_external_pages EXTERNAL_PAGES
 \refitem cfg_external_search EXTERNAL_SEARCH
+\refitem cfg_external_search_id EXTERNAL_SEARCH_ID
 \refitem cfg_extra_packages EXTRA_PACKAGES
 \refitem cfg_extra_search_mappings EXTRA_SEARCH_MAPPINGS
 \refitem cfg_extract_all EXTRACT_ALL
 \refitem cfg_extract_anon_nspaces EXTRACT_ANON_NSPACES
 \refitem cfg_extract_local_classes EXTRACT_LOCAL_CLASSES
 \refitem cfg_extract_local_methods EXTRACT_LOCAL_METHODS
+\refitem cfg_extract_package EXTRACT_PACKAGE
 \refitem cfg_extract_private EXTRACT_PRIVATE
 \refitem cfg_extract_static EXTRACT_STATIC
 \refitem cfg_file_patterns FILE_PATTERNS
@@ -135,7 +145,8 @@ followed by the descriptions of the tags grouped by category.
 \refitem cfg_generate_autogen_def GENERATE_AUTOGEN_DEF
 \refitem cfg_generate_buglist GENERATE_BUGLIST
 \refitem cfg_generate_chi GENERATE_CHI
-\refitem cfg_generate_deprecatedlist GENERATE_DEPRECIATEDLIST
+\refitem cfg_generate_deprecatedlist GENERATE_DEPRECATEDLIST
+\refitem cfg_generate_docbook GENERATE_DOCBOOK
 \refitem cfg_generate_docset GENERATE_DOCSET
 \refitem cfg_generate_eclipsehelp GENERATE_ECLIPSEHELP
 \refitem cfg_generate_html GENERATE_HTML
@@ -186,6 +197,7 @@ followed by the descriptions of the tags grouped by category.
 \refitem cfg_inline_grouped_classes INLINE_GROUPED_CLASSES
 \refitem cfg_inline_info INLINE_INFO
 \refitem cfg_inline_inherited_memb INLINE_INHERITED_MEMB
+\refitem cfg_inline_simple_structs INLINE_SIMPLE_STRUCTS
 \refitem cfg_inline_sources INLINE_SOURCES
 \refitem cfg_input INPUT
 \refitem cfg_input_encoding INPUT_ENCODING
@@ -196,6 +208,7 @@ followed by the descriptions of the tags grouped by category.
 \refitem cfg_latex_batchmode LATEX_BATCHMODE
 \refitem cfg_latex_bib_style LATEX_BIB_STYLE
 \refitem cfg_latex_cmd_name LATEX_CMD_NAME
+\refitem cfg_latex_extra_files LATEX_EXTRA_FILES
 \refitem cfg_latex_footer LATEX_FOOTER
 \refitem cfg_latex_header LATEX_HEADER
 \refitem cfg_latex_hide_indices LATEX_HIDE_INDICES
@@ -212,6 +225,7 @@ followed by the descriptions of the tags grouped by category.
 \refitem cfg_mathjax_extensions MATHJAX_EXTENSIONS
 \refitem cfg_mathjax_format MATHJAX_FORMAT
 \refitem cfg_mathjax_relpath MATHJAX_RELPATH
+\refitem cfg_mathjax_codefile MATHJAX_CODEFILE
 \refitem cfg_max_dot_graph_depth MAX_DOT_GRAPH_DEPTH
 \refitem cfg_max_initializer_lines MAX_INITIALIZER_LINES
 \refitem cfg_mscfile_dirs MSCFILE_DIRS
@@ -271,13 +285,14 @@ followed by the descriptions of the tags grouped by category.
 \refitem cfg_sort_member_docs SORT_MEMBER_DOCS
 \refitem cfg_sort_members_constructors_first SORT_MEMBERS_CTORS_1ST
 \refitem cfg_source_browser SOURCE_BROWSER
+\refitem cfg_strict_proto_matching STRICT_PROTO_MATCHING
 \refitem cfg_strip_code_comments STRIP_CODE_COMMENTS
 \refitem cfg_strip_from_inc_path STRIP_FROM_INC_PATH
 \refitem cfg_strip_from_path STRIP_FROM_PATH
 \refitem cfg_subgrouping SUBGROUPING
-\refitem cfg_symbol_cache_size SYMBOL_CACHE_SIZE
 \refitem cfg_tab_size TAB_SIZE
 \refitem cfg_tagfiles TAGFILES
+\refitem cfg_tcl_subst TCL_SUBST
 \refitem cfg_template_relations TEMPLATE_RELATIONS
 \refitem cfg_toc_expand TOC_EXPAND
 \refitem cfg_treeview_width TREEVIEW_WIDTH
@@ -309,8 +324,8 @@ followed by the descriptions of the tags grouped by category.
  \addindex DOXYFILE_ENCODING
  This tag specifies the encoding used for all characters in the config file that 
  follow. The default is UTF-8 which is also the encoding used for all text before
- the first occurrence of this tag. Doxygen uses libiconv (or the iconv built into
- libc) for the transcoding. See http://www.gnu.org/software/libiconv for the list of
+ the first occurrence of this tag. Doxygen uses \c libiconv (or the iconv built into
\c libc) for the transcoding. See http://www.gnu.org/software/libiconv for the list of
  possible encodings.
 
 \anchor cfg_project_name
@@ -368,16 +383,16 @@ followed by the descriptions of the tags grouped by category.
  The default language is English, other supported languages are:
  Afrikaans, Arabic, Brazilian, Catalan, Chinese, Croatian, Czech, Danish, Dutch, 
  Finnish, French, German, Greek, Hungarian, Italian, Japanese, Korean, 
- Lithuanian, Norwegian, Persian, Polish, Portuguese, Romanian, Russian, Serbian, 
- Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, and Ukrainian.
+ Latvian, Lithuanian, Norwegian, Persian, Polish, Portuguese, Romanian, Russian, 
+ Serbian,  Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, and Ukrainian.
 
 \anchor cfg_brief_member_desc
 <dt>\c BRIEF_MEMBER_DESC <dd>
  \addindex BRIEF_MEMBER_DESC
  If the \c BRIEF_MEMBER_DESC tag is set to \c YES (the default) doxygen will
  include brief member descriptions after the members that are listed in
- the file and class documentation (similar to JavaDoc).
- Set to NO to disable this.
+ the file and class documentation (similar to \c Javadoc).
+ Set to \c NO to disable this.
 
 \anchor cfg_repeat_brief
 <dt>\c REPEAT_BRIEF <dd>
@@ -387,7 +402,8 @@ followed by the descriptions of the tags grouped by category.
  description 
 
  \par Note: 
- If both \c HIDE_UNDOC_MEMBERS and \c BRIEF_MEMBER_DESC are set to \c NO, the 
+ If both \ref cfg_hide_undoc_members "HIDE_UNDOC_MEMBERS" and
+ \ref cfg_brief_member_desc "BRIEF_MEMBER_DESC" are set to \c NO, the 
  brief descriptions will be completely suppressed.
 
 \anchor cfg_abbreviate_brief
@@ -396,16 +412,17 @@ followed by the descriptions of the tags grouped by category.
  This tag implements a quasi-intelligent brief description abbreviator
  that is used to form the text in various listings. Each string
  in this list, if found as the leading text of the brief description, will be
- stripped from the text and the result after processing the whole list, is used
+ stripped from the text and the result, after processing the whole list, is used
  as the annotated text. Otherwise, the brief description is used as-is. If left
- blank, the following values are used ("\$name" is automatically replaced with the
+ blank, the following values are used ("$name" is automatically replaced with the
  name of the entity): "The $name class" "The $name widget" "The $name file"
  "is" "provides" "specifies" "contains" "represents" "a" "an" "the".
 
 \anchor cfg_always_detailed_sec
 <dt>\c ALWAYS_DETAILED_SEC <dd>
  \addindex ALWAYS_DETAILED_SEC
- If the \c ALWAYS_DETAILED_SEC and \c REPEAT_BRIEF tags are both set to \c YES then
+ If the \c ALWAYS_DETAILED_SEC and \ref cfg_repeat_brief "REPEAT_BRIEF" tags 
+ are both set to \c YES then
  doxygen will generate a detailed section even if there is only a brief
  description.
 
@@ -422,12 +439,12 @@ followed by the descriptions of the tags grouped by category.
  \addindex FULL_PATH_NAMES
  If the \c FULL_PATH_NAMES tag is set to \c YES doxygen will prepend the full
  path before files name in the file list and in the header files. If set
- to NO the shortest path that makes the file name unique will be used
+ to \c NO the shortest path that makes the file name unique will be used
 
 \anchor cfg_strip_from_path
 <dt>\c STRIP_FROM_PATH <dd>
  \addindex STRIP_FROM_PATH
- If the \c FULL_PATH_NAMES tag is set to \c YES then the \c STRIP_FROM_PATH tag
+ If the \ref cfg_full_path_names "FULL_PATH_NAMES" tag is set to \c YES then the \c STRIP_FROM_PATH tag
  can be used to strip a user-defined part of the path. Stripping is
  only done if one of the specified strings matches the left-hand part of the 
  path. The tag can be used to show relative paths in the file list.
@@ -442,7 +459,7 @@ followed by the descriptions of the tags grouped by category.
  the reader which header file to include in order to use a class. 
  If left blank only the name of the header file containing the class
  definition is used. Otherwise one should specify the include paths that 
- are normally passed to the compiler using the -I flag.
+ are normally passed to the compiler using the `-I` flag.
 
 \anchor cfg_short_names
 <dt>\c SHORT_NAMES <dd>
@@ -455,19 +472,19 @@ followed by the descriptions of the tags grouped by category.
 <dt>\c JAVADOC_AUTOBRIEF <dd>
  \addindex JAVADOC_AUTOBRIEF
   If the \c JAVADOC_AUTOBRIEF is set to \c YES then doxygen
-  will interpret the first line (until the first dot) of a JavaDoc-style
-  comment as the brief description. If set to NO (the default), the 
+  will interpret the first line (until the first dot) of a Javadoc-style
+  comment as the brief description. If set to \c NO (the default), the 
   Javadoc-style will behave just like regular Qt-style comments
-  (thus requiring an explicit \@brief command for a brief description.)
+  (thus requiring an explicit \ref cmdbrief "\@brief" command for a brief description.)
 
 \anchor cfg_qt_autobrief
 <dt>\c QT_AUTOBRIEF <dd>
  \addindex QT_AUTOBRIEF
   If the \c QT_AUTOBRIEF is set to \c YES then doxygen
   will interpret the first line (until the first dot) of a Qt-style
-  comment as the brief description. If set to NO (the default), the
+  comment as the brief description. If set to \c NO (the default), the
   Qt-style will behave just like regular Qt-style comments (thus
-  requiring an explicit \\brief command for a brief description.)
+  requiring an explicit \ref cmdbrief "\\brief" command for a brief description.)
 
 \anchor cfg_markdown_support
 <dt>\c MARKDOWN_SUPPORT <dd>
@@ -480,33 +497,33 @@ followed by the descriptions of the tags grouped by category.
  Disable only in case of backward compatibilities issues. 
 
 \anchor cfg_autolink_support
-<dt>'c AUTOLINK_SUPPORT <dd>
+<dt>\c AUTOLINK_SUPPORT <dd>
  \addindex AUTOLINK_SUPPORT
  When enabled doxygen tries to link words that correspond to documented classes, 
  or namespaces to their corresponding documentation. Such a link can be 
- prevented in individual cases by by putting a % sign in front of the word or 
- globally by setting AUTOLINK_SUPPORT to NO.
+ prevented in individual cases by by putting a \c % sign in front of the word or 
+ globally by setting \c AUTOLINK_SUPPORT to \c NO.
 
 \anchor cfg_builtin_stl_support
 <dt>\c BUILTIN_STL_SUPPORT <dd>
  \addindex BUILTIN_STL_SUPPORT
- If you use STL classes (i.e. std::string, std::vector, etc.) but do not want to
+ If you use STL classes (i.e. `std::string`, `std::vector`, etc.) but do not want to
  include (a tag file for) the STL sources as input, then you should
  set this tag to \c YES in order to let doxygen match functions declarations and
- definitions whose arguments contain STL classes (e.g. func(std::string); versus
func(std::string) {}). This also make the inheritance and collaboration
+ definitions whose arguments contain STL classes (e.g. `func(std::string`); versus
`func(std::string) {}`). This also make the inheritance and collaboration
  diagrams that involve STL classes more complete and accurate.
 
 \anchor cfg_cpp_cli_support
 <dt>\c CPP_CLI_SUPPORT <dd>
  \addindex CPP_CLI_SUPPORT
- If you use Microsoft's C++/CLI language, you should set this option to YES to
+ If you use Microsoft's C++/CLI language, you should set this option to \c YES to
  enable parsing support.
 
 \anchor cfg_sip_support
 <dt>\c SIP_SUPPORT <dd>
  \addindex OPTIMIZE_OUTPUT_SIP
- Set the SIP_SUPPORT tag to YES if your project consists 
+ Set the \c SIP_SUPPORT tag to \c YES if your project consists 
  of <a href="http://www.riverbankcomputing.co.uk/software/sip/intro">sip</a> sources only. 
  Doxygen will parse them like normal C++ but will assume all classes use public 
  instead of private inheritance when no explicit protection keyword is present. 
@@ -514,7 +531,7 @@ followed by the descriptions of the tags grouped by category.
 \anchor cfg_idl_property_support
 <dt>\c IDL_PROPERTY_SUPPORT <dd>
  \addindex IDL_PROPERTY_SUPPORT
- For Microsoft's IDL there are propget and propput attributes to indicate getter
+ For Microsoft's IDL there are \c propget and \c propput attributes to indicate getter
  and setter methods for a property. Setting this option to \c YES (the default)
  will make doxygen to replace the get and set methods by a property in the
  documentation. This will only work if the methods are indeed getting or 
@@ -524,29 +541,29 @@ followed by the descriptions of the tags grouped by category.
 \anchor cfg_distribute_group_doc
 <dt>\c DISTRIBUTE_GROUP_DOC <dd>
  \addindex DISTRIBUTE_GROUP_DOC
- If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
- tag is set to YES, then doxygen will reuse the documentation of the first
+ If member grouping is used in the documentation and the \c DISTRIBUTE_GROUP_DOC
+ tag is set to \c YES, then doxygen will reuse the documentation of the first
  member in the group (if any) for the other members of the group. By default
  all members of a group must be documented explicitly.
 
 \anchor cfg_multiline_cpp_is_brief
 <dt>\c MULTILINE_CPP_IS_BRIEF <dd>
  \addindex MULTILINE_CPP_IS_BRIEF
-  The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen
-  treat a multi-line C++ special comment block (i.e. a block of //! or ///
+  The \c MULTILINE_CPP_IS_BRIEF tag can be set to \c YES to make doxygen
+  treat a multi-line C++ special comment block (i.e. a block of \c //! or \c ///
   comments) as a brief description. This used to be the default behavior.
   The new default is to treat a multi-line C++ comment block as a detailed
-  description. Set this tag to YES if you prefer the old behavior instead.
-  Note that setting this tag to YES also means that rational rose comments
+  description. Set this tag to \c YES if you prefer the old behavior instead.
+  Note that setting this tag to \c YES also means that rational rose comments
   are not recognized any more.
 
 <!--
 \anchor cfg_details_at_top
 <dt>\c DETAILS_AT_TOP <dd>
  \addindex DETAILS_AT_TOP
-  If the DETAILS_AT_TOP tag is set to YES then Doxygen
-  will output the detailed description near the top, like JavaDoc.
-  If set to NO, the detailed description appears after the member
+  If the \c DETAILS_AT_TOP tag is set to \c YES then doxygen
+  will output the detailed description near the top, like \c Javadoc.
+  If set to \c NO, the detailed description appears after the member
   documentation.
 -->
 
@@ -585,7 +602,15 @@ followed by the descriptions of the tags grouped by category.
  will allow you to
  put the command \\sideeffect (or \@sideeffect) in the documentation, which 
  will result in a user-defined paragraph with heading "Side Effects:".
- You can put \\n's in the value part of an alias to insert newlines.
+ You can put \ref cmdn "\\n"'s in the value part of an alias to insert newlines.
+
+\anchor cfg_tcl_subst
+<dt>\c TCL_SUBST <dd>
+ \addindex TCL_SUBST
+ This tag can be used to specify a number of word-keyword mappings (TCL only). 
+ A mapping has the form "name=value". For example adding 
+ "class=itcl::class" will allow you to use the command class in the 
+ itcl::class meaning.
 
 \anchor cfg_optimize_output_for_c
 <dt>\c OPTIMIZE_OUTPUT_FOR_C <dd>
@@ -598,7 +623,7 @@ followed by the descriptions of the tags grouped by category.
 \anchor cfg_optimize_output_java
 <dt>\c OPTIMIZE_OUTPUT_JAVA <dd>
  \addindex OPTIMIZE_OUTPUT_JAVA
- Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or
+ Set the OPTIMIZE_OUTPUT_JAVA tag to \c YES if your project consists of Java or
  Python sources only. Doxygen will then generate output that is more tailored 
  for that language. For instance, namespaces will be presented as packages, 
  qualified scopes will look different, etc. 
@@ -623,9 +648,13 @@ followed by the descriptions of the tags grouped by category.
  Doxygen has a built-in mapping, but you can override or extend it using this tag.
  The format is ext=language, where ext is a file extension, and language is one of
  the parsers supported by doxygen: IDL, Java, Javascript, C#, C, C++, D, PHP,
- Objective-C, Python, Fortran, VHDL. For instance to make doxygen treat
+ Objective-C, Python, Fortran, VHDL. 
+
+ For instance to make doxygen treat
  .inc files as Fortran files (default is PHP), and .f files as C (default is Fortran),
- use: inc=Fortran f=C
+ use: `inc=Fortran f=C`.
+
+ For files without extension you can use `no_extension` as a placeholder.
 
 \anchor cfg_subgrouping
 <dt>\c SUBGROUPING <dd>
@@ -641,10 +670,20 @@ followed by the descriptions of the tags grouped by category.
  \addindex INLINE_GROUPED_CLASSES
 When the \c INLINE_GROUPED_CLASSES tag is set to \c YES, classes, structs and 
 unions are shown inside the group in which they are included 
-(e.g. using @@ingroup) instead of on a separate page (for HTML and Man pages) 
-or section (for LaTeX and RTF). Note that this feature does not work in
+(e.g. using \ref cmdingroup "\\ingroup") instead of on a separate page (for HTML and Man pages) 
+or section (for \f$\mbox{\LaTeX}\f$ and RTF). Note that this feature does not work in
 combination with \ref cfg_separate_member_pages "SEPARATE_MEMBER_PAGES".
 
+\anchor cfg_inline_simple_structs
+<dt>\c INLINE_SIMPLE_STRUCTS <dd>
+ \addindex INLINE_SIMPLE_STRUCTS
+When the \c INLINE_SIMPLE_STRUCTS tag is set to \c YES, structs, classes, and 
+unions with only public data fields or simple typedef fields will be shown 
+inline in the documentation of the scope in which they are defined (i.e. file, 
+namespace, or group documentation), provided this scope is documented. If set 
+to \c NO (the default), structs, classes, and unions are shown on a separate 
+page (for HTML and Man pages) or section (for \f$\mbox{\LaTeX}\f$ and RTF).
+
 \anchor cfg_typedef_hides_struct 
 <dt>\c TYPEDEF_HIDES_STRUCT <dd>
  \addindex TYPEDEF_HIDES_STRUCT
@@ -656,34 +695,19 @@ combination with \ref cfg_separate_member_pages "SEPARATE_MEMBER_PAGES".
  be useful for C code in case the coding convention dictates that all compound 
  types are typedef'ed and only the typedef is referenced, never the tag name.
 
-\anchor cfg_symbol_cache_size
-<dt>\c SYMBOL_CACHE_SIZE <dd>
- \addindex SYMBOL_CACHE_SIZE
- The \c SYMBOL_CACHE_SIZE determines the size of the internal cache use to 
- determine which symbols to keep in memory and which to flush to disk.
- When the cache is full, less often used symbols will be written to disk.
- For small to medium size projects (<1000 input files) the default value is
- probably good enough. For larger projects a too small cache size can cause 
- doxygen to be busy swapping symbols to and from disk most of the time
- causing a significant performance penalty.
- If the system has enough physical memory increasing the cache will improve the
- performance by keeping more symbols in memory. Note that the value works on
- a logarithmic scale so increasing the size by one will roughly double the
- memory usage. The cache size is given by this formula: 
- \f$2^{(16+\mbox{SYMBOL\_CACHE\_SIZE})}\f$. The valid range is 0..9, the default is 0, 
- corresponding to a cache size of \f$2^{16} = 65536\f$ symbols.
-
 \anchor cfg_lookup_cache_size
 <dt>\c LOOKUP_CACHE_SIZE <dd>
  \addindex LOOKUP_CACHE_SIZE
Similar to the \c SYMBOL_CACHE_SIZE the size of the symbol lookup cache can be 
The size of the symbol lookup cache can be 
  set using \c LOOKUP_CACHE_SIZE. This cache is used to resolve symbols given 
  their name and scope. Since this can be an expensive process and often the 
- same symbol appear multiple times in the code, doxygen keeps a cache of 
+ same symbol appears multiple times in the code, doxygen keeps a cache of 
  pre-resolved symbols. If the cache is too small doxygen will become slower. 
  If the cache is too large, memory is wasted. The cache size is given by this 
  formula: \f$2^{(16+\mbox{LOOKUP\_CACHE\_SIZE})}\f$. The valid range is 0..9, the default is 0, 
  corresponding to a cache size of \f$2^{16} = 65536\f$ symbols. 
+ At the end of a run doxygen will report the cache usage and suggest the
+ optimal cache size from a speed point of view.
 
 </dl>
 
@@ -696,11 +720,12 @@ combination with \ref cfg_separate_member_pages "SEPARATE_MEMBER_PAGES".
  If the \c EXTRACT_ALL tag is set to \c YES doxygen will assume all 
  entities in documentation are documented, even if no documentation was 
  available. Private class members and static file members will be hidden 
- unless the \c EXTRACT_PRIVATE and \c EXTRACT_STATIC tags are set to \c YES
+ unless the \ref cfg_extract_private "EXTRACT_PRIVATE" respectively 
+ \ref cfg_extract_static "EXTRACT_STATIC" tags are set to \c YES
 
- \par Note: 
This will also disable the warnings about undocumented member
that are normally produced when \c WARNINGS is set to \c YES
+ \note This will also disable the warnings about undocumented members 
that are normally produced when \ref cfg_warnings "WARNINGS" i
+ set to \c YES
 
 \anchor cfg_extract_private
 <dt>\c EXTRACT_PRIVATE <dd>
@@ -708,6 +733,12 @@ combination with \ref cfg_separate_member_pages "SEPARATE_MEMBER_PAGES".
  If the \c EXTRACT_PRIVATE tag is set to \c YES all private members of a 
  class will be included in the documentation.
 
+\anchor cfg_extract_package
+<dt>\c EXTRACT_PACKAGE <dd>
+ \addindex EXTRACT_PACKAGE
+ If the \c EXTRACT_PACKAGE tag is set to \c YES all members with package 
+ or internal scope will be included in the documentation. 
+
 \anchor cfg_extract_static
 <dt>\c EXTRACT_STATIC <dd>
  \addindex EXTRACT_STATIC
@@ -719,13 +750,13 @@ combination with \ref cfg_separate_member_pages "SEPARATE_MEMBER_PAGES".
  \addindex EXTRACT_LOCAL_CLASSES
  If the \c EXTRACT_LOCAL_CLASSES tag is set to \c YES classes (and structs) 
  defined locally in source files will be included in the documentation. 
- If set to NO only classes defined in header files are included. Does not
+ If set to \c NO only classes defined in header files are included. Does not
  have any effect for Java sources.
 
 \anchor cfg_extract_anon_nspaces
 <dt>\c EXTRACT_ANON_NSPACES <dd>
  \addindex EXTRACT_ANON_NSPACES
- If this flag is set to YES, the members of anonymous namespaces will be extracted
+ If this flag is set to \c YES, the members of anonymous namespaces will be extracted
  and appear in the documentation as a namespace called 'anonymous_namespace{file}',
  where file will be replaced with the base name of the file that contains the anonymous
  namespace. By default anonymous namespace are hidden.
@@ -745,7 +776,7 @@ combination with \ref cfg_separate_member_pages "SEPARATE_MEMBER_PAGES".
  undocumented members inside documented classes or files. 
  If set to \c NO (the default) these members will be included in the
  various overviews, but no documentation section is generated.
- This option has no effect if \c EXTRACT_ALL is enabled.
+ This option has no effect if \ref cfg_extract_all "EXTRACT_ALL" is enabled.
 
 \anchor cfg_hide_undoc_classes
 <dt>\c HIDE_UNDOC_CLASSES <dd>
@@ -754,12 +785,12 @@ combination with \ref cfg_separate_member_pages "SEPARATE_MEMBER_PAGES".
  undocumented classes.
  If set to \c NO (the default) these classes will be included in the
  various overviews.
- This option has no effect if \c EXTRACT_ALL is enabled.
+ This option has no effect if \ref cfg_extract_all "EXTRACT_ALL" is enabled.
 
 \anchor cfg_hide_friend_compounds
 <dt>\c HIDE_FRIEND_COMPOUNDS <dd>
  \addindex HIDE_FRIEND_COMPOUNDS
- If the \c HIDE_FRIEND_COMPOUNDS tag is set to \c YES, Doxygen will hide all
+ If the \c HIDE_FRIEND_COMPOUNDS tag is set to \c YES, doxygen will hide all
  friend (class|struct|union) declarations.
  If set to \c NO (the default) these declarations will be included in the
  documentation.
@@ -767,7 +798,7 @@ combination with \ref cfg_separate_member_pages "SEPARATE_MEMBER_PAGES".
 \anchor cfg_hide_in_body_docs
 <dt>\c HIDE_IN_BODY_DOCS <dd>
  \addindex HIDE_IN_BODY_DOCS
-If the \c HIDE_IN_BODY_DOCS tag is set to \c YES, Doxygen will hide any 
+If the \c HIDE_IN_BODY_DOCS tag is set to \c YES, doxygen will hide any 
 documentation blocks found inside the body of a function.
 If set to \c NO (the default) these blocks will be appended to the 
 function's detailed documentation block.
@@ -788,7 +819,7 @@ function's detailed documentation block.
  \c YES upper-case letters are also allowed. This is useful if you have
  classes or files whose names only differ in case and if your file system
  supports case sensitive file names. Windows users are advised to set this
- option to NO.
+ option to \c NO.
 
 \anchor cfg_hide_scope_names
 <dt>\c HIDE_SCOPE_NAMES <dd>
@@ -807,7 +838,7 @@ function's detailed documentation block.
 \anchor cfg_force_local_includes
 <dt>\c FORCE_LOCAL_INCLUDES <dd>
  \addindex FORCE_LOCAL_INCLUDES
- If the \c FORCE_LOCAL_INCLUDES tag is set to \c YES then Doxygen 
+ If the \c FORCE_LOCAL_INCLUDES tag is set to \c YES then doxygen 
  will list include files with double quotes in the documentation 
  rather than with sharp brackets.
 
@@ -846,9 +877,9 @@ function's detailed documentation block.
  \addindex SORT_BY_SCOPE_NAME
  If the \c SORT_BY_SCOPE_NAME tag is set to \c YES, the class list will be
  sorted by fully-qualified names, including namespaces. If set to
- NO (the default), the class list will be sorted only by class name,
\c NO (the default), the class list will be sorted only by class name,
  not including the namespace part.
- @note This option is not very useful if \c HIDE_SCOPE_NAMES is set to \c YES.
+ @note This option is not very useful if \ref cfg_hide_scope_names "HIDE_SCOPE_NAMES" is set to \c YES.
  @note This option applies only to the class list, not to the 
        alphabetical list.
 
@@ -857,19 +888,19 @@ function's detailed documentation block.
  \addindex SORT_MEMBERS_CTORS_1ST
  If the \c SORT_MEMBERS_CTORS_1ST tag is set to \c YES then doxygen
  will sort the (brief and detailed) documentation of class members so that
- constructors and destructors are listed first. If set to NO (the default)
+ constructors and destructors are listed first. If set to \c NO (the default)
  the constructors will appear in the respective orders defined by
  \c SORT_MEMBER_DOCS and \c SORT_BRIEF_DOCS.
- @note If \c SORT_BRIEF_DOCS is set to \c NO this option is ignored for
+ @note If \ref cfg_sort_brief_docs "SORT_BRIEF_DOCS" is set to \c NO this option is ignored for
        sorting brief member documentation.
- @note If \c SORT_MEMBER_DOCS is set to \c NO this option is ignored for
+ @note If \ref cfg_sort_member_docs "SORT_MEMBER_DOCS" is set to \c NO this option is ignored for
        sorting detailed member documentation.
 
 \anchor cfg_generate_deprecatedlist
 <dt>\c GENERATE_DEPRECATEDLIST <dd>
  \addindex GENERATE_DEPRECATEDLIST
- The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or
- disable (NO) the deprecated list. This list is created by 
+ The GENERATE_DEPRECATEDLIST tag can be used to enable (\c YES) or
+ disable (\c NO) the deprecated list. This list is created by 
  putting \ref cmddeprecated "\\deprecated"
  commands in the documentation.
 
@@ -887,7 +918,7 @@ function's detailed documentation block.
 <dt>\c GENERATE_TODOLIST <dd>
  \addindex GENERATE_TODOLIST
  The GENERATE_TODOLIST tag can be used to enable (YES) or
- disable (NO) the todo list. This list is created by 
+ disable (\c NO) the todo list. This list is created by 
  putting \ref cmdtodo "\\todo"
  commands in the documentation.
 
@@ -895,14 +926,14 @@ function's detailed documentation block.
 <dt>\c GENERATE_TESTLIST <dd>
  \addindex GENERATE_TESTLIST
  The GENERATE_TESTLIST tag can be used to enable (YES) or
- disable (NO) the test list. This list is created by 
+ disable (\c NO) the test list. This list is created by 
  putting \ref cmdtest "\\test" commands in the documentation.
 
 \anchor cfg_generate_buglist
 <dt>\c GENERATE_BUGLIST <dd>
  \addindex GENERATE_BUGLIST
  The GENERATE_BUGLIST tag can be used to enable (YES) or
- disable (NO) the bug list. This list is created by 
+ disable (\c NO) the bug list. This list is created by 
  putting \ref cmdbug "\\bug" commands in the documentation.
 
 \anchor cfg_enabled_sections
@@ -950,7 +981,7 @@ function's detailed documentation block.
  The \c FILE_VERSION_FILTER tag can be used to specify a program or script that
  doxygen should invoke to get the current version for each file (typically from the
  version control system). Doxygen will invoke the program by executing (via
popen()) the command <code>command input-file</code>, where \c command is 
<code>popen()</code>) the command <code>command input-file</code>, where \c command is 
  the value of the \c FILE_VERSION_FILTER tag, and \c input-file is the name 
  of an input file provided by doxygen. 
  Whatever the program writes to standard output is used as the file version. 
@@ -983,19 +1014,19 @@ FILE_VERSION_INFO = "cleartool desc -fmt \%Vn"
  doxygen. The layout file controls the global structure of the generated output files
  in an output format independent way. To create the layout file that represents
  doxygen's defaults, run doxygen with the -l option. You can optionally specify a
- file name after the option, if omitted DoxygenLayout.xml will be used as the name
+ file name after the option, if omitted \c DoxygenLayout.xml will be used as the name
  of the layout file. Note that if you run doxygen from a directory containing 
- a file called DoxygenLayout.xml, doxygen will parse it automatically even if 
+ a file called \c DoxygenLayout.xml, doxygen will parse it automatically even if 
  the \c LAYOUT_FILE tag is left empty.
 
 \anchor cfg_cite_bib_files
 <dt>\c CITE_BIB_FILES <dd>
  \addindex CITE_BIB_FILES
  The \c CITE_BIB_FILES tag can be used to specify one or more bib files 
- containing the reference definitions. This must be a list of .bib files. The 
.bib extension is automatically appended if omitted. This requires the 
- bibtex tool to be installed. See also http://en.wikipedia.org/wiki/BibTeX 
- for more info. For LaTeX the style of the bibliography can be controlled 
+ containing the reference definitions. This must be a list of <code>.bib</code> files. The 
<code>.bib</code> extension is automatically appended if omitted. This requires the 
\c bibtex tool to be installed. See also http://en.wikipedia.org/wiki/BibTeX 
+ for more info. For \f$\mbox{\LaTeX}\f$ the style of the bibliography can be controlled 
  using \ref cfg_latex_bib_style "LATEX_BIB_STYLE". See 
  also \ref cmdcite "\\cite" for info how to create references.
 
@@ -1025,7 +1056,7 @@ FILE_VERSION_INFO = "cleartool desc -fmt \%Vn"
 <dt>\c WARN_IF_UNDOCUMENTED <dd>
  \addindex WARN_IF_UNDOCUMENTED
  If \c WARN_IF_UNDOCUMENTED is set to \c YES, then doxygen will generate warnings
- for undocumented members. If \c EXTRACT_ALL is set to \c YES then this flag will
+ for undocumented members. If \ref cfg_extract_all "EXTRACT_ALL" is set to \c YES then this flag will
  automatically be disabled.
 
 \anchor cfg_warn_if_doc_error
@@ -1059,7 +1090,7 @@ FILE_VERSION_INFO = "cleartool desc -fmt \%Vn"
  \addindex WARN_LOGFILE
  The \c WARN_LOGFILE tag can be used to specify a file to which warning
  and error messages should be written. If left blank the output is written 
- to stderr.
+ to \c stderr.
 
 </dl>
 
@@ -1074,24 +1105,23 @@ FILE_VERSION_INFO = "cleartool desc -fmt \%Vn"
  \c myfile.cpp or directories like \c /usr/src/myproject. 
  Separate the files or directories with spaces.<br>
 
- \b Note: 
- If this tag is empty the current directory is searched.
+ \note If this tag is empty the current directory is searched.
 
 \anchor cfg_input_encoding
 <dt>\c INPUT_ENCODING <dd>
  \addindex INPUT_ENCODING
  This tag can be used to specify the character encoding of the source files that 
  doxygen parses. Internally doxygen uses the UTF-8 encoding, which is also the default 
- input encoding. Doxygen uses libiconv (or the iconv built into libc) for the transcoding. 
+ input encoding. Doxygen uses `libiconv` (or the `iconv` built into `libc`) for the transcoding. 
  See <a href="http://www.gnu.org/software/libiconv">the libiconv documentation</a> for 
  the list of possible encodings.
 
 \anchor cfg_file_patterns
 <dt>\c FILE_PATTERNS <dd>
  \addindex FILE_PATTERNS
- If the value of the \c INPUT tag contains directories, you can use the 
+ If the value of the \ref cfg_input "INPUT" tag contains directories, you can use the 
  \c FILE_PATTERNS tag to specify one or more wildcard patterns 
- (like \c *.cpp and \c *.h ) to filter out the source-files 
+ (like `*.cpp` and `*.h`) to filter out the source-files 
  in the directories. If left blank the following patterns are tested:
  <code>
  *.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh 
@@ -1110,8 +1140,8 @@ FILE_VERSION_INFO = "cleartool desc -fmt \%Vn"
 <dt>\c EXCLUDE <dd>
  \addindex EXCLUDE
  The \c EXCLUDE tag can be used to specify files and/or directories that should be
- excluded from the \c INPUT source files. This way you can easily exclude a
- subdirectory from a directory tree whose root is specified with the \c INPUT tag.
+ excluded from the \ref cfg_input "INPUT" source files. This way you can easily exclude a
+ subdirectory from a directory tree whose root is specified with the \ref cfg_input "INPUT" tag.
  Note that relative paths are relative to the directory from which doxygen is run.
 
 \anchor cfg_exclude_symlinks
@@ -1123,7 +1153,7 @@ FILE_VERSION_INFO = "cleartool desc -fmt \%Vn"
 \anchor cfg_exclude_patterns
 <dt>\c EXCLUDE_PATTERNS <dd>
  \addindex EXCLUDE_PATTERNS
- If the value of the \c INPUT tag contains directories, you can use the
+ If the value of the \ref cfg_input "INPUT" tag contains directories, you can use the
  \c EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
  certain files from those directories.
 
@@ -1132,8 +1162,8 @@ FILE_VERSION_INFO = "cleartool desc -fmt \%Vn"
 The \c EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names 
 (namespaces, classes, functions, etc.) that should be excluded from the 
 output. The symbol name can be a fully qualified name, a word, or if the 
-wildcard * is used, a substring. Examples: ANamespace, AClass
-AClass::ANamespace, ANamespace::*Test 
+wildcard `*` is used, a substring. Examples: `ANamespace`, `AClass`
+`AClass::ANamespace`, `ANamespace::*Test` 
 
  Note that the wildcards are matched against the file with absolute path, 
  so to exclude all test directories use the pattern 
@@ -1144,20 +1174,22 @@ AClass::ANamespace, ANamespace::*Test
  \addindex EXAMPLE_PATH
  The \c EXAMPLE_PATH tag can be used to specify one or more files or
  directories that contain example code fragments that are included (see
- the \\include command in section \ref cmdinclude "\\include").
+ the \ref cmdinclude "\\include" command).
 
 \anchor cfg_example_recursive
 <dt>\c EXAMPLE_RECURSIVE <dd>
  \addindex EXAMPLE_RECURSIVE
  If the \c EXAMPLE_RECURSIVE tag is set to \c YES then subdirectories will be
- searched for input files to be used with the \\include or \\dontinclude 
- commands irrespective of the value of the \c RECURSIVE tag. 
+ searched for input files to be used with the \ref cmdinclude "\\include" or
+ \ref cmddontinclude "\\dontinclude" 
+ commands irrespective of the value of the \ref cfg_recursive "RECURSIVE" tag. 
  Possible values are \c YES and \c NO. If left blank \c NO is used. 
 
 \anchor cfg_example_patterns
 <dt>\c EXAMPLE_PATTERNS <dd>
  \addindex EXAMPLE_PATTERNS
- If the value of the \c EXAMPLE_PATH tag contains directories, you can use the
+ If the value of the \ref cfg_example_path "EXAMPLE_PATH" tag contains directories, 
+ you can use the
  \c EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like `*.cpp`
  and `*.h`) to filter out the source-files in the directories. If left
  blank all files are included.
@@ -1174,12 +1206,12 @@ AClass::ANamespace, ANamespace::*Test
  \addindex INPUT_FILTER
  The \c INPUT_FILTER tag can be used to specify a program that doxygen should
  invoke to filter for each input file. Doxygen will invoke the filter program
- by executing (via popen()) the command:
+ by executing (via <code>popen()</code>) the command:
 \verbatim <filter> <input-file>
 \endverbatim
  
- where \<filter\>
- is the value of the \c INPUT_FILTER tag, and \<input-file\> is the name of an
+ where <code>\<filter\></code>
+ is the value of the \c INPUT_FILTER tag, and <code>\<input-file\></code> is the name of an
  input file. Doxygen will then use the output that the filter program writes
  to standard output.
 
@@ -1189,9 +1221,10 @@ AClass::ANamespace, ANamespace::*Test
  The \c FILTER_PATTERNS tag can be used to specify filters on a per file pattern
  basis.  Doxygen will compare the file name with each pattern and apply the
  filter if there is a match.  The filters are a list of the form:
- pattern=filter (like `*.cpp=my_cpp_filter`). See \c INPUT_FILTER for further
+ pattern=filter (like `*.cpp=my_cpp_filter`). See \ref cfg_input_filter "INPUT_FILTER" for further
  info on how filters are used. If \c FILTER_PATTERNS is empty or if
- none of the patterns match the file name, \c INPUT_FILTER is applied.
+ none of the patterns match the file name, \ref cfg_input_filter "INPUT_FILTER" is 
+ applied.
 
 \anchor cfg_filter_source_files
 <dt>\c FILTER_SOURCE_FILES <dd>
@@ -1199,22 +1232,23 @@ AClass::ANamespace, ANamespace::*Test
  If the \c FILTER_SOURCE_FILES tag is set to \c YES, the input filter (if set using
  \ref cfg_input_filter "INPUT_FILTER" ) will also be used to filter the input
  files that are used for producing the source files to browse 
- (i.e. when SOURCE_BROWSER is set to YES).
+ (i.e. when \ref cfg_source_browser "SOURCE_BROWSER" is set to \c YES).
 
 \anchor cfg_filter_source_patterns
 <dt>\c FILTER_SOURCE_PATTERNS <dd>
  \addindex FILTER_SOURCE_PATTERNS
  The \c FILTER_SOURCE_PATTERNS tag can be used to specify source filters per 
- file pattern. A pattern will override the setting for \c FILTER_PATTERN (if any) 
+ file pattern. A pattern will override the setting 
+ for \ref cfg_filter_patterns "FILTER_PATTERN" (if any) 
  and it is also possible to disable source filtering for a specific pattern 
  using `*.ext=` (so without naming a filter). This option only has effect when 
- \c FILTER_SOURCE_FILES is enabled.
+ \ref cfg_filter_source_files "FILTER_SOURCE_FILES" is enabled.
 
 \anchor cfg_use_mdfile_as_mainpage
 <dt>\c USE_MDFILE_AS_MAINPAGE <dd>
  \addindex USE_MDFILE_AS_MAINPAGE
 If the \c USE_MD_FILE_AS_MAINPAGE tag refers to the name of a markdown file that 
-is part of the input, its contents will be placed on the main page (index.html). 
+is part of the input, its contents will be placed on the main page (`index.html`). 
 This can be useful if you have a project on for instance GitHub and want reuse 
 the introduction page also for the doxygen output.
 
@@ -1229,7 +1263,7 @@ the introduction page also for the doxygen output.
  If the \c SOURCE_BROWSER tag is set to \c YES then a list of source files will
  be generated. Documented entities will be cross-referenced with these sources.
  Note: To get rid of all source code in the generated output, make sure also
- \c VERBATIM_HEADERS is set to NO.
+ \ref cfg_verbatim_headers "VERBATIM_HEADERS" is set to \c NO.
 
 \anchor cfg_inline_sources
 <dt>\c INLINE_SOURCES <dd>
@@ -1262,8 +1296,9 @@ the introduction page also for the doxygen output.
 <dt>\c REFERENCES_LINK_SOURCE <dd>
  \addindex REFERENCES_LINK_SOURCE
  If the \c REFERENCES_LINK_SOURCE tag is set to \c YES (the default)
- and SOURCE_BROWSER tag is set to \c YES, then the hyperlinks from 
- functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will 
+ and \ref cfg_source_browser "SOURCE_BROWSER" tag is set to \c YES, then the hyperlinks from 
+ functions in \ref cfg_references_relation "REFERENCES_RELATION" and
+ \ref cfg_referenced_by_relation "REFERENCED_BY_RELATION" lists will 
  link to the source code.  Otherwise they will link to the documentation.
 
 \anchor cfg_verbatim_headers
@@ -1271,28 +1306,48 @@ the introduction page also for the doxygen output.
  \addindex VERBATIM_HEADERS
   If the \c VERBATIM_HEADERS tag is set the \c YES (the default) then doxygen
   will generate a verbatim copy of the header file for each class for
-  which an include is specified. Set to NO to disable this.
+  which an include is specified. Set to \c NO to disable this.
   \sa Section \ref cmdclass "\\class".
 
+\anchor cfg_clang_assisted_parsig 
+<dt>\c CLANG_ASSISTED_PARSING <dd>
+ \addindex CLANG_ASSISTED_PARSING
+  If \c CLANG_ASSISTED_PARSING is set to \c YES, then doxygen will use the 
+  <a href="http://clang.llvm.org/">clang parser</a> for more acurate parsing 
+  at the cost of reduced performance. This can be particularly helpful with 
+  template rich C++ code for which doxygen's built-in parser lacks the 
+  necessairy type information.
+
+  @note The availability of this option depends on whether or not doxygen
+  was compiled with the `--with-libclang` option.
+
+\anchor cfg_clang_options
+<dt>\c CLANG_OPTIONS <dd>
+ \addindex CLANG_OPTIONS 
+ If clang assisted parsing is enabled you can provide the compiler with command 
+ line options that you would normally use when invoking the compiler. Note that 
+ the include paths will already be set by doxygen for the files and directories 
+ specified at \c INPUT and \c INCLUDE_PATH.
+
 \anchor cfg_use_htags
 <dt>\c USE_HTAGS <dd>
  \addindex USE_HTAGS
  If the \c USE_HTAGS tag is set to \c YES then the references to source code
- will point to the HTML generated by the htags(1) tool instead of doxygen
- built-in source browser. The htags tool is part of GNU's global source
+ will point to the HTML generated by the \c htags(1) tool instead of doxygen
+ built-in source browser. The \c htags tool is part of GNU's global source
  tagging system (see http://www.gnu.org/software/global/global.html).
  To use it do the following:
 
  -# Install the latest version of global (i.e. 4.8.6 or better)
- -# Enable SOURCE_BROWSER and USE_HTAGS in the config file
- -# Make sure the INPUT points to the root of the source tree
+ -# Enable \ref cfg_source_browser "SOURCE_BROWSER" and \c USE_HTAGS in the config file
+ -# Make sure the \ref cfg_input "INPUT" points to the root of the source tree
  -# Run doxygen as normal
 
- Doxygen will invoke htags (and that will in turn invoke gtags), so these tools
+ Doxygen will invoke \c htags (and that will in turn invoke \c gtags), so these tools
  must be available from the command line (i.e. in the search path).
 
  The result: instead of the source browser generated by doxygen, the links to
- source code will now point to the output of htags.
+ source code will now point to the output of \c htags.
 
 </dl>
 
@@ -1310,7 +1365,7 @@ the introduction page also for the doxygen output.
  \anchor cfg_cols_in_alpha_index
  \addindex COLS_IN_ALPHA_INDEX
  If the alphabetical index is enabled 
- (see \c ALPHABETICAL_INDEX) then the \c COLS_IN_ALPHA_INDEX tag can be 
+ (see \ref cfg_alphabetical_index "ALPHABETICAL_INDEX") then the \c COLS_IN_ALPHA_INDEX tag can be 
  used to specify the number of columns in which this list will be split (can be a number in the range [1..20])
 
 \anchor cfg_ignore_prefix
@@ -1336,15 +1391,15 @@ the introduction page also for the doxygen output.
 <dt>\c HTML_OUTPUT <dd>
  \addindex HTML_OUTPUT
  The \c HTML_OUTPUT tag is used to specify where the HTML docs will be put.
- If a relative path is entered the value of \c OUTPUT_DIRECTORY will be
- put in front of it. If left blank 'html' will be used as the default path.
+ If a relative path is entered the value of \ref cfg_output_directory "OUTPUT_DIRECTORY" will be
+ put in front of it. If left blank '<code>html</code>' will be used as the default path.
 
 \anchor cfg_html_file_extension
 <dt>\c HTML_FILE_EXTENSION <dd>
  \addindex HTML_FILE_EXTENSION
  The \c HTML_FILE_EXTENSION tag can be used to specify the file extension for 
- each generated HTML page (for example: .htm, .php, .asp). If it is left blank
- doxygen will generate files with .html extension.
+ each generated HTML page (for example: <code>.htm, .php, .asp</code>). If it is left blank
+ doxygen will generate files with <code>.html</code> extension.
 
 \anchor cfg_html_header
 <dt>\c HTML_HEADER <dd>      
@@ -1388,10 +1443,10 @@ doxygen -w html new_header.html new_footer.html new_stylesheet.css YourConfigFil
  <dt><code>\$mathjax</code><dd>will be replaced with a links to 
             the javascript and style sheets needed for the MathJax feature 
             (or an empty string when \ref cfg_use_mathjax "USE_MATHJAX" is disabled).
- <dt><code>\$relpath\$</code><dd>
- If \c CREATE_SUBDIRS is enabled, the command <code>\$relpath\$</code> can be 
+ <dt><code>\$relpath^</code><dd>
+ If \ref cfg_create_subdirs "CREATE_SUBDIRS" is enabled, the command <code>\$relpath^</code> can be 
  used to produce a relative path to the root of the HTML output directory,
- e.g. use \$relpath\$doxygen.css, to refer to the standard style sheet.
+ e.g. use <code>\$relpath^doxygen.css</code>, to refer to the standard style sheet.
  </dl>
 
  To cope with differences in the layout of the header and footer that depend on 
@@ -1464,7 +1519,8 @@ doxygen -w html new_header.html new_footer.html new_stylesheet.css YourConfigFil
  the style sheet that doxygen normally uses.
 
  \note It is recommended to use 
- \c HTML_EXTRA_STYLESHEET instead of this one, as it is more robust and 
+ \ref cfg_html_extra_stylesheet "HTML_EXTRA_STYLESHEET" instead of this tag,
+ as it is more robust and 
  this tag will in the future become obsolete.
 
 \anchor cfg_html_extra_stylesheet
@@ -1473,7 +1529,7 @@ doxygen -w html new_header.html new_footer.html new_stylesheet.css YourConfigFil
  The HTML_EXTRA_STYLESHEET tag can be used to specify an additional 
  user-defined cascading style sheet that is included after the standard 
  style sheets created by doxygen. Using this option one can overrule 
- certain style aspects. This is preferred over using \c HTML_STYLESHEET 
+ certain style aspects. This is preferred over using \ref cfg_html_stylesheet "HTML_STYLESHEET" 
  since it does not replace the standard style sheet and is therefor more 
  robust against future updates. Doxygen will copy the style sheet file to 
  the output directory.
@@ -1515,8 +1571,9 @@ hr.footer {
  The \c HTML_EXTRA_FILES tag can be used to specify one or more extra images or 
  other source files which should be copied to the HTML output directory. Note 
  that these files will be copied to the base HTML output directory. Use the 
- $relpath$ marker in the \c HTML_HEADER and/or \c HTML_FOOTER files to load these 
- files. In the \c HTML_STYLESHEET file, use the file name only. Also note that 
+ <code>$relpath^</code> marker in the \ref cfg_html_header "HTML_HEADER" and/or
+ \ref cfg_html_footer "HTML_FOOTER" files to load these 
+ files. In the \ref cfg_html_stylesheet "HTML_STYLESHEET" file, use the file name only. Also note that 
  the files will be copied as-is; there are no commands or markers available.
 
 \anchor cfg_html_colorstyle_hue
@@ -1551,7 +1608,7 @@ hr.footer {
  \addindex HTML_TIMESTAMP
  If the \c HTML_TIMESTAMP tag is set to \c YES then the footer of 
  each generated HTML page will contain the date and time when the page 
- was generated. Setting this to NO can help when comparing the output of 
+ was generated. Setting this to \c NO can help when comparing the output of 
  multiple runs.
 
 \anchor cfg_html_align_members
@@ -1602,27 +1659,28 @@ hr.footer {
 \anchor cfg_docset_feedname 
 <dt>\c DOCSET_FEEDNAME <dd>
  \addindex DOCSET_FEEDNAME
- When \c GENERATE_DOCSET tag is set to \c YES, this tag determines the name of the
+ When \ref cfg_generate_docset "GENERATE_DOCSET" tag is set to \c YES, this tag determines the name of the
  feed. A documentation feed provides an umbrella under which multiple
  documentation sets from a single provider (such as a company or product suite) 
  can be grouped.
 
 \anchor cfg_docset_bundle_id
 <dt>\c DOCSET_BUNDLE_ID <dd>
- When \c GENERATE_DOCSET tag is set to \c YES, this tag specifies a string that
+ When \ref cfg_generate_docset "GENERATE_DOCSET" tag is set to \c YES, this tag specifies a string that
  should uniquely identify the documentation set bundle. This should be a
  reverse domain-name style string, e.g. <code>com.mycompany.MyDocSet</code>. 
  Doxygen will append <code>.docset</code> to the name.
 
 \anchor cfg_docset_publisher_id
 <dt>\c DOCSET_PUBLISHER_ID <dd>
-When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely identify 
+When \ref cfg_generate_docset "GENERATE_DOCSET" tag is set to \c YES \c DOCSET_PUBLISHER_ID
+tag specifies a string that should uniquely identify 
 the documentation publisher. This should be a reverse domain-name style 
 string, e.g. com.mycompany.MyDocSet.documentation. 
 
 \anchor cfg_docset_publisher_name
 <dt>\c DOCSET_PUBLISHER_NAME <dd>
-The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher.
+The \c DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.
 
 \anchor cfg_generate_htmlhelp
 <dt>\c GENERATE_HTMLHELP <dd>
@@ -1631,14 +1689,14 @@ The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher.
  doxygen generates three additional HTML index files: 
  \c index.hhp, \c index.hhc, and \c index.hhk. The \c index.hhp is a 
  project file that can be read by 
- <a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/htmlhelp/html/vsconHH1Start.asp">
+ <a href="http://www.microsoft.com/en-us/download/details.aspx?id=21138">
  Microsoft's HTML Help Workshop</a>
  on Windows.
 
  The HTML Help Workshop contains a compiler that can convert all HTML output 
- generated by doxygen into a single compiled HTML file (.chm). Compiled
+ generated by doxygen into a single compiled HTML file (`.chm`). Compiled
  HTML files are now used as the Windows 98 help format, and will replace
- the old Windows help format (.hlp) on all Windows platforms in the future.
+ the old Windows help format (`.hlp`) on all Windows platforms in the future.
  Compressed HTML files also contain an index, a table of contents,
  and you can search for words in the documentation.
  The HTML workshop also contains a viewer for compressed HTML files.
@@ -1646,123 +1704,123 @@ The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher.
 \anchor cfg_chm_file 
 <dt>\c CHM_FILE <dd>
  \addindex CHM_FILE
-  If the \c GENERATE_HTMLHELP tag is set to \c YES, the \c CHM_FILE tag can
-  be used to specify the file name of the resulting .chm file. You
+  If the \ref cfg_generate_htmlhelp "GENERATE_HTMLHELP" tag is set to \c YES, the \c CHM_FILE tag can
+  be used to specify the file name of the resulting `.chm` file. You
   can add a path in front of the file if the result should not be
   written to the html output directory.
 
 \anchor cfg_hhc_location 
 <dt>\c HHC_LOCATION <dd>
  \addindex HHC_LOCATION
-  If the \c GENERATE_HTMLHELP tag is set to \c YES, the \c HHC_LOCATION tag can
+  If the \ref cfg_generate_htmlhelp "GENERATE_HTMLHELP" tag is set to \c YES, the \c HHC_LOCATION tag can
   be used to specify the location (absolute path including file name) of 
-  the HTML help compiler (hhc.exe). If non-empty doxygen will try to run
-  the HTML help compiler on the generated index.hhp.
+  the HTML help compiler (\c hhc.exe). If non-empty doxygen will try to run
+  the HTML help compiler on the generated \c index.hhp.
 
 \anchor cfg_generate_chi
 <dt>\c GENERATE_CHI <dd>
  \addindex GENERATE_CHI
- If the \c GENERATE_HTMLHELP tag is set to \c YES, the \c GENERATE_CHI flag
- controls if a separate .chi index file is generated (<code>YES</code>) or that
- it should be included in the master .chm file (<code>NO</code>).
+ If the \ref cfg_generate_htmlhelp "GENERATE_HTMLHELP" tag is set to \c YES, the \c GENERATE_CHI flag
+ controls if a separate `.chi` index file is generated (\c YES) or that
+ it should be included in the master `.chm` file (\c NO).
 
 \anchor cfg_chm_index_encoding
 <dt>\c CHM_INDEX_ENCODING <dd>
  \addindex CHM_INDEX_ENCODING
- If the \c GENERATE_HTMLHELP tag is set to \c YES, the \c CHM_INDEX_ENCODING 
- is used to encode HtmlHelp index (hhk), content (hhc) and project file 
+ If the \ref cfg_generate_htmlhelp "GENERATE_HTMLHELP" tag is set to \c YES, the \c CHM_INDEX_ENCODING 
+ is used to encode HtmlHelp index (\c hhk), content (\c hhc) and project file 
  content. 
 
 \anchor cfg_binary_toc
 <dt>\c BINARY_TOC <dd>
  \addindex BINARY_TOC
- If the \c GENERATE_HTMLHELP tag is set to \c YES, the \c BINARY_TOC flag
- controls whether a binary table of contents is generated (<code>YES</code>) or a
- normal table of contents (<code>NO</code>) in the .chm file.
+ If the \ref cfg_generate_htmlhelp "GENERATE_HTMLHELP" tag is set to \c YES, the \c BINARY_TOC flag
+ controls whether a binary table of contents is generated (\c YES) or a
+ normal table of contents (\c NO) in the .chm file.
 
 \anchor cfg_toc_expand
 <dt>\c TOC_EXPAND <dd>
  \addindex TOC_EXPAND
- The \c TOC_EXPAND flag can be set to YES to add extra items for 
+ The \c TOC_EXPAND flag can be set to \c YES to add extra items for 
  group members to the table of contents of the HTML help documentation 
  and to the tree view.
 
 \anchor cfg_generate_qhp
 <dt>\c GENERATE_QHP <dd>
  \addindex GENERATE_QHP
- If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE
- and QHP_VIRTUAL_FOLDER are set, an additional index file will
+ If the \c GENERATE_QHP tag is set to \c YES and both \ref cfg_qhp_namespace "QHP_NAMESPACE"
+ and \ref cfg_qhp_virtual_folder "QHP_VIRTUAL_FOLDER" are set, an additional index file will
  be generated that can be used as input for Qt's qhelpgenerator
- to generate a Qt Compressed Help (.qch) of the generated HTML
+ to generate a Qt Compressed Help (`.qch`) of the generated HTML
  documentation.
 
 \anchor cfg_qch_file
 <dt>\c QCH_FILE <dd>
  \addindex QCH_FILE
- If the QHG_LOCATION tag is specified, the QCH_FILE tag can
- be used to specify the file name of the resulting .qch file.
+ If the \ref cfg_qhg_location "QHG_LOCATION" tag is specified, the \c QCH_FILE tag can
+ be used to specify the file name of the resulting `.qch` file.
  The path specified is relative to the HTML output folder.
 
 \anchor cfg_qhp_namespace
 <dt>\c QHP_NAMESPACE <dd>
  \addindex QHP_NAMESPACE
- The QHP_NAMESPACE tag specifies the namespace to use when generating
+ The \c QHP_NAMESPACE tag specifies the namespace to use when generating
  Qt Help Project output. For more information please see
- <a href="http://doc.trolltech.com/qthelpproject.html#namespace">Qt Help Project / Namespace</a>.
+ <a href="http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace">Qt Help Project / Namespace</a>.
 
 \anchor cfg_qhp_virtual_folder
 <dt>\c QHP_VIRTUAL_FOLDER <dd>
  \addindex QHP_VIRTUAL_FOLDER
- The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when
+ The \c QHP_VIRTUAL_FOLDER tag specifies the namespace to use when
  generating Qt Help Project output. For more information please see
- <a href="http://doc.trolltech.com/qthelpproject.html#virtual-folders">Qt Help Project / Virtual Folders</a>.
+ <a href="http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual-folders">Qt Help Project / Virtual Folders</a>.
 
 \anchor cfg_qhp_cust_filter_name
 <dt>\c QHP_CUST_FILTER_NAME <dd>
   \addindex QHP_CUST_FILTER_NAME
-  If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to add. For more information please see
-  <a href="http://doc.trolltech.com/qthelpproject.html#custom-filters">Qt Help Project / Custom Filters</a>.
+  If \c QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to add. For more information please see
+  <a href="http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-filters">Qt Help Project / Custom Filters</a>.
 
 \anchor cfg_qhp_cust_filter_attrs
 <dt>\c QHP_CUST_FILTER_ATTRS <dd>
   \addindex QHP_CUST_FILTER_ATTRS
-  The QHP_CUST_FILTER_ATTRIBUTES tag specifies the list of the attributes of the custom filter to add.
+  The \c QHP_CUST_FILTER_ATTRIBUTES tag specifies the list of the attributes of the custom filter to add.
   For more information please see
-  <a href="http://doc.trolltech.com/qthelpproject.html#custom-filters">Qt Help Project / Custom Filters</a>.
+  <a href="http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-filters">Qt Help Project / Custom Filters</a>.
 
 \anchor cfg_qhp_sect_filter_attrs
 <dt>\c QHP_SECT_FILTER_ATTRS <dd>
   \addindex QHP_SECT_FILTER_ATTRS
-  The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this project's filter section matches.
-  <a href="http://doc.trolltech.com/qthelpproject.html#filter-attributes">Qt Help Project / Filter Attributes</a>.
+  The \c QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this project's filter section matches.
+  <a href="http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes">Qt Help Project / Filter Attributes</a>.
 
 \anchor cfg_qhg_location
 <dt>\c QHG_LOCATION <dd>
  \addindex QHG_LOCATION
- If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can
+ If the \ref cfg_generate_qhp "GENERATE_QHP" tag is set to \c YES, the \c QHG_LOCATION tag can
  be used to specify the location of Qt's qhelpgenerator.
  If non-empty doxygen will try to run qhelpgenerator on the generated
.qhp file.
`.qhp` file.
 
 \anchor cfg_generate_eclipsehelp
 <dt>\c GENERATE_ECLIPSEHELP <dd>
  \addindex GENERATE_ECLIPSEHELP
  If the \c GENERATE_ECLIPSEHELP tag is set to \c YES, additional index files  
- will be generated, which together with the HTML files, form an Eclipse help  
+ will be generated, which together with the HTML files, form an `Eclipse` help 
  plugin. 
 
  To install this plugin and make it available under the help contents 
- menu in Eclipse, the contents of the directory containing the HTML and XML 
+ menu in `Eclipse`, the contents of the directory containing the HTML and XML 
  files needs to be copied into the plugins directory of eclipse. The name of 
  the directory within the plugins directory should be the same as 
  the \ref cfg_eclipse_doc_id "ECLIPSE_DOC_ID" value. 
 
- After copying Eclipse needs to be restarted before the help appears.
+ After copying `Eclipse` needs to be restarted before the help appears.
 
 \anchor cfg_eclipse_doc_id
 <dt>\c ECLIPSE_DOC_ID <dd>
  \addindex ECLIPSE_DOC_ID
- A unique identifier for the eclipse help plugin. When installing the plugin 
+ A unique identifier for the `Eclipse` help plugin. When installing the plugin 
  the directory name containing the HTML and XML files should also have 
  this name. Each documentation set should have its own identifier.
 
@@ -1772,7 +1830,7 @@ The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher.
  If you want full control over the layout of the generated HTML pages it
  might be necessary to disable the index and replace it with your own.
  The \c DISABLE_INDEX tag can be used to turn on/off the condensed index at
- top of each page. A value of NO (the default) enables the index and the
+ top of each page. A value of \c NO (the default) enables the index and the
  value \c YES disables it. Since the tabs have the same information as the 
  navigation tree you can set this option to \c NO if you already set 
  \ref cfg_generate_treeview "GENERATE_TREEVIEW" to \c YES.
@@ -1788,24 +1846,24 @@ The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher.
 \anchor cfg_generate_treeview
 <dt>\c GENERATE_TREEVIEW <dd>
  \addindex GENERATE_TREEVIEW
- The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
+ The \c GENERATE_TREEVIEW tag is used to specify whether a tree-like index
  structure should be generated to display hierarchical information.
- If the tag value is set to YES, a side panel will be generated
+ If the tag value is set to \c YES, a side panel will be generated
  containing a tree-like index structure (just like the one that
  is generated for HTML Help). For this to work a browser that supports
  JavaScript, DHTML, CSS and frames is required (i.e. any modern browser).
  Windows users are probably better off using the HTML help feature.
 
- Via custom stylesheets (see \ref cfg_html_stylesheet "HTML_STYLESHEET")
+ Via custom stylesheets (see \ref cfg_html_extra_stylesheet "HTML_EXTRA_STYLESHEET")
  one can further \ref doxygen_finetune "fine-tune" the look of the index.
  As an example, the default style sheet generated by doxygen has an
  example that shows how to put an image at the root of the tree instead of
- the \ref cfg_project_name "project name".
+ the \ref cfg_project_name "PROJECT_NAME".
 
 \anchor cfg_treeview_width
 <dt>\c TREEVIEW_WIDTH <dd>
  \addindex TREEVIEW_WIDTH
- If the treeview is enabled (see \c GENERATE_TREEVIEW) then this tag can be
+ If the treeview is enabled (see \ref cfg_generate_treeview "GENERATE_TREEVIEW") then this tag can be
  used to set the initial width (in pixels) of the frame in which the tree
  is shown.
 
@@ -1818,7 +1876,7 @@ The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher.
 \anchor cfg_formula_fontsize
 <dt>\c FORMULA_FONTSIZE <dd>
  \addindex FORMULA_FONTSIZE
- Use this tag to change the font size of Latex formulas included
+ Use this tag to change the font size of \f$\mbox{\LaTeX}\f$ formulas included
  as images in the HTML documentation. The default is 10.
  when you change the font size after a successful doxygen run you need
  to manually remove any `form_*.png` images from the HTML 
@@ -1836,10 +1894,10 @@ The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher.
 \anchor cfg_use_mathjax
 <dt>\c USE_MATHJAX <dd>
  \addindex USE_MATHJAX
- Enable the \c USE_MATHJAX option to render LaTeX formulas using MathJax 
+ Enable the \c USE_MATHJAX option to render \f$\mbox{\LaTeX}\f$ formulas using MathJax 
  (see http://www.mathjax.org) which uses client side Javascript for the 
  rendering instead of using prerendered bitmaps. Use this if you do not 
- have LaTeX installed or if you want to formulas look prettier in the HTML 
+ have \f$\mbox{\LaTeX}\f$ installed or if you want to formulas look prettier in the HTML 
  output. When enabled you may also need to install MathJax separately and 
  configure the path to it using the \ref cfg_mathjax_relpath "MATHJAX_RELPATH" 
  option.
@@ -1854,12 +1912,31 @@ The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher.
 <a href="http://docs.mathjax.org/en/latest/output.html">the MathJax site</a>
 for more details.
 
+\anchor cfg_mathjax_codefile
+<dt>\c MATHJAX_CODEFILE <dd>
+ \addindex MATHJAX_CODEFILE
+ The MATHJAX_CODE_FILE tag can be used to specify a file with javascript 
+ pieces of code that will be used on startup of the MathJax code. 
+ See 
+<a href="http://docs.mathjax.org/en/latest/output.html">the MathJax site</a>
+ for more details.<br>
+ As an example to disable the "Math Renderer" menu item in the "Math
+ Settings" menu of MathJax:
+\verbatim
+MATHJAX_CODEFILE = disableRenderer
+  with in the file \c disableRenderer:
+  MathJax.Hub.Config({
+   menuSettings: {
+    showRenderer: false,
+   } 
+  });
+\endverbatim
 \anchor cfg_mathjax_relpath
 <dt>\c MATHJAX_RELPATH <dd>
  \addindex MATHJAX_RELPATH
  When MathJax is enabled you need to specify the location relative to the 
  HTML output directory using the \c MATHJAX_RELPATH option. The destination 
- directory should contain the MathJax.js script. For instance, if the mathjax 
+ directory should contain the `MathJax.js` script. For instance, if the \c mathjax 
  directory is located at the same level as the HTML output directory, then 
  \c MATHJAX_RELPATH should be <code>../mathjax</code>. The default value points to 
  the MathJax Content Delivery Network so you can quickly see the result without 
@@ -1869,7 +1946,7 @@ for more details.
 \anchor cfg_mathjax_extensions
 <dt>\c MATHJAX_EXTENSIONS <dd>
  \addindex MATHJAX_EXTENSIONS
- The MATHJAX_EXTENSIONS tag can be used to specify one or MathJax extension 
+ The \c MATHJAX_EXTENSIONS tag can be used to specify one or MathJax extension 
  names that should be enabled during MathJax rendering. For example
 \verbatim
 MATHJAX_EXTENSIONS     = TeX/AMSmath TeX/AMSsymbols
@@ -1891,14 +1968,14 @@ MATHJAX_EXTENSIONS     = TeX/AMSmath TeX/AMSsymbols
  better solution. 
 
  It is possible to search using the keyboard;
- to jump to the search box use access key + S (what the access key is
- depends on the OS and browser, but it is typically CTRL, ALT/option, or both).
- Inside the search box use the cursor down key to jump into the search 
- results window, the results can be navigated using the cursor keys.
- Press Enter to select an item or escape to cancel the search. The
+ to jump to the search box use `<access key> + S` (what the `<access key>` is
+ depends on the OS and browser, but it is typically `<CTRL>`, `<ALT>`/`<option>`, or both).
+ Inside the search box use the `<cursor down key>` to jump into the search 
+ results window, the results can be navigated using the `<cursor keys>`.
+ Press `<Enter>` to select an item or `<escape>` to cancel the search. The
  filter options can be selected when the cursor is inside the search box
- by pressing Shift+cursor down. Also here use the cursor keys to 
- select a filter and enter or escape to activate or cancel the filter option.
+ by pressing `<Shift>+<cursor down>`. Also here use the `<cursor keys>` to 
+ select a filter and `<Enter>` or `<escape>` to activate or cancel the filter option.
 
 \anchor cfg_server_based_search
 <dt>\c SERVER_BASED_SEARCH <dd>
@@ -1941,20 +2018,30 @@ When \ref cfg_server_based_search "SERVER_BASED_SEARCH" and
 \ref cfg_external_search "EXTERNAL_SEARCH" are both enabled the unindexed 
 search data is written to a file for indexing by an external tool. With the 
 \c SEARCHDATA_FILE tag the name of this file can be specified.
-The default is searchdata.xml.
+The default is `searchdata.xml`.
+
+\anchor cfg_external_search_id 
+<dt>\c EXTERNAL_SEARCH_ID <dd>
+ \addindex EXTERNAL_SEARCH_ID
+
+When \ref cfg_server_based_search "SERVER_BASED_SEARCH" and 
+\ref cfg_external_search "EXTERNAL_SEARCH" are both enabled the 
+\c EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is 
+useful in combination with \ref cfg_extra_search_mappings "EXTRA_SEARCH_MAPPINGS" 
+to search through multiple projects and redirect the results back to the right project.
 
 \anchor cfg_extra_search_mappings
 <dt>\c EXTRA_SEARCH_MAPPINGS <dd>
  \addindex EXTRA_SEARCH_MAPPINGS
 
-The \c EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through other 
-doxygen projects that are not otherwise connected via tags files, but are 
-all added to the same search index. Each project needs to have a tag file set 
-via \ref cfg_generate_tagfile "GENERATE_TAGFILE". The search mapping then 
-maps the name of tag file to a relative location where the documentation 
-can be found, similar to the \ref cfg_tagfiles "TAGFILES" option but without 
-actually processing the tag file. The format is: 
+The \c EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen 
+projects other than the one defined by this configuration file, but that are 
+all added to the same external search index. Each project needs to have a 
+unique id set via \ref cfg_external_search_id "EXTERNAL_SEARCH_ID". 
+The search mapping then maps the id of to a relative location where the 
+documentation can be found. 
 
+The format is: 
 \verbatim
 EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ... 
 \endverbatim
@@ -1975,23 +2062,23 @@ EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ...
  \addindex LATEX_OUTPUT
  The \c LATEX_OUTPUT tag is used to specify where the \f$\mbox{\LaTeX}\f$ 
  docs will be put.
- If a relative path is entered the value of \c OUTPUT_DIRECTORY will be
- put in front of it. If left blank 'latex' will be used as the default path.
+ If a relative path is entered the value of \ref cfg_output_directory "OUTPUT_DIRECTORY" will be
+ put in front of it. If left blank '`latex`' will be used as the default path.
 
 \anchor cfg_latex_cmd_name
 <dt>\c LATEX_CMD_NAME <dd>
  \addindex LATEX_CMD_NAME
- The \c LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be invoked. 
+ The \c LATEX_CMD_NAME tag can be used to specify the \f$\mbox{\LaTeX}\f$ command name to be invoked. 
  If left blank 'latex' will be used as the default command name.
- Note that when enabling USE_PDFLATEX this option is only used for
+ Note that when enabling \ref cfg_use_pdflatex "USE_PDFLATEX" this option is only used for
  generating bitmaps for formulas in the HTML output, but not in the
- Makefile that is written to the output directory.
\c Makefile that is written to the output directory.
 
 \anchor cfg_makeindex_cmd_name
 <dt>\c MAKEINDEX_CMD_NAME <dd>
  \addindex MAKEINDEX_CMD_NAME
  The MAKEINDEX_CMD_NAME tag can be used to specify the command name to 
- generate index for LaTeX. If left blank 'makeindex' will be used as the 
+ generate index for \f$\mbox{\LaTeX}\f$. If left blank '`makeindex`' will be used as the 
  default command name.
 
 \anchor cfg_compact_latex
@@ -2012,7 +2099,7 @@ EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ...
  <li><code>legal</code> (8.5 x 14 inches).
  <li><code>executive</code> (7.25 x 10.5 inches)
  </ul> 
- If left blank a4 will be used.
+ If left blank \c a4 will be used.
 
 \anchor cfg_extra_packages
 <dt>\c EXTRA_PACKAGES <dd>
@@ -2045,23 +2132,34 @@ EXTRA_PACKAGES = times
  <code>\$projectnumber</code>. 
  Doxygen will replace them by respectively 
  the title of the page, the current date and time, only the current date,
- the version number of doxygen, the project name (see \c PROJECT_NAME), or the
- project number (see \c PROJECT_NUMBER).
+ the version number of doxygen, the project name (see \ref cfg_project_name "PROJECT_NAME"), or the
+ project number (see \ref cfg_project_number "PROJECT_NUMBER").
 
 \anchor cfg_latex_footer
 <dt>\c LATEX_FOOTER <dd>
  \addindex LATEX_FOOTER
- The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for 
- the generated latex document. The footer should contain everything after 
+ The LATEX_FOOTER tag can be used to specify a personal \f$\mbox{\LaTeX}\f$ footer for 
+ the generated \f$\mbox{\LaTeX}\f$ document. The footer should contain everything after 
  the last chapter. If it is left blank doxygen will generate a 
- standard footer. Notice: only use this tag if you know what you are doing! 
-   
+ standard footer.
+ \par Note: 
+   Only use a user-defined footer if you know what you are doing!
+
+\anchor cfg_latex_extra_files
+<dt>\c LATEX_EXTRA_FILES <dd>
+ \addindex LATEX_EXTRA_FILES
+ The \c LATEX_EXTRA_FILES tag can be used to specify one or more extra images
+ or other source files which should be copied to the \f$\mbox{\LaTeX}\f$ output directory.
+ Note that the files will be copied as-is; there are no commands or markers
+ available.
+
 \anchor cfg_pdf_hyperlinks
 <dt>\c PDF_HYPERLINKS <dd>
  \addindex PDF_HYPERLINKS
 
  If the \c PDF_HYPERLINKS tag is set to \c YES, the \f$\mbox{\LaTeX}\f$ that 
- is generated is prepared for conversion to PDF (using ps2pdf or pdflatex). 
+ is generated is prepared for conversion to PDF (using \c ps2pdf or \c pdflatex). 
  The PDF file will
  contain links (just like the HTML output) instead of page references.
  This makes the output suitable for online browsing using a PDF viewer.
@@ -2071,14 +2169,14 @@ EXTRA_PACKAGES = times
  \addindex LATEX_PDFLATEX
 
  If the \c LATEX_PDFLATEX tag is set to \c YES, doxygen will use
- pdflatex to generate the PDF file directly from the \f$\mbox{\LaTeX}\f$
\c pdflatex to generate the PDF file directly from the \f$\mbox{\LaTeX}\f$
  files.
 
 \anchor cfg_latex_batchmode
 <dt>\c LATEX_BATCHMODE <dd>
  \addindex LATEX_BATCHMODE
 
- If the \c LATEX_BATCHMODE tag is set to \c YES, doxygen will add the \\batchmode.
+ If the \c LATEX_BATCHMODE tag is set to \c YES, doxygen will add the \c \\batchmode
  command to the generated \f$\mbox{\LaTeX}\f$ files. This will 
  instruct \f$\mbox{\LaTeX}\f$ to keep running if errors occur, instead of 
  asking the user for help. This option is also used when generating formulas 
@@ -2104,7 +2202,7 @@ EXTRA_PACKAGES = times
 \anchor cfg_latex_source_code
  <dt>\c LATEX_SOURCE_CODE <dd>
  If \c LATEX_SOURCE_CODE is set to \c YES then doxygen will include 
- source code with syntax highlighting in the LaTeX output. 
+ source code with syntax highlighting in the \f$\mbox{\LaTeX}\f$ output. 
  Note that which sources are shown also depends on other settings 
  such as \ref cfg_source_browser "SOURCE_BROWSER".
 
@@ -2123,8 +2221,8 @@ EXTRA_PACKAGES = times
 <dt>\c RTF_OUTPUT <dd>
  \addindex RTF_OUTPUT
  The \c RTF_OUTPUT tag is used to specify where the RTF docs will be put.
- If a relative path is entered the value of \c OUTPUT_DIRECTORY will be
- put in front of it. If left blank \c rtf will be used as the default path.
+ If a relative path is entered the value of \ref cfg_output_directory "OUTPUT_DIRECTORY" will be
+ put in front of it. If left blank '`rtf`' will be used as the default path.
  
 \anchor cfg_compact_rtf
 <dt>\c COMPACT_RTF <dd>
@@ -2177,16 +2275,18 @@ EXTRA_PACKAGES = times
 <dt>\c MAN_OUTPUT <dd>
  \addindex MAN_OUTPUT
  The \c MAN_OUTPUT tag is used to specify where the man pages will be put.
- If a relative path is entered the value of \c OUTPUT_DIRECTORY will be
- put in front of it. If left blank 'man' will be used as the default path.
- A directory man3 will be created inside the directory specified by 
+ If a relative path is entered the value of \ref cfg_output_directory "OUTPUT_DIRECTORY" will be
+ put in front of it. If left blank '`man`' will be used as the default path.
+ A directory \c man3 will be created inside the directory specified by 
  \c MAN_OUTPUT.
 
 \anchor cfg_man_extension
 <dt>\c MAN_EXTENSION <dd>
  \addindex MAX_EXTENSION
  The \c MAN_EXTENSION tag determines the extension that is added to
- the generated man pages (default is the subroutine's section .3)
+ the generated man pages (default is the subroutine's section .3). In case
+ the manual section does not start with a number, the number 3 is prepended.
+ The dot (.) at the beginning of the \c MAN_EXTENSION is optional.
 
 \anchor cfg_man_links
 <dt>\c MAN_LINKS <dd> 
@@ -2205,7 +2305,7 @@ EXTRA_PACKAGES = times
 
 <dt>\c GENERATE_XML <dd>
  \addindex GENERATE_XML
- If the \c GENERATE_XML tag is set to \c YES Doxygen will
+ If the \c GENERATE_XML tag is set to \c YES doxygen will
  generate an XML file that captures the structure of
  the code including all documentation. 
 
@@ -2213,40 +2313,58 @@ EXTRA_PACKAGES = times
 <dt>\c XML_OUTPUT <dd>
  \addindex XML_OUTPUT
  The \c XML_OUTPUT tag is used to specify where the XML pages will be put. 
- If a relative path is entered the value of \c OUTPUT_DIRECTORY will be 
- put in front of it. If left blank \c xml will be used as the default path.
+ If a relative path is entered the value of \ref cfg_output_directory "OUTPUT_DIRECTORY" will be 
+ put in front of it. If left blank '`xml`' will be used as the default path.
 
 \anchor cfg_xml_schema
 <dt>\c XML_SCHEMA <dd>
  \addindex XML_SCHEMA
- The \c XML_SCHEMA tag can be used to specify an XML schema,
+ The \c XML_SCHEMA tag can be used to specify a XML schema,
  which can be used by a validating XML parser to check the
  syntax of the XML files.
 
 \anchor cfg_xml_dtd
 <dt>\c XML_DTD <dd>
  \addindex XML_DTD
- The \c XML_DTD tag can be used to specify an XML DTD,
+ The \c XML_DTD tag can be used to specify a XML DTD,
  which can be used by a validating XML parser to check the
  syntax of the XML files.
 
 \anchor cfg_xml_programlisting
 <dt>\c XML_PROGRAMLISTING <dd>
  \addindex XML_PROGRAMLISTING
- If the \c XML_PROGRAMLISTING tag is set to \c YES Doxygen will
+ If the \c XML_PROGRAMLISTING tag is set to \c YES doxygen will
  dump the program listings (including syntax highlighting
  and cross-referencing information) to the XML output. Note that
  enabling this will significantly increase the size of the XML output.
 
 </dl>
 
+\section docbook_output Docbook related options
+\anchor cfg_generate_docbook
+<dl>
+
+<dt>\c GENERATE_DOCBOOK <dd>
+ \addindex GENERATE_DOCBOOK
+If the \c GENERATE_DOCBOOK tag is set to \c YES doxygen will generate Docbook files 
+that can be used to generate PDF.
+
+\anchor cfg_docbook_output
+<dt>\c DOCBOOK_OUTPUT <dd>
+ \addindex DOCBOOK_OUTPUT
+The \c DOCBOOK_OUTPUT tag is used to specify where the Docbook pages will be put. 
+If a relative path is entered the value of \ref cfg_output_directory "OUTPUT_DIRECTORY" will be put in 
+front of it. If left blank '`docbook`' will be used as the default path.
+
+</dl>
+
 \section autogen_output AUTOGEN_DEF related options
 \anchor cfg_generate_autogen_def
 <dl>
 
 <dt>\c GENERATE_AUTOGEN_DEF <dd>
  \addindex GENERATE_AUTOGEN_DEF
- If the \c GENERATE_AUTOGEN_DEF tag is set to \c YES Doxygen will
+ If the \c GENERATE_AUTOGEN_DEF tag is set to \c YES doxygen will
  generate an AutoGen Definitions (see http://autogen.sf.net) file
  that captures the structure of the code including all
  documentation. Note that this feature is still experimental 
@@ -2260,7 +2378,7 @@ EXTRA_PACKAGES = times
 
 <dt>\c GENERATE_PERLMOD <dd>
  \addindex GENERATE_PERLMOD
- If the \c GENERATE_PERLMOD tag is set to \c YES Doxygen will
+ If the \c GENERATE_PERLMOD tag is set to \c YES doxygen will
  generate a Perl module file that captures the structure of
  the code including all documentation. Note that this 
  feature is still experimental and incomplete at the
@@ -2269,8 +2387,8 @@ EXTRA_PACKAGES = times
 \anchor cfg_perlmod_latex
 <dt>\c PERLMOD_LATEX <dd>
  \addindex PERLMOD_LATEX
- If the \c PERLMOD_LATEX tag is set to \c YES Doxygen will generate 
- the necessary Makefile rules, Perl scripts and LaTeX code to be able 
+ If the \c PERLMOD_LATEX tag is set to \c YES doxygen will generate 
+ the necessary Makefile rules, Perl scripts and \f$\mbox{\LaTeX}\f$ code to be able 
  to generate PDF and DVI output from the Perl module output. 
 
 \anchor cfg_perlmod_pretty
@@ -2285,10 +2403,10 @@ EXTRA_PACKAGES = times
 \anchor cfg_perlmod_makevar_prefix
 <dt>\c PERLMOD_MAKEVAR_PREFIX <dd>
  \addindex PERLMOD_MAKEVAR_PREFIX
- The names of the make variables in the generated doxyrules.make file 
+ The names of the make variables in the generated `doxyrules.make` file 
  are prefixed with the string contained in \c PERLMOD_MAKEVAR_PREFIX. 
- This is useful so different doxyrules.make files included by the same
Makefile don't overwrite each other's variables.
+ This is useful so different `doxyrules.make` files included by the same
`Makefile` don't overwrite each other's variables.
 
 </dl>
 
@@ -2308,20 +2426,20 @@ EXTRA_PACKAGES = times
  If the \c MACRO_EXPANSION tag is set to \c YES doxygen will expand all macro
  names in the source code. If set to \c NO (the default) only conditional 
  compilation will be performed. Macro expansion can be done in a controlled
- way by setting \c EXPAND_ONLY_PREDEF to \c YES.
+ way by setting \ref cfg_expand_only_predef "EXPAND_ONLY_PREDEF" to \c YES.
 
 \anchor cfg_expand_only_predef
 <dt>\c EXPAND_ONLY_PREDEF <dd>
  \addindex EXPAND_ONLY_PREDEF
- If the \c EXPAND_ONLY_PREDEF and \c MACRO_EXPANSION tags are both set to YES
+ If the \c EXPAND_ONLY_PREDEF and \ref cfg_macro_expansion "MACRO_EXPANSION" tags are both set to \c YES
  then the macro expansion is limited to the macros specified with the
- \c PREDEFINED and \c EXPAND_AS_DEFINED tags.
+ \ref cfg_predefined "PREDEFINED" and \ref cfg_expand_as_defined "EXPAND_AS_DEFINED" tags.
 
 \anchor cfg_search_includes
 <dt>\c SEARCH_INCLUDES <dd>
  \addindex SEARCH_INCLUDES 
  If the \c SEARCH_INCLUDES tag is set to \c YES (the default) the includes files
- in the \c INCLUDE_PATH (see below) will be searched if a \#include is found.
+ in the \ref cfg_include_path "INCLUDE_PATH" will be searched if a \c \#include is found.
 
 \anchor cfg_include_path
 <dt>\c INCLUDE_PATH <dd>
@@ -2335,27 +2453,28 @@ EXTRA_PACKAGES = times
  \addindex INCLUDE_FILE_PATTERNS
  You can use the \c INCLUDE_FILE_PATTERNS tag to specify one or more wildcard 
  patterns (like `*.h` and `*.hpp`) to filter out the header-files in the 
- directories. If left blank, the patterns specified with \c FILE_PATTERNS will 
+ directories. If left blank, the patterns specified with \ref cfg_file_patterns "FILE_PATTERNS" will 
  be used. 
 
 \anchor cfg_predefined
 <dt>\c PREDEFINED <dd>
  \addindex PREDEFINED
  The \c PREDEFINED tag can be used to specify one or more macro names that
- are defined before the preprocessor is started (similar to the -D option of
- gcc). The argument of the tag is a list of macros of the form:
+ are defined before the preprocessor is started (similar to the `-D` option of
\c gcc). The argument of the tag is a list of macros of the form:
  <code>name</code> or <code>name=definition</code> (no spaces). 
  If the definition and the "=" are omitted,  "=1" is assumed. To prevent
- a macro definition from being undefined via \#undef or recursively expanded
- use the := operator instead of the = operator.
+ a macro definition from being undefined via \c \#undef or recursively expanded
+ use the \c := operator instead of the \c = operator.
 
 \anchor cfg_expand_as_defined
 <dt>\c EXPAND_AS_DEFINED <dd>
  \addindex EXPAND_AS_DEFINED
- If the \c MACRO_EXPANSION and \c EXPAND_ONLY_PREDEF tags are set to \c YES then
+ If the \ref cfg_macro_expansion "MACRO_EXPANSION" and
+ \ref cfg_expand_only_predef "EXPAND_ONLY_PREDEF" tags are set to \c YES then
  this tag can be used to specify a list of macro names that should be expanded.
  The macro definition that is found in the sources will be used.
- Use the \c PREDEFINED tag if you want to use a different macro definition.
+ Use the \ref cfg_predefined "PREDEFINED" tag if you want to use a different macro definition.
 
 \anchor cfg_skip_function_macros
 <dt>\c SKIP_FUNCTION_MACROS <dd>
@@ -2378,7 +2497,7 @@ EXTRA_PACKAGES = times
  See \ref external for more information about the use of tag files.
 
  \note
-  Each tag file must have a unique name 
+  Each tag file must have an unique name 
   (where the name does \e not include the path).
   If a tag file is not located in the directory in which doxygen 
   is run, you must also specify the path to the tagfile here.
@@ -2404,6 +2523,13 @@ EXTRA_PACKAGES = times
  If the \c EXTERNAL_GROUPS tag is set to \c YES all external groups will be listed
  in the modules index. If set to \c NO, only the current project's groups will
  be listed.
+
+\anchor cfg_external_pages
+<dt>\c EXTERNAL_PAGES <dd>
+ \addindex EXTERNAL_PAGES
+ If the \c EXTERNAL_PAGES tag is set to \c YES all external pages will be listed 
+ in the related pages index. If set to \c NO, only the current project's 
+ pages will be listed. 
  
 \anchor cfg_perl_path
 <dt>\c PERL_PATH <dd>
@@ -2420,9 +2546,9 @@ EXTRA_PACKAGES = times
  \addindex CLASS_DIAGRAMS
  If the \c CLASS_DIAGRAMS tag is set to \c YES (the default) doxygen will
  generate a class diagram (in HTML and \f$\mbox{\LaTeX}\f$) for classes with base or
-super classes. Setting the tag to NO turns the diagrams off. Note that 
-this option also works with HAVE_DOT disabled, but it is recommended to 
-install and use dot, since it yields more powerful graphs. 
+super classes. Setting the tag to \c NO turns the diagrams off. Note that 
+this option also works with \ref cfg_have_dot "HAVE_DOT" disabled, but it is recommended to 
+install and use \c dot, since it yields more powerful graphs. 
 
 \anchor cfg_mscgen_path
 <dt>\c MSCGEN_PATH <dd>
@@ -2436,16 +2562,16 @@ install and use dot, since it yields more powerful graphs.
 \anchor cfg_have_dot
 <dt>\c HAVE_DOT <dd>
  \addindex HAVE_DOT
- If you set the \c HAVE_DOT tag to \c YES then doxygen will assume the dot tool is
- available from the path. This tool is part of 
- <a href="http://www.research.att.com/sw/tools/graphviz/">Graphviz</a>, a graph 
+ If you set the \c HAVE_DOT tag to \c YES then doxygen will assume the \c dot tool is
+ available from the \c path. This tool is part of 
+ <a href=" http://www.graphviz.org/">Graphviz</a>, a graph 
  visualization toolkit from AT\&T and Lucent Bell Labs. The other options in 
  this section have no effect if this option is set to \c NO (the default)
 
 \anchor cfg_dot_num_threads
 <dt>\c DOT_NUM_THREADS <dd>
  \addindex DOT_NUM_THREADS
- The \c DOT_NUM_THREADS specifies the number of dot invocations doxygen is 
+ The \c DOT_NUM_THREADS specifies the number of \c dot invocations doxygen is 
  allowed to run in parallel. When set to 0 (the default) doxygen will 
  base this on the number of processors available in the system. You can set it 
  explicitly to a value larger than 0 to get control over the balance 
@@ -2459,7 +2585,7 @@ install and use dot, since it yields more powerful graphs.
  When you want a differently looking font you can specify the font name 
  using \c DOT_FONTNAME. You need to make sure dot is able to find the font, 
  which can be done by putting it in a standard location or by setting the 
- \c DOTFONTPATH environment variable or by setting \c DOT_FONTPATH to the 
+ \c DOTFONTPATH environment variable or by setting \ref cfg_dot_fontpath "DOT_FONTPATH" to the 
  directory containing the font. 
 
 \anchor cfg_dot_fontsize
@@ -2470,23 +2596,23 @@ The default size is 10pt.
 \anchor cfg_dot_fontpath
 <dt>\c DOT_FONTPATH <dd>
  \addindex DOT_FONTPATH
- By default doxygen will tell dot to use the output directory to look for the 
+ By default doxygen will tell \c dot to use the output directory to look for the 
  \c FreeSans.ttf font (which doxygen will put there itself). If you specify a 
- different font using \c DOT_FONTNAME you can set the path where dot 
+ different font using \ref cfg_dot_fontname "DOT_FONTNAME" you can set the path where \c dot 
  can find it using this tag.
  
 \anchor cfg_class_graph
 <dt>\c CLASS_GRAPH <dd>
  \addindex CLASS_GRAPH
- If the \c CLASS_GRAPH and \c HAVE_DOT tags are set to \c YES then doxygen
+ If the \c CLASS_GRAPH and \ref cfg_have_dot "HAVE_DOT" tags are set to \c YES then doxygen
  will generate a graph for each documented class showing the direct and
  indirect inheritance relations. Setting this tag to \c YES will force 
- the \c CLASS_DIAGRAMS tag to NO.
+ the \ref cfg_class_diagrams "CLASS_DIAGRAMS" tag to \c NO.
 
 \anchor cfg_collaboration_graph
 <dt>\c COLLABORATION_GRAPH <dd>
  \addindex COLLABORATION_GRAPH
- If the \c COLLABORATION_GRAPH and \c HAVE_DOT tags are set to \c YES then doxygen
+ If the \c COLLABORATION_GRAPH and \ref cfg_have_dot "HAVE_DOT" are set to \c YES then doxygen
  will generate a graph for each documented class showing the direct and
  indirect implementation dependencies (inheritance, containment, and
  class references variables) of the class with other documented classes.
@@ -2494,24 +2620,24 @@ The default size is 10pt.
 \anchor cfg_group_graphs
 <dt>\c GROUP_GRAPHS <dd>
  \addindex GROUP_GRAPHS
- If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen
+ If the \c GROUP_GRAPHS and \ref cfg_have_dot "HAVE_DOT" tags are set to \c YES then doxygen
  will generate a graph for groups, showing the direct groups dependencies.
 
 \anchor cfg_uml_look
 <dt>\c UML_LOOK <dd>
  \addindex UML_LOOK
- If the UML_LOOK tag is set to YES doxygen will generate inheritance and
+ If the \c UML_LOOK tag is set to \c YES doxygen will generate inheritance and
  collaboration diagrams in a style similar to the OMG's Unified Modeling
  Language.
 
 \anchor cfg_uml_limit_num_fields
 <dt>\c UML_LIMIT_NUM_FIELDS <dd>
  \addindex UML_LIMIT_NUM_FIELDS
- If the \c UML_LOOK tag is enabled, the fields and methods are shown inside 
+ If the \ref cfg_uml_look "UML_LOOK" tag is enabled, the fields and methods are shown inside 
  the class node. If there are many fields or methods and many nodes the 
  graph may become too big to be useful. The \c UML_LIMIT_NUM_FIELDS 
  threshold limits the number of items for each type to make the size more 
- managable. Set this to 0 for no limit. Note that the threshold may be 
+ manageable. Set this to 0 for no limit. Note that the threshold may be
  exceeded by 50% before the limit is enforced. So when you set the threshold
  to 10, up to 15 fields may appear, but if the number exceeds 15, the
  total amount of fields shown is limited to 10.
@@ -2519,20 +2645,22 @@ The default size is 10pt.
 \anchor cfg_template_relations
 <dt>\c TEMPLATE_RELATIONS <dd>
  \addindex TEMPLATE_RELATIONS
- If the \c TEMPLATE_RELATIONS and \c HAVE_DOT tags are set to \c YES then 
+ If the \c TEMPLATE_RELATIONS and \ref cfg_have_dot "HAVE_DOT" tags are set to \c YES then 
  doxygen will show the relations between templates and their instances.
 
 \anchor cfg_hide_undoc_relations
 <dt>\c HIDE_UNDOC_RELATIONS <dd>
  \addindex HIDE_UNDOC_RELATIONS
- If set to YES, the inheritance and collaboration graphs will hide
+ If set to \c YES, the inheritance and collaboration graphs will hide
  inheritance and usage relations if the target is undocumented
  or is not a class.
 
 \anchor cfg_include_graph
 <dt>\c INCLUDE_GRAPH <dd>
  \addindex INCLUDE_GRAPH 
- If the \c ENABLE_PREPROCESSING, \c SEARCH_INCLUDES, \c INCLUDE_GRAPH, and \c HAVE_DOT
+ If the \ref cfg_enable_preprocessing "ENABLE_PREPROCESSING",
+ \ref cfg_search_includes "SEARCH_INCLUDES", \ref cfg_include_graph "INCLUDE_GRAPH",
+ and \ref cfg_have_dot "HAVE_DOT"
  tags are set to \c YES then doxygen will generate a graph for each documented file
  showing the direct and indirect include dependencies of the file with other
  documented files.
@@ -2540,41 +2668,42 @@ The default size is 10pt.
 \anchor cfg_included_by_graph
 <dt>\c INCLUDED_BY_GRAPH <dd>
  \addindex INCLUDED_BY_GRAPH 
- If the \c ENABLE_PREPROCESSING, \c SEARCH_INCLUDES, \c INCLUDED_BY_GRAPH, and
- \c HAVE_DOT tags are set to \c YES then doxygen will generate a graph for each
+ If the \ref cfg_enable_preprocessing "ENABLE_PREPROCESSING",
+ \ref cfg_search_includes "SEARCH_INCLUDES", \ref cfg_include_graph "INCLUDED_BY_GRAPH", and
+ \ref cfg_have_dot "HAVE_DOT" tags are set to \c YES then doxygen will generate a graph for each
  documented header file showing the documented files that directly or indirectly
  include this file.
 
 \anchor cfg_call_graph
 <dt>\c CALL_GRAPH <dd>
  \addindex CALL_GRAPH
- If the \c CALL_GRAPH and \c HAVE_DOT tags are set to \c YES then doxygen will 
+ If the \c CALL_GRAPH and \ref cfg_have_dot "HAVE_DOT" tags are set to \c YES then doxygen will 
  generate a call dependency graph for every global function or class method. 
  Note that enabling this option will significantly increase the time of a run.
  So in most cases it will be better to enable call graphs for selected 
- functions only using the \\callgraph command.
+ functions only using the \ref cmdcallgraph "\\callgraph" command.
 
 \anchor cfg_caller_graph
 <dt>\c CALLER_GRAPH <dd>
  \addindex CALLER_GRAPH
- If the \c CALLER_GRAPH and \c HAVE_DOT tags are set to \c YES then doxygen will 
+ If the \c CALLER_GRAPH and \ref cfg_have_dot "HAVE_DOT" tags are set to \c YES then doxygen will 
  generate a caller dependency graph for every global function or class method. 
  Note that enabling this option will significantly increase the time of a run.
  So in most cases it will be better to enable caller graphs for selected 
- functions only using the \\callergraph command.
+ functions only using the \ref cmdcallergraph "\\callergraph" command.
 
 \anchor cfg_graphical_hierarchy
 <dt>\c GRAPHICAL_HIERARCHY <dd>
  \addindex GRAPHICAL_HIERARCHY
- If the \c GRAPHICAL_HIERARCHY and \c HAVE_DOT tags are set to \c YES then 
+ If the \c GRAPHICAL_HIERARCHY and \ref cfg_have_dot "HAVE_DOT" tags are set to \c YES then 
  doxygen will graphical hierarchy of all classes instead of a textual one.
 
 \anchor cfg_directory_graph
 <dt>\c DIRECTORY_GRAPH <dd>
  \addindex DIRECTORY_GRAPH                 
- If the \c DIRECTORY_GRAPH, and \c HAVE_DOT options are set 
+ If the \c DIRECTORY_GRAPH, and \ref cfg_have_dot "HAVE_DOT" options are set 
  to \c YES then doxygen will show the dependencies a directory has on other directories
- in a graphical way. The dependency relations are determined by the \#include
+ in a graphical way. The dependency relations are determined by the \c \#include
  relations between the files in the directories.
 
 \anchor cfg_dot_graph_max_nodes 
@@ -2586,43 +2715,43 @@ The default size is 10pt.
  visualized by representing a node as a red box. Note that doxygen if the number
  of direct children of the root node in a graph is already larger than
  \c DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note
- that the size of a graph can be further restricted by \c MAX_DOT_GRAPH_DEPTH.
+ that the size of a graph can be further restricted by \ref cfg_max_dot_graph_depth "MAX_DOT_GRAPH_DEPTH".
 
 \anchor cfg_max_dot_graph_depth
 <dt>\c MAX_DOT_GRAPH_DEPTH <dd>
  \addindex MAX_DOT_GRAPH_DEPTH
  The \c MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the 
- graphs generated by dot. A depth value of 3 means that only nodes reachable
+ graphs generated by \c dot. A depth value of 3 means that only nodes reachable
  from the root by following a path via at most 3 edges will be shown. Nodes
  that lay further from the root node will be omitted. Note that setting this
  option to 1 or 2 may greatly reduce the computation time needed for large
  code bases. Also note that the size of a graph can be further restricted by
- \c DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction (the default).
+ \ref cfg_dot_graph_max_nodes "DOT_GRAPH_MAX_NODES". Using a depth of 0 means no depth restriction (the default).
 
 \anchor cfg_dot_image_format
 <dt>\c DOT_IMAGE_FORMAT <dd>
  \addindex DOT_IMAGE_FORMAT
  The \c DOT_IMAGE_FORMAT tag can be used to set the image format of the images
- generated by dot. Possible values are svg, png, jpg, or gif.
+ generated by \c dot. Possible values are \c svg, \c png, \c jpg, or \c gif.
  If left blank png will be used.
  \note If you choose \c svg you need to set 
HTML_FILE_EXTENSION to xhtml in order to make the SVG files
\ref cfg_html_file_extension "HTML_FILE_EXTENSION" to \c xhtml in order to make the SVG files
  visible in IE 9+ (other browsers do not have this requirement).
 
 \anchor cfg_interactive_svg
 <dt>\c INTERACTIVE_SVG <dd>
- If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to
+ If \ref cfg_dot_image_format "DOT_IMAGE_FORMAT" is set to \c svg, then this option can be set to \c YES to
  enable generation of interactive SVG images that allow zooming and panning. 
  Note that this requires a modern browser other than Internet Explorer. 
  Tested and working are Firefox, Chrome, Safari, and Opera.
- \note For IE 9+ you need to set \c HTML_FILE_EXTENSION to xhtml in order 
+ \note For IE 9+ you need to set \ref cfg_html_file_extension "HTML_FILE_EXTENSION" to xhtml in order 
  to make the SVG files visible. Older versions of IE do not have SVG support.
 
 \anchor cfg_dot_path
 <dt>\c DOT_PATH <dd>
  \addindex DOT_PATH
- This tag can be used to specify the path where the dot tool can be found. 
- If left blank, it is assumed the dot tool can be found on the path. 
+ This tag can be used to specify the path where the \c dot tool can be found. 
+ If left blank, it is assumed the \c dot tool can be found in the \c path. 
 
 \anchor cfg_dotfile_dirs
 <dt>\c DOTFILE_DIRS <dd>
@@ -2652,7 +2781,7 @@ The default size is 10pt.
  \addindex DOT_MULTI_TARGET
  Set the \c DOT_MULTI_TARGETS tag to \c YES allow dot to generate multiple output
  files in one run (i.e. multiple -o and -T options on the command line). This
- makes dot run faster, but since only newer versions of dot (>1.8.10)
+ makes \c dot run faster, but since only newer versions of \c dot (>1.8.10)
  support this, this feature is disabled by default.
 
 \anchor cfg_generate_legend 
@@ -2679,7 +2808,7 @@ Then a minimal configuration file is as simple as:
 INPUT            = example.cc example.h
 \endverbatim
 
-Assuming the example makes use of Qt classes and perl is located 
+Assuming the example makes use of Qt classes and \c perl is located 
 in <code>/usr/bin</code>, a more realistic configuration file would be:
 \verbatim
 PROJECT_NAME     = Example
@@ -2778,5 +2907,11 @@ Here doxygen's preprocessor is used to substitute some
 macro names that are normally substituted by the C preprocessor,
 but without doing full macro expansion.
 
+
+\htmlonly
+Go to the <a href="commands.html">next</a> section or return to the
+ <a href="index.html">index</a>.
+\endhtmlonly
+
 */
 
index 06ef0d1..70d52e4 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -122,4 +122,11 @@ which will expand to
 \endverbatim
 
 
+\htmlonly
+<br/>
+Go to the <a href="external.html">next</a> section or return to the
+ <a href="index.html">index</a>.
+\endhtmlonly
+
+
 */
index b035826..6e321bd 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -250,7 +250,18 @@ defined group with title "My Group":
   </navindex>
 \endverbatim
 
-Groups can be nested to form a hierarchy.
+Groups can be nested to form a hierarchy. 
+
+By default a usergroup entry in the navigation tree is a link to
+a landing page with the contents of the group. You can link to a
+different page using the `url` attribute just like you can for the
+`<tab>` element and prevent any link using `url="[none]"`, i.e.
+
+\verbatim
+   <tab type="usergroup" title="Group without link" url="[none]">
+   ...
+   </tab>
+\endverbatim
 
 The elements after \c navindex represent the layout of the different 
 pages generated by doxygen:
@@ -381,4 +392,10 @@ See <a href="https://github.com/michaeljones/breathe">the Breathe project</a> fo
 a example that uses doxygen XML output from Python to bridge it with the 
 <a href="http://sphinx.pocoo.org/">Sphinx</a> document generator.
 
+
+\htmlonly
+Go to the <a href="custcmd.html">next</a> section or return to the
+ <a href="index.html">index</a>.
+\endhtmlonly
+
  */
index 56f82b8..59a81cc 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -133,15 +133,16 @@ that doxygen can generate:
 <code>diagrams_e.h</code>
 \verbinclude diagrams_e.h
 
- \htmlonly
- Click <a href="$(DOXYGEN_DOCDIR)/examples/diagrams/html/index.html">here</a>
- for the corresponding HTML documentation that is generated by doxygen<br/>
- (<code>EXTRACT_ALL</code> = <code>YES</code> is used here).<p>
- \endhtmlonly
+\htmlonly
+Click <a href="$(DOXYGEN_DOCDIR)/examples/diagrams/html/index.html">here</a>
+for the corresponding HTML documentation that is generated by doxygen<br/>
+(<code>EXTRACT_ALL</code> = <code>YES</code> is used here).
+\endhtmlonly
 
 \htmlonly
+<br><br>
 Go to the <a href="preprocessing.html">next</a> section or return to the
- <a href="index.html">index</a>.
+<a href="index.html">index</a>.
 \endhtmlonly
 
 */
index d6bb675..1b96361 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -429,17 +429,12 @@ Since python looks more like Java than like C or C++, you should set
 config file. 
 
 
-\htmlonly
-Go to the <a href="lists.html">next</a> section or return to the
- <a href="index.html">index</a>.
-\endhtmlonly
-
 \subsection vhdlblocks Comment blocks in VHDL
 
 For VHDL a comment normally start with "--". Doxygen will extract comments
 starting with "--!". There are only two types of comment blocks in VHDL;
-a one line --! comment representing a brief description, and a multi-line
---! comment (where the --! prefix is repeated for each line) representing
+a one line "--!" comment representing a brief description, and a multi-line
+"--!" comment (where the "--!" prefix is repeated for each line) representing
 a detailed description.
 
 Comments are always located in front of the item that is being documented
@@ -554,10 +549,6 @@ Following is a example using doxygen style comments:
  for the corresponding HTML documentation that is generated by doxygen.
  \endhtmlonly
 
-\htmlonly
-Go to the <a href="lists.html">next</a> section or return to the
- <a href="index.html">index</a>.
-\endhtmlonly
 
 \section docstructure Anatomy of a comment block
 
index 45090f4..c227791 100644 (file)
@@ -23,7 +23,11 @@ doxygen [configName]
 .IP
 If - is used for configName doxygen will read from standard input.
 .TP
-4) Use doxygen to generate a template style sheet file for RTF, HTML or Latex.
+4) Use doxygen to generate a template file controlling the layout of the generated documentation:
+.IP
+doxygen -l layoutFileName.xml
+.TP
+5) Use doxygen to generate a template style sheet file for RTF, HTML or Latex.
 .TP
 RTF:
 doxygen \fB\-w\fR rtf styleSheetFile
@@ -33,7 +37,7 @@ doxygen \fB\-w\fR html headerFile footerFile styleSheetFile [configFile]
 .TP
 LaTeX: doxygen \fB\-w\fR latex headerFile footerFile styleSheetFile [configFile]
 .TP
-5) Use doxygen to generate an rtf extensions file
+6) Use doxygen to generate an rtf extensions file
 .TP
 RTF:
 doxygen \fB\-e\fR rtf extensionsFile
@@ -41,6 +45,6 @@ doxygen \fB\-e\fR rtf extensionsFile
 If \fB\-s\fR is specified the comments in the config file will be omitted.
 If configName is omitted `Doxyfile' will be used as a default.
 .SH AUTHOR
-Doxygen version VERSION, Copyright Dimitri van Heesch 1997-2012
+Doxygen version VERSION, Copyright Dimitri van Heesch 1997-2013
 .SH SEE ALSO
 doxywizard(1).
index 45395b4..3286004 100644 (file)
@@ -983,6 +983,8 @@ dl.section dd {
        margin: 0px;
        width: 100%;
        border-bottom: 1px solid #848484;
+        visibility: hidden;
+       height: 0px;
 }
 
 .image
index cd9a544..51c2e47 100644 (file)
@@ -1,7 +1,7 @@
 %
 % 
 %
-% Copyright (C) 1997-2011 by Dimitri van Heesch.
+% Copyright (C) 1997-2013 by Dimitri van Heesch.
 %
 % Permission to use, copy, modify, and distribute this software and its
 % documentation under the terms of the GNU General Public License is hereby 
@@ -83,6 +83,7 @@ Written by Dimitri van Heesch\\[2ex]
 \chapter{Getting Started}\label{starting}\hypertarget{starting}{}\input{starting}
 \chapter{Documenting the code}\label{docblocks}\hypertarget{docblocks}{}\input{docblocks}
 \chapter{Markdown}\label{markdown}\hypertarget{markdown}{}\input{markdown}
+\chapter{Lists}\label{lists}\hypertarget{lists}{}\input{lists}
 \chapter{Grouping}\label{grouping}\hypertarget{grouping}{}\input{grouping}
 \chapter{Including Formulas}\label{formulas}\hypertarget{formulas}{}\input{formulas}
 \chapter{Graphs and diagrams}\label{diagrams}\hypertarget{diagrams}{}\input{diagrams}
@@ -90,7 +91,6 @@ Written by Dimitri van Heesch\\[2ex]
 \chapter{Automatic link generation}\label{autolink}\hypertarget{autolink}{}\input{autolink}
 \chapter{Output Formats}\label{output}\hypertarget{output}{}\input{output}
 \chapter{Searching}\label{searching}\hypertarget{searching}{}\input{searching}
-\chapter{External Indexing and Searching}\label{extsearch}\hypertarget{extsearch}{}\input{extsearch}
 \chapter{Customizing the Output}\label{customize}\hypertarget{customize}{}\input{customize}
 \chapter{Custom Commands}\label{custcmd}\hypertarget{custcmd}{}\input{custcmd}
 \chapter{Link to external documentation}\label{external}\hypertarget{external}{}\input{external}
index 40e5163..ddad5d7 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -67,19 +67,23 @@ afterwards:
 \verbatim
 doxygen -w html header.html footer.html stylesheet.css <config_file>
 \endverbatim
-  The config_file is optional. When omitted doxygen will search for 
-  a file named Doxyfile and process that. When this is also not found it
+  The `config_file` is optional. When omitted doxygen will search for 
+  a file named `Doxyfile` and process that. When this is also not found it
   will used the default settings.
 
-<li>For LaTeX output, you can generate the first part of \c refman.tex 
-    (see \ref cfg_latex_header "LATEX_HEADER") and the style sheet included
-    by that header (normally <code>doxygen.sty</code>), using:
+<li>For \f$\mbox{\LaTeX}\f$ output, you can generate the first and last part of \c refman.tex 
+    (see \ref cfg_latex_header "LATEX_HEADER" and
+     \ref cfg_latex_footer "LATEX_FOOTER") and the style sheet included
+    by that header (normally <code>doxygen.sty</code>), using the following
+    command:
 \verbatim
-doxygen -w latex header.tex doxygen.sty
+doxygen -w latex header.tex footer.tex doxygen.sty <config_file>
 \endverbatim
-If you need non-default options (for instance to use pdflatex) you need
-to make a config file with those options set correctly and then specify
-that config file as the third argument. 
+If you need non-default options (for instance to use extra \f$\mbox{\LaTeX}\f$ packages) 
+you need to make a config file with those options set correctly and then specify
+that config file after the generated files (make a backup of the configuration
+file first so you don't loose it in case you forget to specify one of the 
+output files).
 <li>For RTF output, you can generate the default style sheet file (see
     \ref cfg_rtf_stylesheet_file "RTF_STYLESHEET_FILE") using:
 \verbatim
@@ -103,4 +107,10 @@ doxygen -w rtf rtfstyle.cfg
      a file, use \c - for the file name.
 </ul>
 
+
+\htmlonly
+Go to the <a href="doxywizard_usage.html">next</a> section or return to the
+ <a href="index.html">index</a>.
+\endhtmlonly
+
 */
index 435661b..6ae8373 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -135,4 +135,10 @@ The GUI front-end has a menu with a couple of useful items
     You will be asked to confirm the action.
 </dl>
 
+
+\htmlonly
+Go to the <a href="config.html">next</a> section or return to the
+ <a href="index.html">index</a>.
+\endhtmlonly
+
 */
index 013b7c2..501254d 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index a86d1db..bc937e4 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -14,6 +14,8 @@
  */
 /*! \page extsearch External Indexing and Searching
 
+[TOC]
+
 \section extsearch_intro Introduction
 
 With release 1.8.3, doxygen provides the ability to search through HTML using
@@ -34,26 +36,9 @@ engine, doxygen provides an example tool for each action: `doxyindexer`
 for indexing the data and `doxysearch.cgi` for searching through the index.
 
 The data flow is shown in the following diagram:
-\dot
-digraph Flow {
-  edge [fontname="helvetica",fontsize="10pt"];
-  node [shape=ellipse,fontname="helvetica",fontsize="10pt"];
-  doxygen;
-  doxyindexer;
-  doxysearch [label="doxysearch.cgi"];
-  browser [label="HTML page\nin browser"];
-  node [shape=note];
-  searchdata [label="searchdata.xml"];
-  searchindex [label="doxysearch.db"];
-
-  doxygen -> searchdata [label=" writes"];
-  searchdata -> doxyindexer [label=" reads"];
-  doxyindexer -> searchindex [label=" writes"];
-  searchindex -> doxysearch [label=" reads"];
-  doxysearch -> browser [label=" get results "];
-  browser -> doxysearch [label=" query "];
-}
-\enddot
+
+\image html extsearch_flow.png "External Search Data Flow"
+\image latex extsearch_flow.eps "External Search Data Flow" height=10cm
 
 - `doxygen` produces the raw search data
 - `doxyindexer` indexes the data into a search database `doxysearch.db`
@@ -135,47 +120,49 @@ Now you should be enable to search for words and symbols from the HTML output.
 
 \subsection extsearch_multi Multi project index
 
-In case you have two doxygen projects A and B where B depends on A via a 
-tag file, i.e. the configuration of project A says:
-
-    GENERATE_TAGFILES = A.tag
-
-and the configuration of project B has its dependency on A configured as 
-follows:
-
-    TAGFILES = ../project_A/A.tag=../../project_A/html
-
-then it may be desirable to allow searching for words in both projects.
+In case you have more than one doxygen project and these projects are related, 
+it may be desirable to allow searching for words in all projects from within 
+the documentation of any of the projects.
 
 To make this possible all that is needed is to combine the search data
-for both projects into one index, i.e. run
+for all projects into a single index, e.g. for two projects A and B for which the
+searchdata.xml is generated in directories project_A and project_B run:
 
     doxyindexer project_A/searchdata.xml project_B/searchdata.xml
 
 and then copy the resulting `doxysearch.db` to the directory where also
-`doxysearch.cgi` used by project B is located.
+`doxysearch.cgi` is located.
 
-In case you also want to link to search results in project B 
-from the search page of project A (or in general 
-between two projects that are otherwise unrelated),
-you need to give some additional information in order for doxygen to make 
-the right links. This is what the 
-\ref cfg_extra_search_mappings "EXTRA_SEARCH_MAPPINGS" option is for.
+The `searchdata.xml` file doesn't contain any absolute paths or links, 
+so how can the search results from multiple projects be linked back to the right documentation set?
+This is where the `EXTERNAL_SEARCH_ID` and `EXTRA_SEARCH_MAPPINGS` options come into play.
 
-Each project needs to have a tag file defined, i.e. in the above example 
-involving project A and B, also project B should define a tag file:
+To be able to identify the different projects, one needs to
+set a unique ID using \ref cfg_external_search_id "EXTERNAL_SEARCH_ID"
+for each project.
 
-    GENERATE_TAGFILES = B.tag
+To link the search results to the right project, you need to define a
+mapping per project using the \ref cfg_extra_search_mappings "EXTRA_SEARCH_MAPPINGS" tag.
+With this option to can define the mapping from IDs of other projects to the
+(relative) location of documentation of those projects.
 
-then project A can define the mapping as follows:
+So for projects A and B the relevant part of the configuration file 
+could look as follows:
 
-    EXTRA_SEARCH_MAPPINGS = B.tag=../../project_B/html
+    project_A/Doxyfile
+    ------------------
+    EXTERNAL_SEARCH_ID    = A
+    EXTRA_SEARCH_MAPPINGS = B=../../project_B/html
 
-with this addition, projects A and B can share the same search database.
+for project A and for project B
 
-@note The mapping defined by `EXTRA_SEARCH_MAPPINGS` is treated as an 
-extension of the mappings already defined by `TAGFILES`. In case the same 
-tag file is mentioned in both options, the one in `TAGFILES` is used.
+    project_B/Doxyfile
+    ------------------
+    EXTERNAL_SEARCH_ID    = B
+    EXTRA_SEARCH_MAPPINGS = A=../../project_A/html
+    
+with these settings, projects A and B can share the same search database,
+and the search results will link to the right documentation set.
 
 \section extsearch_update Updating the index
 
@@ -316,5 +303,4 @@ The fields for such an item have the following meaning:
 - "fragments": an array with 0 or more fragments of text containing words that have been search for.
           These words should be wrapped in `<span class="hl">` and `</span>` tags to highlight them
           in the output.
-
 */
diff --git a/doc/extsearch_flow.dot b/doc/extsearch_flow.dot
new file mode 100644 (file)
index 0000000..6352fba
--- /dev/null
@@ -0,0 +1,18 @@
+digraph Flow {
+  edge [fontname="helvetica",fontsize="10pt"];
+  node [shape=ellipse,fontname="helvetica",fontsize="10pt"];
+  doxygen;
+  doxyindexer;
+  doxysearch [label="doxysearch.cgi"];
+  browser [label="HTML page\nin browser"];
+  node [shape=note];
+  searchdata [label="searchdata.xml"];
+  searchindex [label="doxysearch.db"];
+
+  doxygen -> searchdata [label=" writes"];
+  searchdata -> doxyindexer [label=" reads"];
+  doxyindexer -> searchindex [label=" writes"];
+  searchindex -> doxysearch [label=" reads"];
+  doxysearch -> browser [label=" get results "];
+  browser -> doxysearch [label=" query "];
+}
diff --git a/doc/extsearch_flow.eps b/doc/extsearch_flow.eps
new file mode 100644 (file)
index 0000000..ed140cb
--- /dev/null
@@ -0,0 +1,2100 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%Produced by poppler pdftops version: 0.18.4 (http://poppler.freedesktop.org)
+%%Creator: cairo 1.10.2 (http://cairographics.org)
+%%LanguageLevel: 2
+%%DocumentSuppliedResources: (atend)
+%%BoundingBox: 0 0 176 542
+%%DocumentSuppliedResources: (atend)
+%%EndComments
+%%BeginProlog
+%%BeginResource: procset xpdf 3.00 0
+%%Copyright: Copyright 1996-2004 Glyph & Cog, LLC
+/xpdf 75 dict def xpdf begin
+% PDF special state
+/pdfDictSize 15 def
+/pdfSetup {
+  3 1 roll 2 array astore
+  /setpagedevice where {
+    pop 3 dict begin
+      /PageSize exch def
+      /ImagingBBox null def
+      /Policies 1 dict dup begin /PageSize 3 def end def
+      { /Duplex true def } if
+    currentdict end setpagedevice
+  } {
+    pop pop
+  } ifelse
+} def
+/pdfStartPage {
+  pdfDictSize dict begin
+  /pdfFillCS [] def
+  /pdfFillXform {} def
+  /pdfStrokeCS [] def
+  /pdfStrokeXform {} def
+  /pdfFill [0] def
+  /pdfStroke [0] def
+  /pdfFillOP false def
+  /pdfStrokeOP false def
+  /pdfLastFill false def
+  /pdfLastStroke false def
+  /pdfTextMat [1 0 0 1 0 0] def
+  /pdfFontSize 0 def
+  /pdfCharSpacing 0 def
+  /pdfTextRender 0 def
+  /pdfPatternCS false def
+  /pdfTextRise 0 def
+  /pdfWordSpacing 0 def
+  /pdfHorizScaling 1 def
+  /pdfTextClipPath [] def
+} def
+/pdfEndPage { end } def
+% PDF color state
+/cs { /pdfFillXform exch def dup /pdfFillCS exch def
+      setcolorspace } def
+/CS { /pdfStrokeXform exch def dup /pdfStrokeCS exch def
+      setcolorspace } def
+/sc { pdfLastFill not { pdfFillCS setcolorspace } if
+      dup /pdfFill exch def aload pop pdfFillXform setcolor
+     /pdfLastFill true def /pdfLastStroke false def } def
+/SC { pdfLastStroke not { pdfStrokeCS setcolorspace } if
+      dup /pdfStroke exch def aload pop pdfStrokeXform setcolor
+     /pdfLastStroke true def /pdfLastFill false def } def
+/op { /pdfFillOP exch def
+      pdfLastFill { pdfFillOP setoverprint } if } def
+/OP { /pdfStrokeOP exch def
+      pdfLastStroke { pdfStrokeOP setoverprint } if } def
+/fCol {
+  pdfLastFill not {
+    pdfFillCS setcolorspace
+    pdfFill aload pop pdfFillXform setcolor
+    pdfFillOP setoverprint
+    /pdfLastFill true def /pdfLastStroke false def
+  } if
+} def
+/sCol {
+  pdfLastStroke not {
+    pdfStrokeCS setcolorspace
+    pdfStroke aload pop pdfStrokeXform setcolor
+    pdfStrokeOP setoverprint
+    /pdfLastStroke true def /pdfLastFill false def
+  } if
+} def
+% build a font
+/pdfMakeFont {
+  4 3 roll findfont
+  4 2 roll matrix scale makefont
+  dup length dict begin
+    { 1 index /FID ne { def } { pop pop } ifelse } forall
+    /Encoding exch def
+    currentdict
+  end
+  definefont pop
+} def
+/pdfMakeFont16 {
+  exch findfont
+  dup length dict begin
+    { 1 index /FID ne { def } { pop pop } ifelse } forall
+    /WMode exch def
+    currentdict
+  end
+  definefont pop
+} def
+% graphics state operators
+/q { gsave pdfDictSize dict begin } def
+/Q {
+  end grestore
+  /pdfLastFill where {
+    pop
+    pdfLastFill {
+      pdfFillOP setoverprint
+    } {
+      pdfStrokeOP setoverprint
+    } ifelse
+  } if
+} def
+/cm { concat } def
+/d { setdash } def
+/i { setflat } def
+/j { setlinejoin } def
+/J { setlinecap } def
+/M { setmiterlimit } def
+/w { setlinewidth } def
+% path segment operators
+/m { moveto } def
+/l { lineto } def
+/c { curveto } def
+/re { 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto
+      neg 0 rlineto closepath } def
+/h { closepath } def
+% path painting operators
+/S { sCol stroke } def
+/Sf { fCol stroke } def
+/f { fCol fill } def
+/f* { fCol eofill } def
+% clipping operators
+/W { clip newpath } def
+/W* { eoclip newpath } def
+/Ws { strokepath clip newpath } def
+% text state operators
+/Tc { /pdfCharSpacing exch def } def
+/Tf { dup /pdfFontSize exch def
+      dup pdfHorizScaling mul exch matrix scale
+      pdfTextMat matrix concatmatrix dup 4 0 put dup 5 0 put
+      exch findfont exch makefont setfont } def
+/Tr { /pdfTextRender exch def } def
+/Tp { /pdfPatternCS exch def } def
+/Ts { /pdfTextRise exch def } def
+/Tw { /pdfWordSpacing exch def } def
+/Tz { /pdfHorizScaling exch def } def
+% text positioning operators
+/Td { pdfTextMat transform moveto } def
+/Tm { /pdfTextMat exch def } def
+% text string operators
+/cshow where {
+  pop
+  /cshow2 {
+    dup {
+      pop pop
+      1 string dup 0 3 index put 3 index exec
+    } exch cshow
+    pop pop
+  } def
+}{
+  /cshow2 {
+    currentfont /FontType get 0 eq {
+      0 2 2 index length 1 sub {
+        2 copy get exch 1 add 2 index exch get
+        2 copy exch 256 mul add
+        2 string dup 0 6 5 roll put dup 1 5 4 roll put
+        3 index exec
+      } for
+    } {
+      dup {
+        1 string dup 0 3 index put 3 index exec
+      } forall
+    } ifelse
+    pop pop
+  } def
+} ifelse
+/awcp {
+  exch {
+    false charpath
+    5 index 5 index rmoveto
+    6 index eq { 7 index 7 index rmoveto } if
+  } exch cshow2
+  6 {pop} repeat
+} def
+/Tj {
+  fCol
+  1 index stringwidth pdfTextMat idtransform pop
+  sub 1 index length dup 0 ne { div } { pop pop 0 } ifelse
+  pdfWordSpacing pdfHorizScaling mul 0 pdfTextMat dtransform 32
+  4 3 roll pdfCharSpacing pdfHorizScaling mul add 0
+  pdfTextMat dtransform
+  6 5 roll Tj1
+} def
+/Tj16 {
+  fCol
+  2 index stringwidth pdfTextMat idtransform pop
+  sub exch div
+  pdfWordSpacing pdfHorizScaling mul 0 pdfTextMat dtransform 32
+  4 3 roll pdfCharSpacing pdfHorizScaling mul add 0
+  pdfTextMat dtransform
+  6 5 roll Tj1
+} def
+/Tj16V {
+  fCol
+  2 index stringwidth pdfTextMat idtransform exch pop
+  sub exch div
+  0 pdfWordSpacing pdfTextMat dtransform 32
+  4 3 roll pdfCharSpacing add 0 exch
+  pdfTextMat dtransform
+  6 5 roll Tj1
+} def
+/Tj1 {
+  0 pdfTextRise pdfTextMat dtransform rmoveto
+  currentpoint 8 2 roll
+  pdfTextRender 1 and 0 eq pdfPatternCS not and {
+    6 copy awidthshow
+  } if
+  pdfTextRender 3 and dup 1 eq exch 2 eq or {
+    7 index 7 index moveto
+    6 copy
+    currentfont /FontType get 3 eq { fCol } { sCol } ifelse
+    false awcp currentpoint stroke moveto
+  } if
+  pdfTextRender 4 and 0 ne pdfPatternCS or {
+    8 6 roll moveto
+    false awcp
+    /pdfTextClipPath [ pdfTextClipPath aload pop
+      {/moveto cvx}
+      {/lineto cvx}
+      {/curveto cvx}
+      {/closepath cvx}
+    pathforall ] def
+    currentpoint newpath moveto
+  } {
+    8 {pop} repeat
+  } ifelse
+  0 pdfTextRise neg pdfTextMat dtransform rmoveto
+} def
+/TJm { pdfFontSize 0.001 mul mul neg 0
+       pdfTextMat dtransform rmoveto } def
+/TJmV { pdfFontSize 0.001 mul mul neg 0 exch
+        pdfTextMat dtransform rmoveto } def
+/Tclip { pdfTextClipPath cvx exec clip newpath
+         /pdfTextClipPath [] def } def
+/Tclip* { pdfTextClipPath cvx exec eoclip newpath
+         /pdfTextClipPath [] def } def
+% Level 2 image operators
+/pdfImBuf 100 string def
+/pdfIm {
+  image
+  { currentfile pdfImBuf readline
+    not { pop exit } if
+    (%-EOD-) eq { exit } if } loop
+} def
+/pdfImM {
+  fCol imagemask
+  { currentfile pdfImBuf readline
+    not { pop exit } if
+    (%-EOD-) eq { exit } if } loop
+} def
+/pr { 2 index 2 index 3 2 roll putinterval 4 add } def
+/pdfImClip {
+  gsave
+  0 2 4 index length 1 sub {
+    dup 4 index exch 2 copy
+    get 5 index div put
+    1 add 3 index exch 2 copy
+    get 3 index div put
+  } for
+  pop pop rectclip
+} def
+/pdfImClipEnd { grestore } def
+% shading operators
+/colordelta {
+  false 0 1 3 index length 1 sub {
+    dup 4 index exch get 3 index 3 2 roll get sub abs 0.004 gt {
+      pop true
+    } if
+  } for
+  exch pop exch pop
+} def
+/funcCol { func n array astore } def
+/funcSH {
+  dup 0 eq {
+    true
+  } {
+    dup 6 eq {
+      false
+    } {
+      4 index 4 index funcCol dup
+      6 index 4 index funcCol dup
+      3 1 roll colordelta 3 1 roll
+      5 index 5 index funcCol dup
+      3 1 roll colordelta 3 1 roll
+      6 index 8 index funcCol dup
+      3 1 roll colordelta 3 1 roll
+      colordelta or or or
+    } ifelse
+  } ifelse
+  {
+    1 add
+    4 index 3 index add 0.5 mul exch 4 index 3 index add 0.5 mul exch
+    6 index 6 index 4 index 4 index 4 index funcSH
+    2 index 6 index 6 index 4 index 4 index funcSH
+    6 index 2 index 4 index 6 index 4 index funcSH
+    5 3 roll 3 2 roll funcSH pop pop
+  } {
+    pop 3 index 2 index add 0.5 mul 3 index  2 index add 0.5 mul
+    funcCol sc
+    dup 4 index exch mat transform m
+    3 index 3 index mat transform l
+    1 index 3 index mat transform l
+    mat transform l pop pop h f*
+  } ifelse
+} def
+/axialCol {
+  dup 0 lt {
+    pop t0
+  } {
+    dup 1 gt {
+      pop t1
+    } {
+      dt mul t0 add
+    } ifelse
+  } ifelse
+  func n array astore
+} def
+/axialSH {
+  dup 0 eq {
+    true
+  } {
+    dup 8 eq {
+      false
+    } {
+      2 index axialCol 2 index axialCol colordelta
+    } ifelse
+  } ifelse
+  {
+    1 add 3 1 roll 2 copy add 0.5 mul
+    dup 4 3 roll exch 4 index axialSH
+    exch 3 2 roll axialSH
+  } {
+    pop 2 copy add 0.5 mul
+    axialCol sc
+    exch dup dx mul x0 add exch dy mul y0 add
+    3 2 roll dup dx mul x0 add exch dy mul y0 add
+    dx abs dy abs ge {
+      2 copy yMin sub dy mul dx div add yMin m
+      yMax sub dy mul dx div add yMax l
+      2 copy yMax sub dy mul dx div add yMax l
+      yMin sub dy mul dx div add yMin l
+      h f*
+    } {
+      exch 2 copy xMin sub dx mul dy div add xMin exch m
+      xMax sub dx mul dy div add xMax exch l
+      exch 2 copy xMax sub dx mul dy div add xMax exch l
+      xMin sub dx mul dy div add xMin exch l
+      h f*
+    } ifelse
+  } ifelse
+} def
+/radialCol {
+  dup t0 lt {
+    pop t0
+  } {
+    dup t1 gt {
+      pop t1
+    } if
+  } ifelse
+  func n array astore
+} def
+/radialSH {
+  dup 0 eq {
+    true
+  } {
+    dup 8 eq {
+      false
+    } {
+      2 index dt mul t0 add radialCol
+      2 index dt mul t0 add radialCol colordelta
+    } ifelse
+  } ifelse
+  {
+    1 add 3 1 roll 2 copy add 0.5 mul
+    dup 4 3 roll exch 4 index radialSH
+    exch 3 2 roll radialSH
+  } {
+    pop 2 copy add 0.5 mul dt mul t0 add
+    radialCol sc
+    encl {
+      exch dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add
+      0 360 arc h
+      dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add
+      360 0 arcn h f
+    } {
+      2 copy
+      dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add
+      a1 a2 arcn
+      dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add
+      a2 a1 arcn h
+      dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add
+      a1 a2 arc
+      dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add
+      a2 a1 arc h f
+    } ifelse
+  } ifelse
+} def
+end
+%%EndResource
+%%EndProlog
+%%BeginSetup
+xpdf begin
+%%BeginResource: font CairoFont-0-0
+%!PS-AdobeFont-1.0: NimbusSanL-Regu 1.06
+%%Title: NimbusSanL-Regu
+%Version: 1.06
+%%CreationDate: Thu Aug  2 14:35:58 2007
+%%Creator: frob
+%Copyright: Copyright (URW)++,Copyright 1999 by (URW)++ Design &
+%Copyright:  Development; Cyrillic glyphs added by Valek Filippov (C)
+%Copyright:  2001-2005
+% Generated by FontForge 20070723 (http://fontforge.sf.net/)
+%%EndComments
+
+FontDirectory/NimbusSanL-Regu known{/NimbusSanL-Regu findfont dup/UniqueID known pop false {dup
+/UniqueID get 5020902 eq exch/FontType get 1 eq and}{pop false}ifelse
+{save true}{false}ifelse}{false}ifelse
+11 dict begin
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def
+/FontName /CairoFont-0-0 def
+/FontBBox {-174 -285 1022 953 }readonly def
+                     
+/PaintType 0 def
+/FontInfo 9 dict dup begin
+ /version (1.06) readonly def
+ /Notice (Copyright \050URW\051++,Copyright 1999 by \050URW\051++ Design & Development; Cyrillic glyphs added by Valek Filippov \050C\051 2001-2005) readonly def
+ /FullName (Nimbus Sans L Regular) readonly def
+ /FamilyName (Nimbus Sans L) readonly def
+ /Weight (Regular) readonly def
+ /ItalicAngle 0 def
+ /isFixedPitch false def
+ /UnderlinePosition -151 def
+ /UnderlineThickness 50 def
+end readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 17 /space put
+dup 14 /period put
+dup 21 /H put
+dup 24 /L put
+dup 23 /M put
+dup 22 /T put
+dup 9 /a put
+dup 20 /b put
+dup 11 /c put
+dup 1 /d put
+dup 6 /e put
+dup 5 /g put
+dup 12 /h put
+dup 19 /i put
+dup 16 /l put
+dup 15 /m put
+dup 7 /n put
+dup 2 /o put
+dup 25 /p put
+dup 27 /q put
+dup 10 /r put
+dup 8 /s put
+dup 13 /t put
+dup 26 /u put
+dup 18 /w put
+dup 3 /x put
+dup 4 /y put
+readonly def
+currentdict end
+currentfile eexec
+f983ef0097ece61cf3a79690d73bfb4b0027b850f3158905fdac1bc024d7276e
+0a12b7ddcede59e3601ab4509dfe0977ed5bf624ebc1f818c45f1350d41b052a
+72743accb053eb06ed043568d3196a30bed220227e2a15bacef508449221cf33
+8a8666e92410a9aa91d5a31900a93c01ec21742cd14dc46bffa111ce10b78ae0
+1abaeba7f36cdf79a4733245c63f6d36234d6b0961f1ac295d6177931b9ed554
+bb5fc6741a63c493daabf03d753c7d2b8e8c01e3e280898f810da5985212c8c0
+bbdee4e8ab9b22bea83671c0460443ede9be044168f8ab50be5874d46660f1f8
+241cb261280a68ae2cd60e1648cff45c0ba9b15cb42f86217172a5b855265c21
+4d4b954937d11b94b7b98738393ce09ce40802e512bea7714fe6f163d1b27c8e
+c87419fa91767418abc44c94a3a22f97f856b0a4729be6973455a7f7ae72c671
+542e9e74258c2b8b2ad440a1b69bc7de2e54ed6a96d0bfde08b35f6fbf739ae1
+8676c03800ff3e63c6fc20927b3158e8d2cb6644eaf7831c6bf0e9b39aa14145
+e721dc46e792da9be78696808fadf24136f9da0c8003cb34ecb8af2b7de9e033
+545fbca53d881eaea40c638396c8d3b08b6e2b8f7d6188d055d6924bafb0cf7e
+f8bf2719495988b0efe373dd1aea97b0f486d0555e3a62cc1b36024ec3ada21b
+fe1629acf431928facb4ead9c41e3d4cb50ed2f651d2cb6ca8d0b1ef49d9e214
+e06cb029bc1a40b2052938f6bcd05f013d9ed1edc90bdea459c4483ed0d1470e
+30ee0a77ecfb585268a94a8bc6be7d28e5746525107c0a3f05fb5e34e0a21572
+14be2d95a46fdec2e36afd180688fc710c92b27d69b2ff8b1fc7f73cd5526270
+e5bb585d7674a351d9bda5dcbc17b40d465923103f1d02e7446d949002657763
+c82c8fe0372afe94104d148679b4e5be01def615b295d7c25e24660b2a10dfb0
+b5b96fc02bdfdadc10afddd821fff6caf17f11d6a7cf157d3d7f1aa25a00cea4
+1207c8e160663d23b16d2934ffe6a6c178d456facef20fd46c4b33f6d1ebf103
+b7cde86d7aff74174d2d3f5820186c696b9245f97554b7f62411429f1dabebf1
+ce4abebcdd2a4ccc1c06d6ff8dd9d7f935ba5218765a81eb3c727a40dae317df
+89cb3234b1a4f1a0b16f88ed1684d3106c2a6cc18aedd3b052df1a2ea7ccb8c6
+c6111abed60277aaa2b91f1da4a83c0b2d4fae8cfbe2873b7f9ec2e9ad05045a
+bd1133b95f70185dea97f1081565ac65139ff102004b00e1e77023782a68a752
+088f8d8cd2393eb3f649553f0be59b83687f4425290ff1e334794e59ab4dc73b
+26f1beac4c5d6d4d507dd7d13b8721144d28b82eba624965e3d8cf9334083a6a
+461277026b05583f96e489be17dcfaad73cc5b9c6021527879f2c194a5bb1869
+9cbef3ea4e14950e1aa56abbd38bf509629e8a4f0edf0946a47aea100a088151
+a9e296d1b5d7688aa0b3b121fb93bd52789d22fc32d645230419d1df1d106a9a
+90948fd443eb64a212b3595a133a4a30434b5074ff14f69368de4e0452515257
+aad6332ed29556152c71240df8a6746486d28c6a1315bc5c5ed08a5192c2fd7b
+a4ddcd7496139ae2e6e47ac4971edc88a81e2056ff81081b72cec34df2e6bf17
+20bc5c6753ae32e31ce0db86b3aba65f26335a57f2f12827f7495183427d3e86
+1b6ba27f7157003a92a9405c8755f71dca78e6cf0730fe59504cbe903beec227
+65da1f35eabc756bf32e9980eed40c0d1a201e12a71b63171df7ca971e36c03e
+8137e0213fe675b392ad8b3232752dd3864c82f9ff85f814becb6fc7510a1e99
+17bcf12a90c4ee29e036db54278f2413731df21833d1f8149344b46e4c3fc2fa
+9647e76b3cfd81b4fe88643e427e7f6d9b01f99659e531df0c43b4f44ed236f1
+17bb00830dc10a5b1896cbee06fde9b4fd9b0b138405a0bb83d78ca5546a2b41
+490f5322405f0ea6276d9a13a63b98c59cc9a0428472759009cda518c4dfce24
+49e27df9caac365a6ee3a8ac451167c806889760c404164f941d035b6a1df55c
+44ebdda9484f4da9b07c059ae59617c0e86ffa71b9a70322acb3b60071128799
+46f950e04e6b634439b06e05a9781a9ca6b9cbfaf508a835e2daaec957d95fa0
+031f9ae42c17cfd5adfb81766af25ac5237818909e284ae4a439b8b2a5050dde
+be0dbde491d135155e98ab579904d045797ea516dbaa4529675a381372fd437e
+53f9372dae38f0eeece282771fe7c3d1e68061cc242e4640131ebfcf340b453e
+4868ce4825067dfcc88c7d84aee3f06eb202a89979aa520e501288e93f742fc8
+6b6f43e3bba4430be40b099cb0535504f966cf50fd9ba9fd358fa184a39eccfd
+4d8e5c4ec35b448bad9cf5bdf15b729a4137a9618a5a44db7d9740a15e0da9c8
+02b428d40ed5401ed76095c73512cb626630608c74143afaa7be85562aac8d81
+48a5e603e3b69b89706b0c1cf5c85bdeb32611221c13325835238fee492e4a08
+bce9741094c4cdc3edd691e82d224c7866590510e2c7cccc07e11484f62d7930
+3fd559e4e511eb67bab756f30acecc560f5def3902bfb52abfb7aa48e72f2732
+b7eb73c0123f6dfe97cb69897c1db3d57ff05466c3cce4730e04e921a5e56e8a
+dd31933536393bc00b3ab3435ab950965a752b913bfdff22a8e7df7bc441e5bb
+3a3192bea8a17829faa529e56ac69e5a25a6797615d5455e4b430627f9c219a3
+64bf0c55669cb872e403ed1cdffc63cf9223ab581bb9d7967892dfef80da723f
+18e199e0b57f12ef0210326aae328882d982392dfcd40e029ad3f53dcd820b4a
+61b580bc3f1b492453f5c752e05c705bf8bc05485c5499f804a6ed2a28bb63bc
+7e80759003cc7ef0a1d9d51dab1f785d14eb86bd9a4f4221951da58fe7263e23
+e58a2414dcedb6ce1943f62a65699080bf568cc0c67134d8728963466de67133
+27129138d203ab8db0079f63349ac8ea689ac7615d866b7f600b2e91333b61d7
+3c98401b1cb0432e90fa7bd87d9f4fdfecbc2dd5e5eee5daa7d7bd959e41817e
+17525a472ac035c391b918d549c38bf2b2426798fc27af235a725ddff5dc79af
+b59198c94528a36b8c7cd5683f8af50107b45e02fda4c787b4f14ea4e663bbd6
+15be5b30d6979456f6191b5051f458bf19c91ac99a9a8505a03abedc243ba287
+2c3305b81288a79f5ed8452e2a2caf3fa51208946c72b97e6d59ef74bd8b96ce
+d9de45d7cf76a6891c7c0691298855a366737da9be57d98c25c7415122c898a1
+564a052036a3aa550c2bc83478c4e15933de6e4aad64b2e97c640a2e8a14933a
+baf85907f09588cb05432f716f05efe4a669d16c881dadc0faf5a704dc91f500
+6e512a61372579eeea5f6076cb8048d71a1e4a3097bc27433bc3613ebd8291e4
+27bd9cf83c0969562d5363662f74f2ecd57071c4d331a26559bf3e307d0e2d1c
+9a90a3fc92254d2656555dbc0c8c3502985a00e705213e4522d5eecccc5f94af
+0f196501250a4200b04b491f64388f7c3aa37970a8a5bf78a072bcbac61cdbf0
+f95dbd13b8defacae1a53277fea4f19f829fced3b4cc6e209bc2616b9bd7312c
+87d78cda5c9f6bca02595086adb6dac9b7bc6c9fca577169940fb58c818a3757
+5de491222128989965657ea8b5dbd96a697ef71778109a1781bd7ddb9b2132da
+71b3bac95f6f69fc615b7733d709402bc7fa0812d18aa22fab627f91baf4a346
+d8f103362c0161a3b57d83856c63cc7150fa2ec1ba537a4c608bc28c85d388bc
+f4105158f0c9d40a573bab28148104e2db167ff009d34134008cd1ab4cea4091
+c04dd6eb2353686278cb190506778602b0a642d3997caa982a2b3c84f8bc97e8
+3a177fbe6c69512014cbf7ab75d5a35a0521a2d1204d7877f75a8b0816da0bc0
+58c0ccf411b939931bcbbcd1d3d92b0fee9e58012677b1db645c14ae63b7c4c3
+e4b18b890802aaa72c0d8cb771ee4e46ddb6d714894aed7816d7164799b70d7b
+64e0a50b979c3616590b871cbae60b9449d02fab57655abd48843da96359d608
+7ce297a26e192491d1cb8420d7cbf1dc66b68ab4299ed1c500ebb26de35f9563
+48d497c3c0858e812fd3d43cd76a41e24f19752bbc8a4a69510c9381cdb8a230
+31f8c0a914db40a659a5b51e19fc9024471cce4e65cbab05a3562a2929398879
+67cbe49331cb58e936a2b6873d3dedfbb378414914a2b78db4daa180a4b40a97
+2fec68f931b75f2109fcf824cc7439ea693c8c080abed27376461dd5f86617d1
+a931cf1caf206e872adf0d8b6e35499fe3df6d3833dca2daee3805fd76f7cc5e
+f2ac6f05134e8da55b15204896002803ad497e67c2ea83b2646bc13a72f73d64
+2ebe4b1d5b00a444744160f3341a84335643e58ee6c64acdfcec21bf506a6a30
+b70b1fce06b97b23c767e7e429892085fbff2996aa68e4776b76de0f66edfd89
+b015cc3a3e4d70cdf3bcad9d48b4e17b97f568b0f3b1557d003cd6f087aab912
+a15e88e51f6e33c8c8b2ab69fa8e81f09a75e0059723f1de598a20c567e681b6
+0e954bd6d80c7515870bd6158eb93e8af8ae71542d681895e2b32489694f090e
+bc5b560515048626f803b996baa342815b5adfc437dace01d549a6319eff5709
+6c537c9aea7c3f8dd978d42624304a68ef2427dbc0acd85a26960f10e348a30c
+dc46e46dc16700f62108fe6c35059759fe69c729edd6c91e83cd49535e16746b
+6dff037927de39b77eeb86fadd9ac5c89268c3c529fa1747650cf9e16c7626ae
+c25817ea46c1ab2b0a7a9c7ba33087db199adf7594c297a938ddd7ad595c6942
+552ae76711f444b5b833a92cdfea0462b6766685359cd4c2afe4114d884b230f
+dc86d680a9b10a4333d68db6ebc595f86806392857b55452e44288a42f924754
+c22778c6d7bfc3d4337bb3a8f68055d0d6f5053700b784c480509caf63336c68
+7c5bd339757008be54c289a10e62d5c83eee133f32168a68aa259e8247d6afcb
+25243df6ca8c238ea64082265560188e73a47db7603a1802e7ed3693a9b7e5ed
+7b0332171196792cd5272b640c8a5363978a87f58b9d1022d5e7af38d1e45dba
+bd89b095eb9e581ce8e9c314a8152465a4663fd4a7ad1996c08afe96d3975d67
+fde3aef4fdbad38c739d0f1bb4584f919b4b5b8a06aa94bc3a4162aaaf01cf60
+7fd24e90dd4889795aa0fd42e4cce9b0c4323963e288dab83c1d1187c1251d77
+da1c6602311cf8a73e16699d6646bf62cf68b3da3855648508edb97cf3614ed1
+141d158ce8f86e055e9034fcc9c77fe4f592251dca7e61952859567c6ff4fa83
+15b554ff50b48bec4d99ad1221b7caa1d47a8f430a07d49f561296a74277adb9
+c21c8b4ca1d3bf3b671506f71d8f88d37ec1b03432c2bcaa337659c35747b0eb
+1721073e4e60e93646c719bc4e27c5b5fed52f456f43158ad6ba09e9db6d0c17
+fa75bd7a80746258f7725116c37770e261c9bcf7f578f3f12ec7037c125fd86e
+4d38ef23886e18f4e206397006c8c4ba0105e10fcc254a718e3c8ba6dd71218c
+4768fe0d8efe2e01454dd52ef33080a1313911ce3e0afa57f5b74d7caef2440f
+f148f3c8bbe0cb2418a0367dddb217ffb47fd5766ab6db331bd9d2779ceac6e8
+e3e6562b79d947e687ce271f8f024c5cfe61e3453cc7ca45efc6b682d2da8ace
+dda708fc65b668e285e6f542b9fdc071082076c4ec2312de40214f8616ac615a
+2669bd490e89d5c125d6c0d6378113f4d37f1d6a06c225c7b0e879746f13607c
+0a4b98b7d77ca29572495f4edd58f292ca28417808c8e60c3dd8b1a9d185cc80
+5784e9a1ec1f290197637cb2f1ef65d1b114bc0e99a9d3070be7199f3d30db85
+cb3b65eb8cdd60b44567730017f4f851d4b15a15bf4312f79c05d5ea03b1da80
+1149fef5ad43eded70f470e62281fda1df9ef72f180630b3b1509eb5fd9c73e7
+f02fe23f554e5b74007d6384f6255ea4bdd2a6eba0310eda07327884d26c59d5
+3d38f02b11815e8adde0804c621d6cbda143ff30856063abcd0059183828625b
+c486f27c475059855c9dcdb5831ce58532e3e6984b63b690a27373d7d5e613be
+666ed52d9f743fd3c373984fbfb8ac8040dcc222ddff4a2e1f6d93f64aabad9a
+286e3e07679adc853885c8658e37b0efdb68fe51c09ec2b6b69735b84d2aa481
+793f0e5982e006d985c0c2b8d394b7093a210168e58688ab1c07b99b857e9052
+3f90ea3f4f4202f7751dc55dd7cc187f4afacced589cce0189545f2a26c9d283
+b14ab2aae2e5393d416e014ad99e27f8814c0b1bccd6f798865e243bdc9408df
+f7e6fca3b515e5edd3af9ac11e4bf0a7b7a736959a4f48d4e519d069263b0af1
+43dbf431cedf2ab7d4df2cacb62627ea46e77e20233ede4166f291a3a19f6227
+1ea68be133a61b6342782ab58310c4e2b08782800f48d311a7c15d1a6d3f7c6b
+5bf2d91cf23b931793adab17d9f085a9aecb9d4df2c4c50c5329503c4a8ad83f
+df446b306c56a2ca97bd50f359280415f8cd4bf01817da0f01a0e48bfa4c7a1e
+85f052a03369b0ad7eb0122585bd4445dd53912b2d1ee8cbd9b7e2716166790c
+32f4e068134102aeedc6ade4d5db39ac29f424b0d5e327d081990adcfad18f6a
+b64c7f199cddebf0490b10847d158b2151a8e79b707af40ba4a38c8c02fc49dc
+ffa7e2813ad7741ab7bb29c93e146d81be2a2494791582618f49aa9f904f8faa
+1ec63adb809cd473ea6743509617fdbf260d4024b4101d962f66f361d7257804
+e354e050004155cf050ffc6adfc28c4f742a3231c5fa37c7c826985c5099698e
+da86f0a2baefff000a4e74597e5bda20f8c36f22ddd94ff45e16ac91fd250eb9
+d8d0971bc4bfda5b6c0c14d850822031fcc8f231023a579c09493ff2ac9f72e8
+1b4c0eaa64fc3401b7e128b2642aa708ef990878091956a777d908fa0c4e1f2d
+a3363e098a28b6f141ef68258e2f6ae3ac089b3b89de4379a0da96cfaa81a7fd
+fae2fe9dbdaa3b21435793e464baaa346a722c385e71398949d32b76c6cdef0b
+05c752130d43ebc45a1738f06281097150423f885470928cc1153cb01b2295df
+e17cb19d3b4d576209425a806b98d83e80158b67120d6ea0a65d94582e248d3d
+d8ad826bbbc00b9b9dd0f4d606a65b1a0ba8eea83cff745e222e6f4645055a9c
+bdf1d99160e0e4854d989f07cc3f393f72af97c3575d6f1d8d4312848bc72bef
+988cc436c23f4c6a2a5569a79d04a0667611a3b0f2e2b8ca0a6ce0536b0e459e
+21dd3d74d8a94be16cdb3d65a6534be608688944c0d68c62e39899104ad6e587
+ec0f3fc097ce54d3e25c9f081dec3be6c71b714b9f92c15517dfd763b9bf0496
+d601fe4690a9a815e803221e007a7ca74743f679daf6a626af5a6525b394731f
+ebbe7cadb5de910c2163e640acb041736fe4e508dcb5c7d87d38e12ff80fc903
+c26c480b567f057b193f5d4ba352697b9481d780d94b815a7d96ba6dcc34e39f
+43caf780d101bd73488a88d213063432f8e6bea7e7248d85ab48b576ee702af9
+364c81f7d5c74ddad8315ed4345444e0cd92ea23b4394073178807892d2925a6
+a43a75c68881385a78d9d5582d3f3f8bae87ae177ea46dcba9af17217906204f
+751a358cd8a4d8c95ca76651271963b6d2ffdf282b653c85ede30f9c8bb5f113
+528e221aa1a6507364f74ecae922bc09e6c3f42166b2118a819638a85560c6e1
+eb7bf2893357a81571201a2bc31a91ab89489fa2050d353039a7085aacb83609
+825ae7392a84b6325bbf17af46a9a3eb63ad14bb387987f6d756ffc59a2a0893
+7538a0efa89ca08f9785952d2e8bbba0e6023ebb8fceb5abcc3c0c3c1b980255
+861d991fbf27e70686fa238e92ca9bffbad61bfd48c5b8e8aa8fde96fd9acb2d
+946b69a51137c905955ceafeafea0acb8a0c561808ec2e0d4fbacdb7ef9f9abf
+afee72f759e8208559c232ffe5bf6cd3e7cbe88ea579e795455f7c25f4343455
+06d98be333bffa7f7cf1f83bc00e38d2503ceb483519e3b1e5cb7751c00bd2a1
+3c385e2f88ee5df92086b57fadc621a1a539ff102d4fc4c075ab1d800eb1efc6
+fabdc04f81065f0ef3aa5b947d904410962f6533c1aa49b86178ad45e35d44b8
+66c938876f2bdf1dfb28d793bb5d049df0cc3e21b8ae8f9b75ac06f00759d48b
+f39c61125641612bc6032f5b6046d85ae9c7102b99b93f7674e80f96a1d74c13
+68d2fdfca6e8535a9d80fbaae20d681e1918b4af227270f40ee97fbaad4a4216
+908272cd9767fce64130744d0ac38825384bd51bfe19a150b55dd390020ae359
+29d4026d4d8798cf2fcabc5ffeb88f20129ff22baa1bf3fc412b404234554507
+5fc332a91a87c3ccaaba8c201ac784fab723c1371991d5a4c5d865727dc7170d
+876a83dd01b10c294e651e39a2d3a7c7de70817b0508f612856ddff87bf404f4
+c750437a96608c130bbdb8dc14051061957ec0976ac3b58e117b85cc17f7be4d
+d59a34a81ecfea08529704d8cb73176ea03c1d873f0a7acb41d533c8d68dbb3d
+9b879448ed2e52a98957c41682fc30a002015af634229c4d5d6b900586a0a0b0
+6b1fedaf188610cc3bfd97eb4261460ce68154b3a5a19a218bbf3035fbc64778
+89c2be397cad1e44c4fbbf3260bf85eaea01ca97d02b4c366a44fd08be6f197d
+f8243ca699c2b75b54756ab361115fcc5828dec91dff364db969960569e59a1c
+3fd2b76b4f88fd9309f8c9962d02ac778dca69f07609b0b9961ffac6d942943c
+bc2e3682879841df4f1d05350302cefc029100f934704dcec7e3f15387153325
+8ad2b5b5ad89d153f53be6390ca66461b84fb405b4722d3e3a205ce3bf339018
+b339f240c4956edd92e16ed988b46813e5e39533804efbc6e426304523b82073
+d9f296b3f8283f12dbb66157440222a888acde1eef4dc861f9e8d0e20c5876f7
+4e99c1dbb0b5fe81eae326545e84285864f90353f9c1c21c166deafc24ffcbe1
+a19522ac8cbabf3bb73c36bda0238a19da380a6ba263cb28f99d3643ca4f4b21
+ebdb9e19f1d53947c8f43a22320f8eb83f152580d83dd6cf230e30b74d2f0bf2
+6d6b621865797b989714ddc45136974dccdc37baa1a52d021544aab74521e9e2
+ef0607d951b1e4cbe230a9a1095df65774af0c2a0c0f1770dad9e054dc06c81d
+30801a927e525afce8cb8d753bfb1fc2b5d967b9e25c7cfa39bf6fb86dd482da
+0d871d5c8725cac7b44dcd5c3059f39a4cb216177100c0f99572ddadf8d7d537
+33db55286717ce9ee2a12357b901b675c566909a0b4c71bcbc7bbb7d36aa72a7
+018895b617ed93853602a5fd52daa01da6d6e3b713b7fd9d6f75e05f21857211
+d6ed29349ff0e628c26df07d1c079e556ffc60585ec8e91f38c9b4ef0a708559
+b4cc4155ff42c48c18731bd231b2dcb32399943e3fd64fb66d3011cc85e9fa20
+e28c741303d5b1f3b7178753cf97364716e6bea337a89ee47eaf9b93f938d9d1
+0d82d4c0e3927af3c34927fdd5fab439d303d997637e2d21725bca942bad146e
+4df93b37e5a38e4da57cb1d6e6e278b17a82644c800e6104eb2518c03ea9b8e3
+f9b7611066ef9afc58b893e3fadc53835440a47d93c7052ca4b617c1d958c693
+ceb60f9a2814cfc1b4a24b32783b389678bdd14fc3ea2124f124afc5ed977097
+af7a1d3a4d825c55f0842b2ac566e43458495b6f51c011d7e78818f6d934203a
+74a961618625a380923926544b7c13c14b2180f3576cdcd4f2140bc90b2ec84f
+1aca97f147781866d711448c1dc8df1fcc1a1769ece2ed5cea053795c0cbfb72
+04dc61065c87be00d9c0527d5df881708fdbfb7fbe01a933775548eefb736d01
+4a560cdb4313678581a3b1aa73d546869301f309f189c2df29f3d4bebb3b5a72
+046354c2edd273c9794c3659bc72fe7fb7442e75b04fc197a49efc2ea39ae0b5
+d1dce9bb509b5085445a66b6a59979c26412f1d6f5ebae84175ff08a90c9be44
+06797389c439693e2fd2f2c26d2e9dea41c505c32477ca50fc01dcd53d388e27
+cdfd4d73c2ac2fa03b9eb934479f0419ef50036b682c9ad8bfdaa3adf80a03de
+9f29b7021cf0441deec0f002fab57da0f5be89f5da4597a2523a2e7886589002
+e5cbbde0356b391148b5502eaa3b3689871a1cebe9b8214992f5349ede7d799a
+57b85d1e2ae706f8567efcf24081165f53810a2dc9568a263f69c40eb55cf317
+82da10dd970dc79f6593f1cdd9ce552de6c7c9fd3ab21169a2e487d5fa959d65
+9afddd071a0d756b5c7debd602cf9ad3e6b3dc3f29d954cad22ff28cf333ac67
+b8793f01c6f13c4ae2b6732d60633b59c2d9296ec77b6ee630906adf73ef8603
+3317cf59b6ffcf42fd7a68133f0673a5c91b8e0ec7b88872e9ac8d0aa904af60
+00799d57e1dccb74496e345dfea868ad7498f3ec7b85558a1fefb6f03c7d5365
+cef02b044b220c162c530b8cc899887f8846084c7b4fa1dcc631ba3a3773fa22
+443097b47852b119b42df9d58ef3d55ca10f38b04f378562b3bf03140e25544a
+77e66cb9589e6f9dc0a11b6c2a35fac32ce9bac552dc54270bfc025baf639b8a
+a5e3dfda4908b869969bd633a9b171ed6a04a2ee6e3744d7a348cdf09dacda62
+5269181d8d0fb84b468d2eea50fdf69324bf64ab1db3ad0fb2fb9583937f0be8
+b41f14a751d7115adf2d329db753cd14534cc282f2b4a4bf497a4c7b69cd25a1
+fb33c5e91796b885176284c77a119b50b077001b566328fd23170e4ae611e342
+6fc26443587e3982cea97c79fd63a4dfa95efee48dd81f90d67e40f283c27947
+d0f0823d2d2d26210e5243d2029b2ff059336b57b9b1334b0b615bf357c6a732
+c8d5165f2c9a6f310e48a2e4d7dc965887b45c14c9b744bd98de8f33071f0dea
+693ad64a55d03b2891660d09775030eb5c0e6e868ab1b90028c373d3448851e2
+25dc9eb442aebb5912ab0f3b1107a7d96f9d23983d8a6cfedd589e59fd355ea0
+aec2a448fd9d254d39331cd80dbfd653fffdb2702cb848144c33c28d207adc51
+097c28f754521e715be8b7b14c4f86aff04fddb0bd52247d814192a884e5af3a
+8f675cdf0c9dcdee0668773c3a3673af8f51a71bdfea19d0bde8a2a23453164e
+dbf01c932db93128b686cc6fd9a1dbd506b6c52664c5aaa01901c5ac0a8275e0
+ff4ec66ae3326dbc1b3b60c4488b6af86fbf30ddc1e3e3a8d63d7682c222e746
+05c95af3327e694f3b3c1600083f9cc241f97c5013c9a0588c715eb4dd00944e
+824e43a7a1c1fd144d1098628139034731eb1cbf633184cb857a17855f277bbc
+18751799ae28f48130cbc1ed559ab1a5abfa2576d59fa35772557a6fb3d15b4a
+de8bd38b763be0f8d8166613cc37dbcec1d65aa06c7b9f171028fddf8b55093a
+2fa509ce882054682fcfe32d510012ef5ddcf39f0ae5ade25af279829f8d47b6
+5b89a40a71ab70c2cd961aefb7004d3910c190bf32137e4d9733b971db4616ba
+789c741efc39c26540d3228884b4bb490bea1ab957682d250cf95e1d41c11662
+3925e7778755c11c654d42dfff1db2a49c5b57c3df98d942373519cb02f36759
+8997028e11c513a99b4abf115c61e2daedebb709068ce06692303cd0be482289
+18a12dc126af0e4f81766acf9a84526add4d2fa145cb5452c09547de307b352e
+141233cd8aea9f965070a2e6321a795f896c0cebc01ce3a15a81f14c14d74aac
+a4ab090125fecc310410da79bab5dbe07e9eeb2189788f491c457a82abf7f79f
+427932c8ad38466431e28659056c3d5a4be02c8d0d054bcd4f9170aa7b7b0d2e
+9a4564af66eb7372fe981bf441b68cf8247d11fcf0bfeb6453f9d2210dc880b9
+b9af2bca1dad558c1be18eab687f453d4aac976fb9466a6602ffca1dc852a56c
+50556d777258a7bc26489789fb4fbe2f70034eef6174244ebdcf514c5ff72391
+d097750ac8a9fcfe6c94af17b3a5f2667ca2a02e7f32424ad5a7d902751f7c41
+c9a7fa5fae2d8d7396f8e586be8ba8f960ff3fbcbe783e5ece80def85cdf792e
+33459d996a28775979b335a8448523c0a187dd8f3c0831231231f2a158a7b764
+2593932c9e0dce8892ae708b9458993d580656e1614f2d076f256a680ccd3d37
+0e37cde46dbaf38f096b032170759ec0619cfa0389b17568017f8d2811727965
+c75eacb1bf1b179b69567b0ed8bdce2ce95e98ec7a9a573a79ccd5b4990e46d5
+17324a06ba418b34110feeabfb71c1e43cfc1650179fc1e5f65fef017498b83a
+1eb5fb5e340a1b19ef7f10fd0422f6e7f640db9a46762fbbaf33e2eed637ee9d
+93cad018e33c4fc821212bb0f38f2251827a46f38c38c128dfa891f0b8ed1405
+4c651b735837a0f862967c3d39912e288dc3939816e015e8be9ba798f68c5e89
+a4184aa18392352bdb53119115b1a100e0941b80fb8017dd198c7d0629e72f27
+da2d8ebb59de72ee46daa03e57b12513988f2023484d9f0480126a378ac134a7
+5c2bfdc4df5b8d8fa77ba3fe2da9a01ec9427a00487b3a81b50a118c528b77c2
+2b57265e5f915a063fa3e8bac0ff7cbea9ddb19ab8390775df6049cb85921457
+cfae8a868bc6584a60223fa19a363f98876ea3d1e8a69337a58ffd75c9b296ea
+5485e343c04c72a53945e21fb479495d4686302f39188c01b036253ba0a18fc8
+7aae335fa522a435094c3608cf6e2e37fdf5fa3f59048fdbdbe6c58dabafe941
+a7af5aa4ee7b44d64df374780e9e2d691b4639e2aaef8c52de72b51f2bb6506e
+5e98f8ae236d183c9cf250dee46d102d964aefb7b82ef32d19a03aa88ef2ab97
+5f04a6cb5208f570af43f73d804843404eb835e5efe3e34887a37816ed3cb02b
+13e91be5bda75a112d1d27e92e462ec516100ab117b2882993af81dfbb58ebb2
+f5bc5d5eb98e48f73e88144889677b31d3c660839854a5c611a52bb493b64455
+3e6948d71f94f04eea57f7d458d7d78bb278d83065bdd9097f252d39a9ecfb40
+8f2229ad5edaf4afd518c804214dd2458b085d7bd382c7a1e697b5e0c1a47c25
+e2cf084d63bf186635783b56e6b36e7da64e3f9e3e7135d74381d957c0c62a6d
+2c4dda1c21a8e49979dc4946c3bb84680e4386750d4b19c4011759d84f90cf31
+b268f0af056d8566e84939388ff4cda569118ed71a2cd82d28b44e17c8438979
+5a4357f70f976891292e15448c74ce895be53e4212079fba23793f3c247827b4
+4f0e39066964e756719c628e6bf4a5f080de8402d5d1c154785564e019f13ca5
+b45b525b325e29f193557770f88ef82f8d7704631969d4ad624206665ee1d38d
+7ef7a7979aa05d39528beb6b7764d88da381eb63f0cca2f797dcac11011445da
+21da35e051c1db3da576e698451a0675944f5749e465faadfa4bfb09eba5177c
+e8cecbe67fa06b74d75278d7f28c236a596a17fea5467785f345197a43ec5f2e
+1b7e7e2151f287ad9181ac39c9771a1713f45b5ddbb402bf674e3eef369647bb
+c37b3afb327576831021a1a38fc4840cc4716da8026d16fae600d543a3c4dc4d
+7cd5baf19f1db2a24a0757ef6c3bd8047288c1436eda2bd3f9289e6f8b003dea
+d7b0cf49f3aa8a56adcc26ae300976e1c84bfa04d9a1887682d19ef68f52b76f
+dd0e03f64cc92dbb3ebeafbcc56f8a2a99af870bf7f0153dde4202ca45c530a0
+562dfae59234f4e3287b93bf427fcaa8d236606aa43aff3862063c0bd73dde6b
+dd3ab4a8c4d6ad9c24da288dacffd02aca90dfdc72444c9bcbd331755876f649
+e4b665d69921097c364eb8b0562090e10f4d719b2b5afc9312ed39c77e91ece7
+61c6c940133f940a74e5ce3c05d9703556d28a5839727c54800ad0e496885aa4
+052f65813ae552e8dce8d6f73949d0fcf5059e85ca8a1c137d751c6b8a87a52b
+198254d01258074227501dbe50de2b82bd2510e5788c46ac997c65bf44dd6928
+ca9f7a902bb957e277e7380123cdd93cf75dd6c7e5a56f93f114b6e46e0407d3
+ed544d781ef6fbfc704a035b7b737eb332457977f223d87ba6e3dbe827b4fae9
+e687f6975731d42a8977cfa67f94e90df98ca790e89713dcbc07cf27ea8c4584
+cc933fc342e5c5e740ee920ac3403d4deee426d35e1062a2cc7d5e23f568b494
+95c8b4556a8bbb0480ade618566f537b440ce52ff7d2cd89fc806fc388e9d7fc
+8bf15882a38ae0e11915ab03c272c8a312094938b9b4282ef3a321e3bd82701a
+50f8a4380fb32533cf4a100b0f96475a0f12fe9ce7e6a41784fe7c83f05869d4
+2b70febe4f60bf749429bfc4721acc4e17a961bd7da411471edb7a32f4479f2f
+079239c9bedcceaf35119982d686545cbb1eb0e9f429e9dbac1b743d28d12c6f
+faf8f98a3bbd60518803d997a56bb515602dd3a75f7ace8adf16a6ee79233fee
+1d21bf40914f29521638aef27eb796b06b5fe274444e0833ab9a79bddcb33443
+5b815d0af72964e8cc297d246c6bd6d78e0e8394d8359084963b01416db54a3e
+3a6d9784320814c4fa99aab6c4934b76a26c5e014d3fd202935f2f9399dda83b
+4d652ab89936578ac2c70daec483f69422b25472458417b87f2861ff90aa37e4
+5c07ac19fe09a4c2d37c917941f01682e650fce1785d114abd5949ae733bdaaa
+d98a802437f465bb7d2d1e0d4118d6ddc9aee8e08e606d9703c319001725da09
+5dc1e3a421f0c5315e28765e9571982039d5313efe20de55e7b614184c4a1e4e
+af4a89c62331c6f2511d706c2c4248c626e6474c450db1838f1d8b264e406d6f
+85dc63e78936a3f7d84baaf49bbd3ba15c58fc4734fdeb13d1f1557f29ee53fd
+bcca5d008c60f868ab756608ce889de583309a303cebdeed91e7c4922526f125
+58d2e751ec11b3c0bea88065ab0241f9d1e4c6144150f92f917b629295da2e84
+33a66b4a6e6c8571b684a675af7e77cfa6723f82dc6ac13a8a568ed06a519ea0
+a2725cdc99096ac0ce941b93207ed3f5991241f709ef7f9e8b2acb77100cf293
+452a1917d32c2f2a798af506a827be2d3f3ce87e3d920a0d8cf8e98a4bd3bd99
+e12f4374e0f6ad25af32793c5f85b77e213c7805156d53eba08d9a84ba43abbb
+a8202d43091436113d930a138dfdd15774397f496aea9172ff0302555658d3b4
+f6926fc115bf3de066f2d3bdac9738ecb824713de70361c91374fbac965ed71e
+e2aaf3a27a9cc5564dd26a4bf30dad76ec5f955915b1363ddc6bfb706b559fbe
+e46f6b6338dd6a07ccdb23b33b0237c8f0a428fcbf6db62fe6906e4a593b4dfa
+ff151b2cd167951a70f535394d84b7ad727bca8403cfd661abf9a72ca0634822
+f0ebf66ed148fd7b29513eb151c8d76ea7b74902d76ef7a88d5c571873bd219a
+9f7e60b5d6b77bbc1afe19165f88bbcf45cffa773fa9379259c61a930395ce89
+109c5e3a14066dcf9dc8387209c84273ecac6a6cb033d54cbe4451036b0b5335
+bc4b3a2c6f6a4395fdecf9c1b88d3b8840e0a94b0516c5821cdb3b15aa06ef3f
+e3a2c4729e258156fb7ade7c1b8f673dc87a8c87d6229df03d88fdb8d7e122cb
+db3c8e9eed4ddd03ef86bf2b6fb140187441e7d3ad4bff4bb61e57dacbb792e9
+f4263770c169933f99eaa94f686169ac46803bf6324b8498c154ca78482224ad
+28253607ce99680a755c573b8cc5bd9840b2c8a2518cfeec51a396ec8e3b6c3f
+980a3896feedde1a0605ab8d7891736e2c9502b5e2b3de8d76da62afee99a77e
+1b079bf6f92363e8a5b6e605245952f9cb351206b65eddff62ab5730b81d8531
+1489f9b4f4eb4690844b47a8a2cc0881180d3b5bb8f6bd73afcef9300002c168
+0503cab52a1c6c10b038c312a0c5e59c60072d4405937a8776bffb1c07d0a876
+1bb4aab03dedb634ce0192bb51b07dfc815073beb441be59d2a5b29a64e559a0
+d0f33022188ca9e9ee43530036e15604ac28bb7349b1f6b57ffea79982da0f9f
+ef3b0447ce31ab3bbfc0c03b7a421a836b8bf793fccbe963059de30c4ec0ea18
+bd7f3d00ceadc9e611bf4c1376a64087008b5941734d404646b9f698dcae3c90
+6f2208158f670d807d7ac8509a38a95d16679d11cc23115fd80301e84f4b200e
+e160fe96e54346be77e24998e679a0e1c0579135afc37c68c5163028b2c026f5
+d22035539795135e468f192814b49c4967e4873799ae4fccd31cdf23f754ec82
+068c2448ee44a452a0b4bf877a7c420006ce3e9e032d830e2bcb814e447b0147
+3cf5933f6d82cb74e6d1d5d6211484ff1ab6add9a46397b42fe3c7b7cf6357cc
+abffeda61f6aeab2ef6a84ba261f837fc8bffdbfb3ca6901c2b4b29834e08d4d
+45a2dd4e8a51c229d30915ec1bcb1c5486a57eb7490c70c0dbfa01fd1c53c998
+32c7e26e50265f54b8197a0316d30a5646f6e4a71d475e03460d81e8b658327d
+b8a1b1437334d3a907947b2c899e4a53ffe9e8227b2d5420ad4109b2b136ad02
+92b5ccaa83556e85b2018e629113c3e0d4d484bff995a484643f661975737cb0
+eb80f2b1ab319b1ec6251c49ebe855e2d6ea533398f9b3148316210b46ed555e
+f68a949b73f31a4457f45588654bf21d554b39eb23850e3a10c2ae0e7369c685
+641f6d8f43936c9250768af2829cc655bc027fa640aa14b18a70aa3a75524911
+45e6a7df0d81e0b7e1f3587ff086712368c48351d661add7e96a25b33f9f1f77
+7cbd3ad42b6786c8b0ae23f5e61421a0b660b7381809f13664aea3067bad45ad
+8451c40e07f38f9b6185867caa2a9ddc8c37647c6b6a77d281185db7a56c39cd
+ab0ace10890f5c0d7807fc420a2d0948c3880dd22e0b6aada2580f9a635d12a3
+05a89415a24ee12b834a6d01e9f1a756b492f4aab442368cc18c700e1016014b
+12e2ca27f141ac3084ce37b42a4c41d41a3ae37aa2e40028aa8f3dd3f0b80df1
+24f33e60d97ee975dc98338c7d2290544d8da601fdef3da00db855237a174cd3
+dda0a9a404c749c849f5592390320053c4de8004c650117289b8f0c44cbef09e
+2fdae18a593f2c7ae524cee7e3560e3116bba293c02937b0e95fe22687ee328f
+eb89d6738ebd1604031d248ceb6a11f9ffa7b2625d3ad21050df6f25d1bb4f3d
+5d269bbaf8d56d25ac40905ba0adab22ccfc7733dcdf3680fa85a94f65445951
+e960e817427a9126a9c767f263f324dfd34841554bedd86841dfba7e43986958
+d688da35786f0497a6d04fcbb6eef0d1e8d9575af1fdbeece6cfe66c574e6158
+346774b185fb5c4e3bc71b45b5202f79210579b4bc35b21f60843b811df3515c
+c0d81d665e7eb018619a243e72c29636b8d9366166797292ac7023cccacc9401
+999bedc5920fe7f51458d13eb772d6500f471416f079bee7c9bfc25a0858b10d
+c043cc9a219ab9a71ad62d68ba22432e1dfa7d7930f873a9af0ceca0cc4a4667
+d1102a8a685adfdbc5a1b4cea2e9a94d1766ccc8f9e74213876f3d7bfbe09500
+06b11f656a37641f9cfbd0b23c19dcac6d9c2b5cf0e38d8a58ed42c7d37d88bb
+9a96ad2864fcbc6033bd464ca519c9e8b24e1033ae844ce27b866f2fe38b09d4
+a262867f4782f15a5a0e762f76e1dae8062ba108e759c6d8f00ec4da4b4bff0e
+3b22b22fdc733b708e0c8ed1acc316d8677e488adff3fd5d912fbee47a55e583
+d814d6a77044767539c2a1b964f5a2522b482186ec9f957684f090862afac470
+7e5b48722a97df0d272c713ba3b611aacdbaa0ed665ce873979c55cd6a9dac4f
+b8aeca0b0cb0f6fe85e7c97088ac6f4ed2bce9a0d16527d001507702138709bc
+abdb694a61da95692e67999aa628b73837f53ca6892788ac702cd6eb52f8c79b
+92c866213a6126049797a48454b53318cfdebcbe1c50fd139abe01c30feec51f
+0cb7e9d9a863250021dfe7c27786e88b6baedd48d949dc481684e3faf67ca81e
+e76cfbd63b547d7a43f3ec9ad09b1bc9e31462a43245f40ee9f0cbe070805a1a
+bf940f2ed8300be39fecb86120ec4b0e680d890903458cb93153fd2ed736b873
+07aec4beb473ec4935bfb0b8c01ad84dac20d13b997a884930e3c6abdaabb083
+f6f66c5b936ec4624fd1d1ca39011688ef21faff4f69b93f7fe73a7ae036c3d1
+5f6f5da6838536f3fe0f7543f3f9460b197a7892d6424ba822cdcb26e2b3dd7c
+a75ad2710b9ab49c6d5810f68d1a0426987f1e462034ddb4aea10e8e04be42ea
+10cd8552670f9251994dd8e844245e97a5902b65d08fd41013de3f3cf0cd6dfe
+c75852ec385747f789cb0d846d0d8f4f0c823fe8a6202101f2cdb1811cac9e71
+9f54bffb04d646ebf824a17db7d78137f4e962f3fe6a19fec02697503d1f5c1a
+467799d2c347e8f85395eb9bd63f4e6a52fa05d4a3e25700b4de22c41d97c719
+cd5a7576a3dc797c96bf68c5ce7922a8fc928d6aa344fb67d4115cafa38e82f7
+5f621c9153f7f2f9e5ab5817e000d5eba9a789eae7831e1a75a382c6181a130b
+0ae6aac0e5cec25c567f1c3eb72caeba74fcd4ab5da3b73412e76399a56533ca
+6044f2c2df96153ea47213cdc057e3cdfc8923b80543e5c5b226628dc0bece91
+e30fafeb8d4a860c90021c1a996d178c6c85e9be45f28edd3fba26d6ef2e486c
+477670a17494c453ff09074c083aa8b74de9493f207b555c56e72fdb8867ccac
+10f060675e0393d1e5c6b2f44f08458dfa45cd4bdddc3ce3aeb5c7afaa73086c
+c7399ec8874f529e4af63bcb4df147edda137e552ca22f45ff9fa03ac41f724b
+870d8656fd9bb93690eeb0e7df81e6957e602a0159ebf6692fadbc46c9ded8ec
+229d9bb5cb617518127e557671723dd8768b1ee594ec29c4a096ec4fe6192ec5
+038eea033d0894c70de3920d1deac65b4fb001ed0c851779ed7154ef5a848257
+c973c7f02aa72c1067dd09b13575a33d3137969d683ebd38e8b61cf62fd3f4e3
+ce98c266e088aef330d9acb450ebbf96bf63600e83f13152eb0353801d2fca3e
+18eef4f1fd438afe54026028dfd703cfce0bca12b0d2fdba236918d27517393d
+c2ebd744f78e3dec0ce74805418f1a93252abef1ad71acc1809460a8dc423800
+86a593b8167212ad7ee18288d203244dd3a2025b8449c47021ff7620fb89d3ed
+41f8547bd5328e7ac7cf5f0ebfc314bd4afa8323d0cba57e98058af91ff4002e
+db452461e95eb2bff94e464bed868dc3014915a910704c5740a1ffe4eb3caffe
+27c199f573a2b8310ef7dca5dd1baaee4eb5add21887d9b65246d93e36a72766
+e664b83245aea45114ca3c11b50d51d218eddd1fdade2aeabd385ce371734446
+745552c5322e029c892e227dcb3fd626cccdbb1731d4cd23057686833fc20906
+fb3640b2481fdadf09ee20e487556f5dafb429d648d74f57c8f6aa04f2ef121d
+f2fd850667df1668f97d721647207084840861f2627f31e8858bfe5851c35fdb
+b4a81e41645ceac4873fd2447ff94ebe8b83636578eaed2be03bd8f283fb6832
+c10a917d9ad056ac7ce149186b5664cc52cab3939ef44f35b43bf33cf06416fd
+ff848179580a7c39732e7eeffce44f7b24cfb288534f47163a273f2a5d9f30ae
+802af8ca1dd90bb7149e3c3a3082fa471257bff78019380b1ac8238b735666c2
+df052ea0b436789bee7ad5dd407e9c20774d5ff3e0af9187e24065dc9a119cb8
+842c5f37421d005f27d787a611a8f52ce76aa34ee0ac7236905c28d6d9841415
+387be7eca5c533ef618397c89f3df4cb86ea2e38ec497e380efd12743f6bc297
+629e86fd88cc269eaadd0dd63984e253caa270ac816df54077f7981cf1f1d5a7
+7aa46b7538794d9d414db7f7eda8831fd123f843b4b6a963648b2f3169693292
+6626e040cda63af93f25d4a6e304d3b05c171c7186f5ba239f9e2156a0e9d30f
+d016aafff969eecff0111120c07706f09505359f63199c3e19e8142bc84b7efc
+caa61b1f13828755bf18cab9eb638f17c3f20342f60c1e1850332c16c8d21c26
+40dbb93652c7cc6469486584f2e036160ed2334c5cbf3b343c9c20fb460fe049
+2ac14315bbe89139796ad76f219f2f78aa252aba529db54863fba815857b4369
+dbf510ecf4db2255912af8fb0a1d7c1a2d176fbfbbff0182b969c8b02780868d
+2267b49d78b449702c46d1267319d79a101cabf6afef50a912b2fcb8482539e4
+9e919f3b1270599e8ccd1becd4fc4b973bf1d412764dcc3013c707039fc5db85
+b8c4759f7fb9be1fd2fc5d972e117af55ef2586b4441a440f350840210186a5e
+d1e4019761f7b460cebf431c6d564322cc22362d93433f843166133fdcd079db
+0f03591ae83885345c227b918e762e71db2b5e86653898d20f80c18c7f811797
+cd7f4a0b3c6c5d3289c5fe808a7068f3d19e8c4ae145fb822d59d2344bd47dd5
+6fc4f2c7237119a44710846bae73c9d13db5f08114ae8fbf644831e81dec6206
+d933c007f15c0c0ca65091a451a3f4268529df3d047f8c04bfbd7d7bc02b76fd
+3aaf76991f6f0b2b4b6a4fb87dfb7281a260920f79aa6c0cd16bd15de94e8681
+fc684280948d6279ca994a078a261860c868d0a029c70f80903265db27ed9791
+2c5a80e648aa078a321e5cb431c0bb2a9d21e9929a4ff4b1f9dbe980bf7ae713
+f76ba86fd6dfc798d7488b115e7c30d1068322010037fc6c9bcc6182df29c66b
+2477dc0197f1ec7f48a7473b80a284d917378e89b79c9aef1e975fc3edc7c60b
+a3afdace73264dd561ad9478a3cbbf9858978620c79c09d660b1048d3ff8044d
+c2bf02d1282e396f5c6298c30f3116285c16d3262630330c4fea515f629d480b
+cbaaaeba211aabcb932c2c8c9cbb2d48092f69f11c221d9ca068c529213b4303
+e7db0af9ea0ecefa45fdcfa5478312aeee4e7ab6d393b8b578cc181bde18d138
+6eee5ecb8aa46d9c62eb8dac91fc3375f93917170a43c2fb48ec5bf00d15c5fc
+f1d55710b6801ba04b406ad183dff76e19ee9526e6c38d5c2b084e8f36b7a9b1
+68ff8d2027c20b0d79d120a0785a35f93ac1f2a7319c65e68a4abbfd0ee8a3e9
+b14b3c5f230482032323b501a82424aa3256af1f7b5de145b16848b9bdb70bcc
+c4f83c231aae58de03afd4b7d0c7cadadff17b2dbe285300606de214cef1c624
+1d2f2969f0b9741dc34d8dfdd30331d8fb2b12d3bffc004ad1e9bccaf126e96a
+5e340a89e8a91a9eb19ea03d4886f768ce063c702f25f5ccc8f473f3a4b85fad
+95d7a92d2e3318f635bbd79a8a4eee3f1208e9e69a7d63de373262d38eb8ac61
+21f3df1bba843a961b5d3e7f8735ff641ea99fefd347df900b678758080fe745
+538c9d5ad428839bb6840d084a49b2cc475319a99b33a178a4b4f24e56a9c251
+9e8c010f81de925cb895a446c87b63ecea312c8b230151adf735c6b7b158a1d6
+55e44e2f5c77c2b461b97e494dd098fdea07d1940427d2a3f2585abf264bc4ed
+efada3790a85e0889e90e45c38482909b802b8c4c678e1129af4382e479e49a9
+e406e7120b85955936ffd8a40f41e91238e4d11c7e660b902897e9746f9948ec
+29ed59c91597ab7d2137149edc67bc432e470a404bb9e6b1f98bcfdf1d49389f
+828e3f35c203a3aededd8d4d3e6617c959d5c401fae6756223f2ff5b52134cc2
+804d20bb08498b8d00b0660fd27b4511a9a099a8487b7622184d781b47453611
+484da293aaa6b7e8124785991f755bbf689c4cd86e573f40e4f9cce9ffb6c5a8
+4a419e32002acd3392e677cdc2883bddc975bf0550a41e7d5623d745f389fab0
+5918c7cdfc9f49327eb8c4a59fad6ba52b0f075fe0a2851fde85910cf5cc9590
+b7d7bea3a1a8a251e37f6a20205b946b01da9adba76d14506850b6e634ddfdb3
+c853739461d428ac3349438634bc2c4577fa2a337990eb7bec05a6d9b90cfe70
+856680d5e822480f77f580c3a1e82b87dc2c2c554235da6133e79ad708786a8f
+bfc34d813f4e4330afbd5e03f7ef0875a7a07aa201c7e71ab6a818afb9399ebf
+d88e1d438e5d4634172f2f7000c10112692c4e9f0273a8db1c559b2e8d66fe93
+521514d2896b7321372d441e1e7c63edc272b30b6735ae53ac1b08c352aced8e
+8e569d3d3dc4e7b79c9a58310d03ac8d2760522cce13bb95bddbb22a13b13cfb
+78bbbf43cbee6adfb333ea66621a5616442fb9eb4d5855eafb1573075650d05b
+9b36e80e8ee6e5a4115aa1234ef0898c52ba94d85072c4da759dc246ae56ea52
+6be02430ffa280c4052cf73d6eb4b62c3282d82929177263931d89f27b1e1dc8
+de5ecabd3e348ae919c983913e6ea48b21bc0827807fba233c132aaf170f20b3
+3ba72160f184a3df9b130e3bd09301e12d0b22dbf56ce6fc87ce156de4377498
+cad735a6f5e57840ebd7706ee44c6b44a9bc0120cd4f50720ba4b4f4002e11db
+98d7db9a31a5c300d81546ef990481b7f9c278f0853c05b0fe5ef2586b4441a4
+218a64a07ed2bd6c547de31987297af9e99f16ecc361ec2650cbfc0ca9b55cb8
+f5b11408d58fe29e46eb31a0537fe757800abd0f34398cef4e77362a140d3ef6
+b00e83e143656b00cd218db158d44f5df1c5976fe708f15e32642e629645f1dc
+1a3d22742637a809f2197ff9a60d1f58e74d0937f8d8cbf0b0de616809d91cfe
+77675bc90ebd5cd44fc09ca0625e8cd6144b620bea2183744d33c42e535b4879
+ee3fc032610eab99688a6e800815164ce529eab33e85cb2a84ca3cea8074039a
+5b0b9e2065fd72389d02c6608660adcdd7ddeb2c4feb5a32e3276025f5c3ff65
+bf4b01473897164745b05a4c1e1dbaeeb2506bd306e266e613b16b93ac0f869a
+ecf140786a639f9856d2f47dfd448564cd6067590cd7c75bbe8b58eef67d2ea3
+8c965e69c090c242e29f12dee8b4335b8ecf7ef341de3a30892c09ef87913cf5
+147ae0cc255e05eb602420ae22e8c2754976dc6ce94fc477f330dba72728449d
+459b2ecfecec62d0be91a9397b312a7d46b0cb7cfa2fc664397dbf9a50bcfbc6
+3ed6fd6a7941d36a37a815cc9290c79fe24f19d1a5c1cf0671a73c6c22abb952
+5618c9a3a9909f1850a9f470d2fde679c254bf516641ef96f46574633a94bd7e
+c9890023100e55c6a51f1124b3dec6a7fd42f63499a1066d8d27a25819a7ca1a
+979e04a8f1fa55d4aaa3eb05d8205cf93fe5d372778e809ba05dfb1e0a1e60ab
+6d1140d4c0bd8e2db88e7d68eca8e3f3e2248cb6fcd2919c12d60bf4549cad35
+6000877d0241f7f19487e8c2b17a522bac5a91f864630e2ea4d2f5b7bef4d091
+064ed22d2f597d18c9f04e2e2e1be2ed884cafd31231da6133e79ad708400c02
+fa56a3f3f5eb56a713fe068d4cf564e7e20dec5cd4696759cc35d34fc0efce5b
+dda7c02eaad828006036386ca3432c6c005aee97bc884afccd3b642c0a17f418
+e3f2e436dd02237531cf86ae391102b2023ae0913471b6797a8e71031412ac87
+b96a7173d5a56332ddc5811f8672b377955fb5e39f90d787ed2b0cdb81866f79
+165c8353c9cc1f0924b5f4ab6bd5197ea6273aed03c838f6a78bd9c40eb8b71b
+436c0803bd569c3ae55ffac24dac9de63cf6f851c5e2199c11d9da77009e5531
+09e47298f63c44644470d768725db00743efd4b012665664b3f663da65c6329d
+a22e64b466f56bb45e7afa47e1d2e8680a49fb4948a8c424c175ebb3f221a458
+d75f3f84929ba4716c503c81e9baf81999337a0e74d9c386e2b46aa7ecaa0689
+e5b00465cc49f96f7003d7d0bd1463372602a5a18bdf3e924493566ee07b37df
+97814292f85845f2cdae528cf8e6d40b1b4c7ab83c276f3d9712e7cd00e96f81
+39dee7bc8d17b48a57a39210ae727a8563319091fb1944279c1e670a24093b0d
+03ac8d4a479d2eead32e98af57251eaef7a6a110493471c97c04cb50fed0461d
+b5d0f89df4f461b67bf479fac30463af0eb0a5c40b3ada200bda798ca929d04c
+aca634d46b3fcfc12980c2ece9439363ee588b4cfbfe1adf3520a28209e59572
+148f5dd6e4891d9bdfb2525b5d4e16fb79c13a65e1d6872b1e2ef1c761d1ba66
+ea1ca508c2a3bb27a32515269ed4377d1ee7ddc8c94c4078bc4b352211cea134
+95326faf27554edfc3a8854cdd4ed995df19dedd2beaa478a9409a77f75fc1f4
+d57ac4352afaface9ad01b0b621cd8572b3c65878ea89e3f43269e8a0c3854c1
+454418f7b0b385044a15ccc1823961ceac3f500a09579e605f92f0bbc9f2d816
+8c50cd9e61b84e0fc17ad73c36227e22447b9ef1296f2fe302f23663deef0fc1
+eb759acc9dd1909f369fca5564adb3f0b2ed33428c75fcea4caac27e7e2ebcb3
+f50fe19f3a3904eb94baf40c40bfdf8a787e622563a2cbf6c32de0eb309ebbc4
+402e31bcdce135d63f42f314928df9816b69e19f732539bd00b5950b5aa8fc6c
+b3bec0f14e60c3b97423680fd8158fae9b076f3d25aa3fd81bb5132f9b1f150a
+caf2cbc0744e0d4f42b186af0591f16f51eca0ab48aa2525dbbf629b4754f235
+49f1f9a88d2ec444c26f28ad54c9c388ed9c00c9b2f5a19a32fb8880c47ebb80
+16ceb36d0cc17489b3e4e552984ff17ec5388f14541759ec95282eaeb4a2d6e3
+192cebedc3526f99363024cdebb040b3da29dc93b58f6090f2f5bac6c67c8ea4
+88b3f0eff0d6228e20a5b865bb2d1870e9e76c9663fb32e899c3f1f03507e174
+af0e77433fb35748aba9dc78f419fab7c9e508f73824460a7fe6ee23fca964a2
+839043a19ecb24b15b6406769b703a3b831bd6c4c82ee4af7aad7e5295f85353
+c7d3476119fc664568089a3350ca986913f16002e2889a7f091e02e3a400cf8b
+83ece85176f96fc41efa93d5d658f45ac91e6e566184cc0376ebc6c8491f09c5
+e6b12eeea7e4e445a8821e03a381c468bdef4f7074b631a3146675b53f7539b2
+11e0b3b1885eb173883c4cacf1223ef4f6dcaed8054c8738fc3dd1abf1566be3
+b4d8e99bc538504742ab18cb9e5cf97c9e5284aba6f591e2d87f00952d0388ba
+ee7c3ba1182073481edc7b9c0e761a85a1643941fc9a0bb39252d59c5b0abad3
+85ca9296546fdb9faf2bd384db91bd96c59da8250df2b5d125d0b2546bc7e2c5
+0ed4dc568d8f1b65b6f327842bed0e7e910e44ddfa302f5b30ec127aef3f02f1
+1dc0ce8a94bd9a77c33c8e366ad06f6675806d7f4e77282f88376fcc8e1772e4
+1ee7f1e9cde177b826f9069ed5c3d3d0b4bd54bd60e01d4c768cb47b27624853
+fd9e3760387debdb46d9dfb6da0f7afc1e1ca352f141b9039c6d2f3ee7ba88db
+d5f1a0db0753962fad600b9245a3a6bdb0bc0dae1e65c3b27bf95a52353bff9d
+34d860a5d9de8ea0547b9100c160b7b631ef5d8e2bdae77d7a915788bef9eb91
+11d4d7f60f0329462d2ea14a7da9289922a575fd88a52c1aa98cf1f4f34b7054
+64336e3ab7cb09d81e427e3bf24e87bf7147dfc0c52e6c67205181ad234ca1ff
+0dedd467d4a13bf9afdc6167bb6f33a47f1ab1477ab32752c256286b25438259
+a143a6d95b2c6e5dd38dca03fd6c803782dd7dab0c7c0647f48a84a163cfec2c
+e098a2ee99d2b0d46e0afc85091c8402b36b41cc096e733d3e7252c2a4b58f54
+369f049d0924a6903f8ad3e1bbea39e25bfa05815f79eef03e1748b2d581fe11
+7ab2e3c7a8f520c194b3c5e98fdea58f19b4e79d677ad54a7fa485a7a9712896
+618b0c33694a3c3467a245c52cd39fe9730e7c2634d298c1638a0c7109692cf2
+58f8a6d0bdf578cd28f72e48176a959993014e050a7d060918fde0a223eab193
+96cca9c895a0d5bb26eeeb9190df3f07e2d6243d7a845404be35983125b133d3
+7bf15f8c7cffc8ecf514969e23fabd262facea11fee56fa69682307719c216b7
+881b733d24403eb703c288cbf898749f3e81fe24451e063b3c02cb2ef8dcfc36
+179a525662d47e0e6325b93d885973935c91cc6c52749a939d32fa1f5a74b689
+d06d161914dffba8335c544ad8c4e83522f403157b7aa2ab15593a7583c684e4
+72df545d24a4894038195781caa9f0f49a66fc62fbd0a5155743b7c17c9e6ffa
+e86076684c20a77b1e74abf75aab577b93dcde8c3ff60aed1a87ec006d276725
+215681e444c21acbb6318f41d175894c303738994c15099f4021950a8b389dc2
+ab91b74ed57317f7faf10f00bda6be25467f05676ac4192c369ce03bb374617a
+d5bebcc56ffc07cb5d8e7da3e17b7ab3d9d5dba4b8354c03a64f02be62ef5df1
+4b9b9376e79a803423bc55c5cee3972f75faf61dc41d1e8415ca55d3cf703612
+1cfe771be80b697389c047c601dbb8548f0d58ed841d25531a41d8664730f34e
+2b187bbeb8d9c16ae7591ca61fb2ab36ff3b6782c7e97833827a1ff86644ae56
+f463956635883b55891a08fa707e90c392ae4721fdb0b2311f8cf00a4703faad
+8114b615eef9737684a3c53ca307abd11558ce0810db4d94a444fc6babbbe40f
+3fca201d7f66ed5f834d33eeb1189648d68efefb7af5a080f1b6297b75e7815b
+4680e3c4b2676f3c763fd9d28fd00374c2ff2697bb8b96ea13cebdf68eb17001
+c041d24e19c97d33d448f4d6aa3d50d8720b0377135f30b479d973ebebb93031
+aa1faee6c275b21cd88852d903f08e2629066e18bfcdfe736b208429a99f7420
+7fe3f156e82b16cbe3d401aaf8ea2a417a7ded77fc22d8f047685fb642b7e25a
+50c5141c1f1f38a14ce3c0b8b3447d8f48de07c687e4c4cf69204e85c6489a3c
+adf29ca7f2363308621dfd1f48efe47d7fcb3f67441ce965f04f42b78d23500d
+25890201f30d13dc767cebd955da0ce6f6411001fac35b8ff9762eeafda44864
+cf1fd2f8c5c006ae8afaea913ae1c75765e4d6d77b7e21a6d16daac81366f237
+78d2c5b9a64872015bbad846c77d4a9b93353935d2b6e57b39ebbb02993c18f5
+228d99a76250b85311629162556dd299f7eb2479c705c6e477167faec90ace94
+4145a22a5cdca376cd2f809ee685329d8ae45f3d29b2187bd4077b1e7c5889aa
+d999a67759f2b649e82031f198bc592bff385a196f4b9943300e1c9557ccad85
+497b9f2c5ac963b85527302a1d7c42d5d5c8c58328318a6410df0437225eb017
+494c3aa09f129275a02d0f0d2d5e24fa35a6b0112435d63cc0706491cdb6e75d
+d957789831d30481e3b8e52d678d0990202a4310255adefea4a4b48abf4b835d
+35c66f7f279e1d7cd4887798ef065d2218056e2374c03c99fc2e17a24a9e70b4
+9440f5e20c8806dc23e1b1b545716dcea57adc5e40d7df2a7a259b559cd37c2d
+8fb1eeb6731601ccb46af23de0ba8c1628f4b88a9b2d468c96730bff946e66a5
+d200ae32702e6fa6c907ca03518731f60b1252a5cc2dd1f9bd90428c2e0f0a7c
+54d92afc89333da6a83c324af0629a26996457d6374437d9cef97bb99eff0e98
+a22c6b0deba1062f3c48226dbc9a5899cc864b975bd1f082d7e511a5b4cf9c0d
+7f30d371f689da42f11df7c18389941337b9c07e1cf5f5cbf33e400feb6f4aae
+e60a026da25d51a3bc14d427d37fbc1e64e938a4de50f52578768bc70ce53327
+2db34369f898761aec2c8dda5931f895d28872ec6f209d78be4f4ab8da35f656
+97c57405ce7ae5541c9ff509d5762aa6297e7a0194059eef3a2ae5d59dfad4e9
+807cba47217ba163742c83f8205052cd729ed6f8c452af9712dee557d4bf8a30
+3209d36bdddb790812c4e532165f955c981339226c4ccdb89f78666953c02eb2
+f38c4cacff62da858e16feb7bd379b92d9420a26fe2a0aa0c71e064000164413
+7c538d2da78a5403cae324705be07519a4c6124f4e299c41497f23ab3c479ac8
+e309dc694cb84b693a40ef5fa7d4eaeb84e97643474253f982e38060a81ef3de
+b08144992e048e8fe2e9719ee6c840e5be01142f4a62ff3f2f1b1d70997f1fcd
+183c5cdc04d67e5f46f946eefd6abbcf0170141516c7bffc2a07efb440dce1ce
+888a5acbe4c407c8fa46e28d20e7774d2e374e224b991242df5a20cf3be574c4
+10a1a88badb054b812e7f3ea575682e6a86792ff4ea12bb43245bfdf588df7ce
+ae590954e88607c4201efb34b2a9cffaaa392ab52f72ec08de1424d2420bf7b8
+2f2a0dc2aa083310b4a6f2a68ab5ee8384bbbf4ed9f932308c2836d6de8da231
+dee2b4f08790d1653490b71ad5d0bed41b06f659f8c3a771b82c8e58ec4e0a0c
+5a9f7f9874bc6a1479b918050f06e4d1b49232d8b44f312a5f6666b49e54389c
+18e7d89a399fac13ea6ea584dd48ac68c0ee40d26e4f2ac32951a3aef14c503c
+7ca2d05701b756990b9809e25384b0815fe2bf5084ed21d8cdab1fe3cbe15c41
+e8a94336359df9ed3a43c529529a9e7f63d8de36720e108d1a9feb0b9ec91379
+b57d2ac8a6799176ca5d5956ab877d87050d86ab917689c93652b729d4746f6f
+34de32680d8ab5c5a4565512d6ec950a60f5b0b141f348d1934b4f3689640592
+f22d1c1cbcdd5116b204061afc1b8f15afcb06f4c44905d17b8e44ec96ca2888
+b34eb85465ed2b2620756ed963fbb9312883c8aaf4870c52eb032bb5cb7458b2
+fbd796b670e972f576dd3941c76cbed5c40b669f0dcb34b31d29501097553698
+9bd2a479acfcf324fd549b3e41bdefd06f42492c36d8c0201d2526e53ad34e55
+2b2384e39836743766e384e5858f33ac842cfedc28022ee8dbefb2a2c3a408a6
+be84826023124f7eec8295a2e1079480f30eb64479f2673da8f051267142dc54
+e88dc8dc4ef41036f1de1b9a198e5006f8336b29720288c9f2e545ec8663171a
+280273b1626f882c6894be2fa2532c2f20e4e24f1406c0627f9cc4021cac67c8
+3a60b39f1849b483757f18ca956ec3bbaea96cb0e2a10477e69a6040dc3b5321
+391af5478fdded8730e825818d960c6f4a305d653a732f1c51c2ca3e3adc4a37
+22958d50a78359cabcffaae1d75ce79e72e09a354c5e805967e30ae708c109ee
+75ef233df66782bebc4c5dd9ed6ef0a50eb2693787576a19b42e70e3d0c073fd
+fe1b3562083bc01d9b38868e64b8ae90b9f3164e2a29fbb1f1bdfd8ffc2a842a
+c2f9801d4839c97f4bdaf1466038eb4b6975e777acbdd875beb59268f0eae6d3
+a03c2bb60bda0ffaaf77c4f33d4671ee85f301521557a6f323f1b0d060326fd8
+7c60f65e4220b7fdf85de8f0ed64661fddba2efd3374fc45a507437a1ad2ab49
+38e4ccbe2411ffb70718397e156d24ab018436fecd39af252f3f9527397cdab6
+75b261045194cb3d3b5aca47c98f1177ca1322775aa8c29216fb7f8ce0fbe698
+479abd173b9541fdebbc3cde6ad12be816108a049d5462572544912ecac19e6e
+9fc6dc06160904e7bb14796e5becff4df3a8f645825c9f59fb419bfb5ced8e5b
+449a2e57adc9693e9d34e6bb5a600d16189bf146f3dbaf4f75d16b303a322048
+ddc0de4a91156aa427f1b137a714f7ec2a4aaf612de4819dede79b78c90a86c9
+01278125bf2999c9acfd90a866830d00a0f1c83a87cec69cb2f382c935bc571e
+a3b53fb22664be95d8e95d229b9985d992dbc6439f0ca52762b3cd7a4a50973c
+17de473f987151687da95caf1457c524a4406c98bd025f353124da7e6389a921
+e56de4d1ca7901cb37f051b9d3b78709640530cd549c9907ee6def35aeb2eecd
+1c9a1a4ae7686da61b848371dcacd9f02cc320f29ef144a10803df5dc4621887
+09a85504074b8439c1a3a7c253581597d6f94289e7113c678fae406b6586ec40
+fe51769903be72259817704579212bbe802679ef21f7578fae78d1f8c29a5438
+b656f13d14ac4b10d1b48d83dd1ec6e569358f9dce2093f319f9d3663e331744
+bca142ec6b901acb9b5594ea7423072d96a61e523336059c1091823b03dc6756
+71cfc688bd2062830e0edf7a5d400c680784691ff46bf4d8853a42c57320414a
+0c7b838bf2bc33726d8a61d11dc42005b909b241b553c37462ba057c30e7bdee
+b3ec5513ddca5046dbf783c780ffccdc188b5890daf03c94c8bbeadd2e33e95a
+8bad7cf8c890753d607e1e74dda3963d32cd37ad2d0eb722498718df3827236d
+7f073eed7fc3c0ce0fb5629f08d4a71d1825c4d158ef364c8d69e8767acbaa92
+e1751a266718d67fb61b4a07c485cb887f04bd30468bd6ff5163e5e35c7b4bf6
+ead5db27d8690d7c54b2be107d8180396ba6046e8b1ec7f51a624a52ad2f9e25
+96df52d886aa0f5f0316fb0a6ff881ef3cf2a11debba86921f94b6ab18088a61
+ccb125c7732c3681373e4151094543ad56ba6b5b915ca303a753a65aa189f6d7
+1bcd8ab565ab5696b9b0a2fb5b7feef3dcd6ef83f859fa4be52c24c31ec71153
+4577aba733b4f0ec2ca742f8bd658d7646e6af057d09b504f072b85e8ce75c51
+cdb3b17d34c06c1ca57b88e7ae944d289bcbc1f7ad27898a703c0b2b9e0dfc9f
+87a6b2c1d9ea2cc05fef8bffb8cffd8d8246ddc86e135a8361d36748680881d2
+5daeefbe63d60e449d50acc1718f1b6df6297849d31eecb6c990304d5e37d6bc
+d83c17c4ebded22db52466af31cdd0b576d69ed50ef359cb44507a79462b2825
+04a48a4b8bbe2ef617837ae266e3ab90e5f45647ed6b99c6d8b6121f1f7771f7
+5b76362f01bbe8a8b4268d4755c7b613b2faed3f108c29bda855012eea6c2221
+0f618b416e25534efec4c0f6d0feaa4ce7517802f2ccf54c96c4b5b9227bb59f
+8c8a49fb435d4134dce397f41f3b6d295f6453b9483c3c1d2ffd47a3199b370f
+2f31b3772afd59d0135ee2970b66acc4a1a0d3a18be2b3cc0a8a261e9dfe32b1
+a63ebc7fd99af94cabd34eeafca393ab83b5ced9b4e60f868e0b7aad2c2f21b0
+d84919f1c1598e6143440481e3c4a97750300f7e0660eb65416215d13d8f546f
+74c4700693327ae762ef61db4463f3644d534a3b4127c06741f0f3394f395ed3
+84c4139b7ffc5b02185dd9e9fc4a9a790d91eda97f8262e6327779701f7440a2
+7120c75242cb2e3c5570399c648b21da288d2a9d610dd11d5f9cfae9aa1caf9f
+05437bc137d8cf0e83272ecdec1c574ee6880505f03fb673c5ef5e31a674d1fa
+390de77900b9dc1fe4d73311032af31f6985bf38005fd3498d569de012062aa9
+c4e5baee3ee651230cf8f06f9562482e56aef639b4e9b14fe104d7a4e59d9f59
+ed573a530fead02933ab576a225e00d4681821a6bd294b96c9f73ead9eba509a
+e5d9008007ece9e52dbe377e161c5b5e1fe556db12e167595ca9024a24c72e65
+527e3f4b94353bc5fd302dcd2343dfc038950bbc4c1249776e2561a90c9a5ca9
+c045f6812d9491a77d5f775ccaf51b81f299e1f9122c50712fcd660bf649f628
+2aee3c072d41bfb68cc3aec648f2201fd414d50e1375dc1fa058a80f54ef4852
+2715a66f46b0da8861864fdf8e22f6e47cb32837b34ffdc5b578717a1119c6e7
+ef7566c58b373d111eb6c2bf1e9853d13c6223fac9ad3123765163c06dfc0637
+c692af835e89ebecf5b37620104cb8f17851abfa357e02703a059d960d9df6f7
+fdbb168337708e7f919c04c802ea2e2b3a3babf74eb86e63de9b8644627d8985
+a1ad3b8adcca509f7a7debdd4634cbf42715063265b57d40eb7475423c383835
+9cb5a1fccfcc7874c782cd859ba71d5f114991e6fe5e557fd360943786fa1610
+75b6783140ef30382f184be07a3b0bb616442a4a4007af227492a994854b4029
+8b9e9b4e4483dd252b2230f1f615a122918f32c3ea0a68805fcc73bca40be7f3
+fd94e698d0a65005a64dcbb7d97f60cab183acc86762873f18b673dc194cfce1
+03f07cad09c8fd6b1f532d72cc86ea99ea24a21a41a2e09837093d5e1f1e3d74
+342cc4466d9ed9c1722d8665b00a9f254950c286426737b8690914d856ac20f1
+bf27180e6f9b00981bc8b3b165c5cc7e02a689dccfd58c1b5939186c590a97d0
+4d5710fb5506bcfff05f8c6241c125e300235afcd2311d997a1369783a83ee1f
+040b8fe44804dd62ff7e5e77dbfd66177a934eaee33737d643092a0cf65e51b1
+31a7ce8e502102aba1a8a68b8d95c5b0651c83214017ea2bd5e5a52d7e9d8afb
+ba7cd22bbcaae087ead54739401b0d8acda7766d94d640feecca18f1829ae75d
+a4aba8485bc9dfc9c67409c7d465f54d740ccc8ed6452872082bea2773fd5d64
+6a809f5d382b69955db3a56e61849017f103bec6de80850132002216dfd30111
+0250985d8241933cab0ceac16e90d929dda1d3169a8de16ca98aeec1bf59b9b4
+e0ec460a2631f6d3ad4f84fde5b5dcd29d53afbc6c8a3adf15d234b13de3fce5
+2689a74f49cdf2d9affd89a098d6fa7c0f93724a08324ed1ce7db85034bf4a67
+e7d0573db8e2fbd09e123156b2d066bccd9db05b87cf61545a6e219009452b75
+41aba3802cade07019910ced99eccd026725d0853f9f159703f449d1e1d33902
+148421d34f132378dd12d9e79168bcd8dec5bfe47c862adbf7883e46dcf0c241
+e068ca77b72ce9a73a3ac40f568481f62d9f36ede5f0264c4d8f9b2ce03e19e7
+0a94d0e467a9832efbacffcff9efbcbd405432914bc36fcbd16c4c2aba631f82
+13239b69f183482bd2922470427fbab78cc598a57819dae5e3321efef1fdb44e
+084a4402b8cee480242e42dc09bbf208042dea7968a643851cac21aebc1ba274
+0ac999d965b43feaedc8c76a32ff8d4fa30e2c8444b01716af4878ecf291309c
+bdb70c5bfbd4134ad5d044a04a057405a91e1a1ef15980383cd4aadd4190904d
+5528e55138635714ec3f9d8e0fe1bd1e8ed4b742ea90572f1ac8d01e711c074a
+4125ea595fbce0746121a5d022d16b2125a1577850f6d1010279a5dbbf135eb8
+edcdcfc459b7b554192149c29327f86e477dd3d13fa5ae3a78cfb714c9a75006
+7ba154407ef22158670059820c8041941f7ff5c27c016b20b867f83a9c8955dc
+d282dbb6f72bd2067dfc1e91373a3021be2be6aec5f90c8001878077eabc9263
+9f5beb892bfded1d04136bb3140dafaeeeb31c21d8baf03715fc56ecc16e7dd1
+1c12df0bb68240772f2c59829482cf97f6a922c8c7deccd1a395e7ba2a1a8552
+06c27630ae1f236606a3a9dba1404326b8b484d5d2564b480ee7422365234cef
+2609605ad9e24294ce5f5bdd61a479c33fe53ee8bf857e2d2a25dbbc9a1cfad3
+a5d7b2f1155d29367e318c8a82e1e0aa236b8442838e3deeb9f7455923cd769d
+28c1f780c0d3bffc275e0242ec975d2beb7f6bb5222b2cdd196e4ec94452050a
+76a4aa6352633cd58f461fd646f23758e343b5a386927b66ac6ef1acc84839f8
+bcca9f9f93f18cb4c6bbc663a951dd5211acd684ef945c10f156b5b6e1c182a7
+a580b3966716c334ddd9f78a404873a738ab6ccf8a335f1f6dc830d7d74e021b
+bca95d260b34d1933177e5ead9c2793d264c94e8bb274b9712afb7862bbd8f74
+b4cce27cac9f29c086bb30162820a229e6d5c83410a8b876fad5b8a028abc067
+885b5cec60995550d35f60afd1da93e3dc14c42decd2b0800706a222e9e4b7d7
+bba9646f6a3ef9489dfb011045a6444cb599c62dcae4b11de7d8d98f8e58a9a4
+feba0e5f7301b795f4085baa4a7085c5a438d0b784b21186787abf88b455f1e2
+ef19fbbb4501d5c69c22b219737aa5ceca0d0475bb6916685534448816d2791a
+31544769ff1152c2f2cf4c7cd3f64c6830522219349254d11e6ff2056a341648
+e9caf2fc5c6f48a8713448b4a0a7bf4f250df1f9ab9db798e0c5d2cad0116608
+a0a6190d8fa4f8e67f705d8dfc7cd8be652b13ec24beb159f97d22997094e38e
+90fe6e9f3d2a07ac92f1648c78e6ca7452481fb78dfefdb4399c62986b652e08
+ca4a9a4966cbbb572c4b2c8bedb9285372904836abcea90e91ee6fe8dbe8fcf7
+18f4e0ce97b29be634db1f19b541e003409442a59e320cd38789b76eb79e35ac
+b1e09f5ac2eee068664a0f505c61c07da5bbf439acd52feb4caac79ff0575647
+2aada68f6aad5a1b760468859d9297e3ac4ceaf7830c09d3562c012d48cf7da5
+f93d7942a15fd76be4e90cb1a966503d32dd2fc39c1cd01c629b600ba6463288
+466ebf44a4df63fe204067d6a39719ab32b5073d4bdd022933b5bb5652510919
+af2f90863be9f08dc507609487ebd7b796a3f0b029e13492cd0a1dc002d85b8d
+a0d2ddf319f7e732ed40a87c984340976292119ab947b5f5b9e5e31e6023e22e
+6ef0d04bb9d9cbb7de56a1626c5925847300a6dbeed495b18deeb81580701052
+e4b37d9e0b346aa8a55621bf5dfe3bd1cbf2051e62ab1e1da21387b5f38c1199
+34ffab0e8158107bc33f36a537996faf01870b85d5da02977ba62fb8e5d4878e
+1be660a6414c9084a3a5f05a4a2c3c1f311a589ba7afc5418e3b480c92f91033
+ea61d0a6a1f9e209226f2cab2d9c10e2b54f22e9a730ab8d48548cd28c3dab41
+5b03a59345bdfa9656cbdf48363eb233dead8ed309268a629bbc3c6e2d85eab1
+5f3b769afef377e4602fee3efe33401eba124aa4d4593c5356214c59db31702f
+44d33f89196e09e6e2215687c448c9615c69d7163b2867252de9771c9ee8a395
+87bb374d1b705d61c42da4a8a7ed8ebd24d1062d377fb37fd84d5ec3eac25d5d
+39bdc91f7c820b9fe806984bcfd3c3753a607650a6ee4460a24906f75b38f2c4
+42a65909bb70e7383f9e90a06f13fa2acf0a37e59a31185b6f9437e741571dbe
+fb518dd564140aab4c91d37e6435ab9b2b376bf6522f90b5660ccd1d7e8b82dc
+3a41d34e2c39cdfa05f1e4a7ebdd3586e69c6ccc4847e086052dc7d6cd4d8302
+c34f4f0402daf9549bdd83c24c44a68cc2e0c2635686c6e49ed8bd5675749650
+a79e40588f4315fdb9c187fa7b4956151b7123f36937b06fd147eb8d51a8eeac
+5461441d24afbadc7922cfc237823efff1a3e742b336e84702189c648ab7078d
+6097d8fd5f3baec947d63912156478662aeda72a501c747a325d1227cd4093ff
+e9a931367dde46d65857290ade9dc3d8eb73e7149dacc34c08faa51f9fa39e0c
+13d14be58999496dfde61566e68f83135a0e43cab3cc6395217a0845423210cb
+032c63d56bae68773991e91f186b198105f165723e08f6db39e889ef3f944d33
+9886c0c6ed8e41c20c0743864a50d37c281abf47fba6d08728aa21a833f22aea
+d0bc38d211caf58d44d01e10c2da4065a3082e562e82e3f1def28b5fbab1e93c
+c3716256b98ce87e4dde9e93622e5ddce60981e89ad0d70d0fa8b1638f4c12ee
+82a601073f84ccd47b631781ef34da22b5cd35023f23c6fff02973f993d7457e
+fe579da64d7110867d6fabe6b41b97e9e711369232f98cac9975d56d69cfc985
+30e76ecfa380311854170f98cc43596a3d4019d08c25e59dbc3eb850e026cd48
+4644353c125e38f199b22ccf0a502d675d5e0be2a4df28ea88c3ca6b939b4b19
+e81ab728d3e44648830f0ccaac81f705d098c127f07f56ca8550ceb827722d04
+6ce419a2504d8d6740cf9ccb5d079f1086dff76bcef4bd20e854eed00bce0858
+522818c8ebae755857d51961a9c61ab5367445b621562c645664f6df9f63a212
+46ca26d21aeb97ab2b271003d5734719358b16d2af5cbc1799c88b899e3c964c
+453e53de23d02bd3137cc0c1f07470d8ffea99d6a27e835ac56c977c149dfd13
+de3c0c328f8edd67c1f95953b9892e0147a245ee0d4e5912c7eba0b810c0667b
+17b545543b0662d53be35c26192356522fd7db85df65e5db4d6573b6c0c0f5da
+3747e6fd6c4a041525f7e48b56ae420995938a2229c967e98c8256c28f3a99b0
+739f75f0f1d250db34ecd7abcf25b86e6b94de40d033d99710fa654fafc2adf0
+118f750a07aea2c94f205cbd091eb2a3bbbff77253122f179395e088c6b7a9f0
+6ad421055622a1cc0538e8b3f03c4dec14746a49b2a19bb161ef7d5da64a4562
+e3a0ad91e4ad5a052d74c1473febc4f186cd6b73d48a895e8bbba44657d00663
+d5e76686f65a7ddc45ab8194be9fcd289e170994d8f17d4847080ec3f0fc36f8
+11035bde3970e330f1b654034faf87b01b9981330b3513c2f32e13a280b52c92
+449525bd879f684edc107a40c02da468ede54c9bf7ae72d4c314563e55d9d194
+96d0f80472b2f3c8398700bee642314f87fcee7e0fb9e4500fc980e0a9f755c7
+1cd9afe4b3946aa06d2ae458ea77080c3308f65bfa253674be7182dea45a8d2c
+029a570cb3914f7c7cd0cf31f9b537b4f2f7cf918c5e82c6ab36f65ac444ce93
+5e1d14f413c2c005ce388ef8175d7c8e7bfd68640c650385b646fd00dbdfbb9e
+0ec83d93f7ddd486a358a8493a4327d11568d3145b52cfbd0bd5b4d7def67990
+6fe1297a16908e16b9de0a13986d5ebf4f829c4de8eeab729480c1372c0b85c4
+62d02d8e6bb0c45fb26e4d82f0152eea9b745e1c20e478ea50110efdc5bf0164
+a678ecf71278fb2bf0c8a53a99ec0f46029eaff9229108234fa1624b5e33f927
+2a232f64acd955839b942f8f8cd3f3e3871a443f685149bc5ad0083f6baf20c1
+4025309173788aab5568160b31e7f7ab6f10f4033345656fe958613d626e8ab7
+091aae62e2150d7f854d5740f601c0756b4d04a2f4ced1f833042b4ea609a051
+defe8aed847795cacc657c5dde3331323d5f21b24154b3b2c991e3da5de77d00
+a4577ccc862f035c10f2c073f85b97fb489a5d5a17d84d9ca133a018a22788ef
+86afd7c1c8952eadc6cf5139605b19df95546e90a839440d56ea29625d57eba8
+0472486cae74bd099198ab8619cbb6fcd652774b0a97806f5f83f6e8a109eeca
+85cc7bfd19ae0cf27336e00d98d130f932be9752cbb97a14a44fc6407b286744
+ff893a26ede2d28c6d5a2c2369388cd6a23bf8e102d7014b3944afea96cbe037
+35db0e6e4922d4c5b2b6add56d317f3532fc50a410cf19be859075abe70ed195
+996f9b9afc7b1f3b1a5d1602fc6d55d5171ccc345e28040625e4fabb28699011
+6ff9dfdbbbd193d503d5ff027b0f4a3b124f2e0a1e428379ac6fecfa313fd135
+a6f38da32b37b3d6b877e5148b55aa40567b78d69bfc59681acf8c871507eb03
+518650eeac7270883e7003ab9ca8a2e531516c309c31f67a059349b0f603f584
+c6d91770ded8a825c6f759cb3128bb928cb1e671c1684cfa153a41e6e775ebdf
+54f25d11865ad5972e8bf3193fa4044fa618bfb88b621420c86a5a30b4716fea
+a63197c6081bb1f324605d018e8c63753fab6f972670cbaa9a4946b9c20fa42c
+6e52c9751654a3cd885fd9efe11600771861ae0d026fe0dbe642b073c91036ae
+eecfaa08a7d85983eb13828c3903c532c0829802ff8b45e64e39079f65a5b84f
+f91b65688eb31e6d5fc58cadc44319885bda8d78db2aab9fc4a268e3397d12d5
+1ca0ffc79929344f97a6201c01a183d2c0c2702049048205649b91a784c7095b
+8630b00c1ee0af742945873049981540863fe38a4e57cfc8647c85c069296284
+599f169506c9df019471e0ca8fbc9abf7d1af1dcec4802e72bfb1d16138585e4
+51918e0c421966a52ac29c21aa3822870959543691460c52ee43517b8588c365
+888921e4560d3e28f72358325197f09baea07fccf9d10b238659be645e0bcdd5
+e76534b21b52941a1e48267faae6abd43149987eb5385b44a422c0d6eb37c818
+542c3553452c97e016c26d38a4c0b53ae8b156167a5e11b861b44bc488bb2bb0
+cc652e3a1d12e616a502d1fcf31bfdcead55e2fdffc121ce85f525ba491feb54
+7a3d16d85f65ad30e430dca5c603685abe8484d4c4144f91c5595a3fda9351e1
+7f00eeccfcdb2e0465566192b23a9a78c14d62fdb3b1963c780f6855dd733820
+89094e921ce09784e1f5408c620f6481d300d9fa6f8c23876a49281b0d425090
+497b767614696424dcecad04f0767bb7601b99dd3bc5cc14d2dd77c09101fbd3
+b6e725e5c68ba66a5a371fd6f3ca6351ef075645a3c03492f7fbfa225a5f3e01
+b962177026d94e845953d5781064633edc41fcfed874e011304723a52fe8ebe5
+d6efc5e69b9edf735067ba2d3ef221ee6244034df2469afb6056dba877ca9850
+d4e20ce756a79a38e74b356019de03ca6651e54d1523e12ba9d9dd8e44dae7a9
+20eba8784607fd0eaeb0b456bad6e739e264aa0a3f4d5cc5584e072cfc8e0a2b
+949b4102d14fe3bbcd7ded2405718b0a7cd41deff91bd415340d6de94797c53c
+d734d14a11be9fd9de57cc35175f24913e96f95315ad3c66ee102176e59a3b66
+9c0b992d1b6c3cc131b33119eca4fae72f7553cb977dcffbd5ea29728ac5a645
+eaab33042a0ad86e8b28fbdf79325e28c3801cd0f9d8a2b563aaebcebfc6540a
+3ea351caa601ba8e5c5bfed770d61d7366f96d6bcde2db981b51e38ba35237ea
+d55fa9c1cc2b3381131c1dbb39ddd7229d06e4b9d203d066666c8ad6aaa1a6df
+0d346f843205c41a95f72df3027c9e6486a0088f8f8e7c9ef820e2e80766fc70
+6c4df71ba5801863b29a917a16abcd824d9a94c9081208685f8a4398004d8afa
+25087ba3fc81dceed46b7d6fc92d3b9557514899c5c97114ed722616b477ccfe
+4f4e1faba32e6a24a091a7a1067628ecc8c421f8a967c6e0136a9c23ef642100
+eb91c300975d6dc2c09da077e24fed0aeaf2876b91d0db63c4e347afd558f613
+44eafd38df995bd98fcb720ce19023c26e0b1157e299e18d13fc7715bc1141d4
+49f05fc6bf234ab5af157696a354495e45a818f41a007e601b49500e7554695a
+4c21c8f6fb67d7b81379f6d3abff7b059f277e48c0291852c6af3e9d412526e6
+b23653e0283af4ff8f06503ef135f552270f04d735cc21fbaa059025e7e32cc7
+f03bdc406a167be87ce1442f285aba9aab9f4ff91daed0f04eadcc8e98a6ef67
+0263a76e5b77baf65f979e202658c06d0deaa83aeb577e4872a916a87b8aad9e
+9c9b22630d3b3b95b790f11f83bc6a52497a7c03264d70f55b6ee2ecf4f5af13
+d45df4bcefc85437ad3d9b78e565e3dadc353e972fc21ba6f8ce701cb9c1aae6
+5b2ffd89d65075bd6a5ae8f195d13165969e08c20a6143efa43a31963e81805b
+584f93e1957713065d371abeef4ade6c3c024f37bcb2cc00895252332325359e
+6f7425665f46bf49ed14cbdd14a659876670d962d36aab38e75c47db93978cc7
+c30e5e33185c437cfc260caa8c3af8a0fe39d955fe41a89344db01f0f33632b5
+71832eff64ed70de8b5dcf90e73e908b274441d7e34e14381c6a88bf71db2703
+8b3037bcd5eb5a4a1c9b6067d2874b898c95dee5b114c10528dd3cd04d412719
+0405f89ad7461b66eac5bb976c6eb433a43db8847ab105a9d6e004c1d08e17ec
+c402862aeba56fa63297c5dab64a0f3dba016a5af5c761de36c9bdf0b375c0bd
+6fd3c0fa3787e362103c3f96d6d1bca0fe0b3fa33c034f472204cef2949742fa
+5b973d21b8af8e7c1ede70cb40860f7a58ac12a7709be24ba724166770215440
+b0dd64dbe6af369ec9fc0d82e3c7a597884e4330109ab7631b8f8a62f0ce7dc1
+7c9919d55bd997497b66e4089b640ada46e454b4cd90a45a5805eda36ec5db69
+ca53cd3380d2f59c9cc4c6d52139cc33324161adabcf2eb44cfce47ba893bd4a
+53d4480118c1ba64436d3771ded3182b2de8306237012aea5d5a2995abcbc097
+e7535e259053c58c8de2a6c7c8d21ad6feec5907c2f6783541c68d00be43776a
+8e766d72a8fa8123d819d38f1f53f36bd48adcc6f7a1455cc87453f96e550903
+df9b819196a27061facc772b773dbd1444c37d3136a0d3158d79e98a70e8e030
+dbaa42c202db2c0f8b03687f3d48b0f1783124024a5ebc0433990b1591459766
+cbeaadebafa313226d839697f97e14cad664856368583b3e2e79609cac4c81af
+e602dd4200cfa43fda4f1e48d68b13f27533ab9f3fd05a0143378b81d7e5bc77
+eb8829d3d4e896af1c31ae42d39bc60f687306a10107727c8fc2fb98ad61af9b
+7808b6afccd125519cc4f98828e53ac23388ffa188e885c64a97439cabfeeaca
+48453cf4c6ac118ff667c21300d1c1ed5fef10e03f22e69e36248e476519a677
+fd224e37ac95fa3d9aeea5b2482da91aec2f5e7a2b57a84ec7ec8699fc658175
+7cfc8ed6bab56242725f615304b3cc39c20e8dd67136f864ad32605b0ea9ab0d
+3662bb1ec7e317684a5a6afd8c3e83358db1392bdfb53dcb2d1624ba8772f701
+a3626967c0a543a4b01d70aadea4d1c2c86383c6eb9a722a6c833c0c5f7e92ef
+d67ff6bb9fc72a9933a446ac965c26c72ab279c5755890d21a9dd9f3862582bd
+b1d9ccd1963a21bacd4be17d03819ab523f4473b20a87f120dcef914c72144e3
+50ac33a94859de19fc1c45816ba504646b8b53410dedf6f2b1dd9b2f0b274901
+3aeba319bc7d2e1adc99cbcff5d5ca41baf982ab06c3741fdde91b5ae8601be0
+a690a8848d30eb1727351734daa8ec8fc416bb425309b1232d290ad42ab8d970
+62812696531e1a5f6f87844f9ad9fe0cc660a7c4bb1f7c2d37ac95214fe2cb45
+37f763691698dfc6cb42aee39ca3e37910a5caa4bbc93b20d7565936223f79d7
+77d14971397338d791989bdd842a25eb4747a45fb3d0d853000205301a799d0f
+1a597a34fad9c47ba0c27a82251b4d460f1de01fd0066bef08e4e6139412f5f7
+b46ca9c6fc7b5e1bff8f5a24498699cc168b419278a41f5eb1845b41a298cda7
+e237d3b149ebc1ebb02c33433c0cc8043bee875475cc389dfdb141fa31a67c9b
+97f2bd9afcdcbd16b0682b3da7c3fe91ce83fa0eee07e155dbbafa26ff706798
+c07bc149d963c31bd8b3d9736a21d45d5d7761f6d93111a10b978b32a00b6593
+4ad2e4df3c2979ce6179aaa50a28348d3fd1743d482c16a2538eaaa17f6894fe
+a19a21411ac73ff779f355ae9fca182a55d43f1080a60721ec087738c87987c4
+699e24c19172afdf0461ef5d75820f2957bf75b1b396bf2a5462c7be537e67d2
+8ddeb130863434670c75b36878888a430846e1f6565c9f0f529ad4e5d2386dc6
+1f9fb0f4782a802c853cf5830763f5b9df5d77c5c3fef77c14fa64b966573237
+b911aa353738e3ce2683d5a4612ddce6c8f50cd2c0b11912b7b09cb60590ea9b
+25dad41363a82751aff5a9da8e1fb9643a84f3701b518b059e935a3199685c4b
+f2afa07980ad93fcc6e7733a7c1cdb6d9ea9756eb985041297452d74381a609b
+b8c3f9cc4c7b9ad09e57753602e856b5511cda7b0c9a5e0fbab6c9ef7d7e8d67
+51760312ba04d771974ce5b6c18d9de0d4bf76d5e5b6cd7c3706f94693215165
+881bf682231eb90cb99794177468d89877475bd1510e117d5f845f26fa303762
+c92c2ced4c73a82afeedb275f48fb2cbbee350511004a58efd38e7002e91260e
+40f0792b73dbc2158d542146aac2b860479bf6046c7e0e4edc26090205846fc8
+e333cc60a4aa3990290508b400fb02f09560be4f200d272c713ba3b615e2b40b
+9552cd70a67a098edf6f1bc4ea86732f1fcc762f513a1a004d39c1dd6d8d0650
+24ad72b147c850945b7bfb29e830d4ef2e84d694422f1c89bc34ee502aca300d
+f3c5a3e0ff8359668b11ea33ce14ef62cca8e2dfb8e5ab68d96a9a2552bf53af
+81e78c84d96f3b1eda14e19ac07e75e3d3e5454200592a259bc950ccb398dc20
+862141083a5190c1b2cb0aa0d8d3e8a5a3b21004fd002040c4b3ea35de14ccc1
+ccd679d99308409a138c1ec129a71a1bb1443d1754f4763765b6409e8280e25b
+5965f444cbb2a6b78bf8541250b992e39d0a4c14ed92c7b9ca642ec4002946f5
+93ae24cc194f41357a86b418c8451b342860441b9d2e33c7f8a81ecfc0e5630d
+23ee1fe752b2536ca59253c97aa18712f73f2b0335eeb0c2a26cbd98eedc669e
+938831427718070324999284196cdbae8f16946b2bbf2b9f2a8e0a5928447383
+1de3315a2dc0ae872b1036a8040d9c2a0c77a6c0c473c293ab7e19837fd227b3
+52e8bf1bc817c76412f1d6abd47d809e989b3b2f89285d2693824df3191a6d1b
+c8c9853f2bf81b8c96607a02b31d23d7495a590cf3f96d7328c4fd74452dc16c
+2818512abf981c423d146e9d7a46bf2ef32a98dda4f6695f42532fabb8abba65
+de15bf69090b724a247fcdfefd6f1a83cc35a049d3324bd39816f4ee13a5a38d
+a73a3c3fb031daf9bf78fde0f8f6bdd0e897a3b24e090b54a955b232b2258e5f
+2bfbfbe13db81f6abd243d73e3ff7d5d21527541ce6258732e85baddc7e56dc1
+ae4b2bdead6d8de14b406a7234ab0c0fb1b6f129a7877adb864cfe9abef498ea
+89232ee6639c0cea4dbd515a7a09aafbe65d04ec923e1200fcce3a2f684c07f2
+02273eb6a93f7ae0771e7115385296132be25b258f67273c5a0f28f98627abf7
+7751b7860e123e4a4e70422114eafe03c2606f854588ef418312650f11393ea1
+5bfa6337b955355a183573948398e4438b3e13fc83a36f2d86cca04e6787f6a0
+b29bfbb9aba924f37f5174e3ee892d16102d37b14d7743d9725ac7367217425c
+f6263f30097ef995d81458db1357305c6044d6e490d9631e9ee456db83af1d45
+4176174c786a03a7771b02c10daa800cfa6819f878c871f0b3230e5aeb87d8e9
+b5d0e701fc2dd78a2ef5f9e3f0e060eeafc7ebeb813d13d4d77f1130256ceda9
+4dd73b6e7b423d7f4c0c55f3491bbf6153b106b1316b9eb2ce72b263f05fda15
+0b748d74b05f238982702f9564fb43259e9fd1f77d753f7a9bee8d81b2ea2d5b
+abfa686d76582857a1a2338a5f8c2733728fdd4adffcc90331d2670c260111b7
+6369299e8f79a9570d277107c81fbd22faf23d821471f8359f13980f282516b7
+800ba8ecbac26e646e401a4d7a644fc3851749c5d19a915fb046bc40de6256a2
+4184d666de6f54e6855060071896eea3338fbea7771f129a449e5bbb498f5edf
+7dfb723d4838d670b76ae2842b726e757d534c24ebc471588ea38760f07b59c9
+af9649132871a23ce328acfee7f583f7ff0486e07187a3d4942aaa9e6a38c615
+43299873ae9c902dc5777ef58d396b5feb718509da30302ca268a9fe75e8343e
+a5f4da3a39445369280cfca5442939a61f82f24b15bfc71d2e1b2880df011732
+32527227875329ab6069618cde196f153e7ec3b1dc5fa627ed4f49a43550d02c
+dd80cfc131d86dfd6ef64530f16be3c08b2fe804ba2c8b8ef512bac05420f780
+9507cdc6aedbfa690c85a1bee6f424799dd0407f40e90051ce3d6b1020719e05
+9187a78047533060ed3426bb7c314b179b608fdb19f181e4cf616e0eb850c408
+85f2e1d9c5afa60dd6480166d7b227b731c8491237112df20561ef85e4a3d207
+4bf8ba61da1e50699e9f9aba612c8a9a536cfaf7c9137b08aeee41148f96118a
+43a901722f64a6457937eb18f9733fc353987b8e1fb9da5ec6c7229dad8d0456
+54bcf4426f7148ef1942cd42954a8e5e5767ddd899f178f6f2443b93be25d5d6
+1b9c06e68d653ba56f1506a88f9439a896b3f604880099548ab0dbc39b26237d
+d1bbf9c1858716d858b94377708b44d800b95f77ba4f63577d1758719e208c1d
+4757e53eec9ad4e1919e197b4507d1d43355c142e91c3d4d80064fa7fd5a85d7
+c08f43cdb63e507726b4378853d6ad68ecc29592eef5a8b72869a2164552ae62
+2f3f02dfa6cc2b5452898943fb90521daee4b1679df0d385b9ff15c9ac6c120b
+30626415ed3415d06608b8b182f3efd579a539771a2af421119c43a5444f187b
+55fb3b8668eafbcb63b919a2e2152aaa0d62613c37ca5002c6daea891411cb46
+d58d815d7f231678185a0ea2b59ceb1030a8a9959f3426a666352ce86ddb3422
+0f43b9f0695747f65b5c7d0c0bdaf97f76a67c396f24f5c3d277a375744310a9
+f09dbe9f4501739523f301d94e6519029352ff5c1cced0d6dd89af38c49d8fdf
+adbfc0baf374d259404ce7bfd2bf94a09a02e3463ab9c6d975190944acde8589
+4ca4537a35ae86e26af1bd5e5bb7c7d24e671bd182153a5022047bd8c138016a
+a85f3b7b62bfdbc06ae4dbe5e37528d6c6432b3db333a1347a09838c17b5de1b
+2f9570c33e7580978d48effc18fa8e0fec834076990e0d4b8abaa2c336408011
+53c5ffc858524015d49008574cf40c060b751c67395e8d39952b5514463241e8
+aca46f92701b889780db90362ca74b5d13c5f9d3362a0b53d2dbaac2c54836e4
+e42422aa713a20a5124ee36b353631a3933a5bbe368b0c4fd93aac08fdbdd557
+59778a0b7ff59a185e2f9162c0ab4ce98bd37fdc7a85dddcddc3d5eba6020166
+8eda23e041e6920b10912d251171fd3fa5bdbeae378e996d039c7b07bc4aca72
+e81625f6f816a2bb469d2458518988aaddceb796926d796673c030554e7046b0
+0cd49f488394682075dcd5dd193fbfd068636c9daf09f6eda12a326c0bef9abc
+11578c932adf74009a4fb22ff201377253262e144366c9f9c140db1fc3074434
+87b103b07a68a869b23a613b0c69f687632f9a89bd1e3c9bb4bcb6b0b4bebb49
+8518f577692d8292730c3e761eb113bfd398b6f4f6e9aadee2f1baabd2cfef83
+de4e0924b35836bd53198fee5eeeed8aa2c15c5117f242ca04ddaf1ffc9ae2fb
+41a343b215b005e7267fd653e365a6842bad6be7d97a1df27404ab67126d88bc
+79139d47b3a0ad8f8eb78d4a28a503754513393ce036f6671c1ccc0eab2befee
+6f9d3b5afb869303af5580ea0b3568f8187087aca49310d17dc2e4b626f11ac2
+bca641f79e15101aa92b013dbdea8c4f28357d0fc8bd2cba2678f0058adc282a
+aa1cfcb544f6bef2b2b65488173e6fddb915382a02fd74806fe62fcaad8ca435
+7bd0073647d2809fc510d91b38dd7a964668f72d76d45d3dace0d6383135880d
+1082faf3595d0efb5b3026c0de0b4fe19d4713a8c1b31cbf82b9f4b458c75d74
+3e7731d662b5b78afc79c962a6d73e92bd63dfeccdbfcee8c33cf0f1058dd6ee
+ff9146cf33f535b4fe245110aea3ce3359accd39926187dc760dec775c0db374
+a77f9712be3312264042527b98267aa3cad2c49d0e33aba1d87712bc4ff630f7
+205019eaa70eee3cc1bd3e4c9f91aecdc8d8e1913ac869250c696a060b673c40
+b2d0fc55673c8c262dfdb0a730228c96e5f95a8d01e4559af8ca5bb847d07581
+5bed1aa246387bd73144b416fbe6652933956354c17a975209af6e2aceed8f07
+8e2ab2dd70221bf9b174cbda7cfae19c1313f4d6e0530e40df9c2f752ef81118
+e9cb012af24fe686924a3f5d145cb01942b72be7548f0d3a3ae8455ec4e422e4
+459e5e231be8510628c22295e5ab6226afeffa45b24ecdfeeefb7ef8717869b7
+758296e3249d4610ce84939d8f5a2b3dab176ec4b4e8902b1591099782f306ff
+396a10ba8caaf297123c8c46b8d17cb7f4390c61d4f5ae73e04fe0ea12b2d9ca
+2030cf4ba8d41484a101c9345f9849694ffdcdc3977382c54c4289c58960048a
+45ac803c9a91a2846d4675917b01393c4d8c130c2110a0e3bcf46d79f3ed369d
+19d5cd3be63489816cab5cb1c1eb46cf2550a4fb5ee579152bbd064e38616f6a
+de92f96bc7517596f71b35ee3f176bb07861881c6cb050bef617d19b071fba4c
+909a8a065aa936406c75e4936e9e138348f7321abf5ca3f4df3be8d0486dac3d
+51c41b750a1e41f4004dab3de9ac98b33baab15feedb88c291d71c302adca759
+2e1add8db5a26bde1fadb524588fb8b2971b86c8f31dc72eb3f2e1f3c673bccc
+65c64b2c129b862bcfdad7f3672b4c6b99fc413728a83aa750b15708540a38a0
+598ac513ddbbacae4b22fe4d2ea91b3eccf11bd5209032b3c744275c5dc194d8
+952c4f91dc97ab263685a2c2af2ca0b0043307445ffaba4fc039abd736499882
+51021b0ebf29492634dbc38a677e5bfbdd6716ac11d96de5459de1bdcabd7fc3
+528baf83527ffc7e9257800590cf22d7fbf66e48597e33a39f056c80e8713d73
+94a3eb7b3c65db7e7ca620db7ea44c67cab637c1c5d3606802ee0288ffc575e8
+29e05b312a50f0fee6180d8ac0cf7d0ac87d5c6933f88ab16884e412fb545c48
+c45e60e7e3322e9d1640abecf328ca705ef7f2eff6560f2b39b19354afb51515
+07fe5c904481b7f5201b7bda802357b01755da1d3bfd21d941df316198e652af
+5be4efc5e8d8e14d5ec9e3665881c74f660518b45aced85bf5b313c62e8ccd4a
+9d2d7f32a741dc00fd5f34ac215ac596cbe8b143fa8cc948e52387797268555d
+9a6d454ce1aa5cf8eba620a10483d8099c33520d88fbcaf0e1fb570b037b2bf0
+44acf21d9daee9dbf1b0b311fbbc3505f78ebd7ddbc027a5eca10507216e1963
+2b813b258e61fee6aef63c1570616eaa9f9dae95c212e758ab1e51da1fffdeb2
+79260de737a48f3e1fe5d20475ce1223d006a31b1ddf3182ffa611db5ecd812a
+4dd8a26a
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+{restore}if
+
+%%EndResource
+/F5_0 /CairoFont-0-0 1 1
+[ /.notdef/d/o/x/y/g/e/n
+  /s/a/r/c/h/t/period/m
+  /l/space/w/i/b/H/T/M
+  /L/p/u/q/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef]
+pdfMakeFont
+%%EndSetup
+pdfStartPage
+[] 0 d
+1 i
+0 j
+0 J
+10 M
+1 w
+/DeviceGray {} cs
+[0] sc
+/DeviceGray {} CS
+[0] SC
+false op
+false OP
+{} settransfer
+q
+q
+36 35 105 471 re
+W
+/DeviceRGB {} cs
+[1 1 1] sc
+/DeviceRGB {} CS
+[1 1 1] SC
+1 w
+0 J
+1 j
+[] 0 d
+10 M
+36 35 105 471 re
+f
+36 35 105 471 re
+S
+/DeviceRGB {} CS
+[0 0 0] SC
+119.301 484 m
+119.301 474.059 105.285 466 88 466 c
+70.715 466 56.699 474.059 56.699 484 c
+56.699 493.941 70.715 502 88 502 c
+105.285 502 119.301 493.941 119.301 484 c
+S
+/DeviceRGB {} cs
+[0 0 0] sc
+[1 0 0 1 0 0] Tm
+0 0 Td
+[9.999756 0 0 9.999756 69.5 481.5] Tm
+0 0 Td
+/F5_0 1 Tf
+(\001) 0.556 Tj
+31 TJm
+(\002) 0.556 Tj
+31 TJm
+(\003) 0.5 Tj
+-25 TJm
+(\004) 0.5 Tj
+-25 TJm
+(\005) 0.556 Tj
+31 TJm
+(\006) 0.556 Tj
+31 TJm
+(\007) 0.556 Tj
+/DeviceRGB {} CS
+[0 0 0] SC
+123.25 418 m
+46.75 418 l
+46.75 382 l
+129.25 382 l
+129.25 412 l
+123.25 418 l
+h
+S
+123.25 418 m
+123.25 412 l
+S
+129.25 412 m
+123.25 412 l
+S
+/DeviceRGB {} cs
+[0 0 0] sc
+[1 0 0 1 0 0] Tm
+0 0 Td
+[9.999756 0 0 9.999756 54.5 397.5] Tm
+0 0 Td
+/F5_0 1 Tf
+(\010) 0.5 Tj
+-25 TJm
+(\006) 0.556 Tj
+31 TJm
+(\011) 0.556 Tj
+31 TJm
+(\012) 0.333 Tj
+33 TJm
+(\013) 0.5 Tj
+-25 TJm
+(\014) 0.556 Tj
+31 TJm
+(\001) 0.556 Tj
+31 TJm
+(\011) 0.556 Tj
+31 TJm
+(\015) 0.278 Tj
+-22 TJm
+(\011) 0.556 Tj
+31 TJm
+(\016) 0.278 Tj
+-23 TJm
+(\003) 0.5 Tj
+-25 TJm
+(\017) 0.832 Tj
+8 TJm
+(\020) 0.222 Tj
+/DeviceRGB {} CS
+[0 0 0] SC
+88 465.609 m
+88 454.773 88 440.602 88 428.293 c
+S
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+91.5 428.082 m
+88 418.082 l
+84.5 428.082 l
+91.5 428.082 l
+h
+f
+91.5 428.082 m
+88 418.082 l
+84.5 428.082 l
+91.5 428.082 l
+h
+S
+/DeviceRGB {} cs
+[0 0 0] sc
+[1 0 0 1 0 0] Tm
+0 0 Td
+[9.999756 0 0 9.999756 88 439.5] Tm
+0 0 Td
+/F5_0 1 Tf
+(\021) 0.278 Tj
+-22 TJm
+(\022) 0.721 Tj
+-28 TJm
+(\012) 0.333 Tj
+33 TJm
+(\023) 0.222 Tj
+-3 TJm
+(\015) 0.278 Tj
+-22 TJm
+(\006) 0.556 Tj
+31 TJm
+(\010) 0.5 Tj
+/DeviceRGB {} CS
+[0 0 0] SC
+128.426 316 m
+128.426 306.059 110.328 298 88 298 c
+65.672 298 47.574 306.059 47.574 316 c
+47.574 325.941 65.672 334 88 334 c
+110.328 334 128.426 325.941 128.426 316 c
+S
+/DeviceRGB {} cs
+[0 0 0] sc
+[1 0 0 1 0 0] Tm
+0 0 Td
+[9.999756 0 0 9.999756 61.5 313.5] Tm
+0 0 Td
+/F5_0 1 Tf
+(\001) 0.556 Tj
+31 TJm
+(\002) 0.556 Tj
+31 TJm
+(\003) 0.5 Tj
+-25 TJm
+(\004) 0.5 Tj
+-25 TJm
+(\023) 0.222 Tj
+-3 TJm
+(\007) 0.556 Tj
+31 TJm
+(\001) 0.556 Tj
+31 TJm
+(\006) 0.556 Tj
+31 TJm
+(\003) 0.5 Tj
+-25 TJm
+(\006) 0.556 Tj
+30 TJm
+(\012) 0.333 Tj
+/DeviceRGB {} CS
+[0 0 0] SC
+122 250 m
+48 250 l
+48 214 l
+128 214 l
+128 244 l
+122 250 l
+h
+S
+122 250 m
+122 244 l
+S
+128 244 m
+122 244 l
+S
+/DeviceRGB {} cs
+[0 0 0] sc
+[1 0 0 1 0 0] Tm
+0 0 Td
+[9.999756 0 0 9.999756 56 229.5] Tm
+0 0 Td
+/F5_0 1 Tf
+(\001) 0.556 Tj
+31 TJm
+(\002) 0.556 Tj
+31 TJm
+(\003) 0.5 Tj
+-25 TJm
+(\004) 0.5 Tj
+-25 TJm
+(\010) 0.5 Tj
+-25 TJm
+(\006) 0.556 Tj
+31 TJm
+(\011) 0.556 Tj
+31 TJm
+(\012) 0.333 Tj
+33 TJm
+(\013) 0.5 Tj
+-25 TJm
+(\014) 0.556 Tj
+31 TJm
+(\016) 0.278 Tj
+-23 TJm
+(\001) 0.556 Tj
+31 TJm
+(\024) 0.556 Tj
+/DeviceRGB {} CS
+[0 0 0] SC
+88 297.609 m
+88 286.773 88 272.602 88 260.293 c
+S
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+91.5 260.082 m
+88 250.082 l
+84.5 260.082 l
+91.5 260.082 l
+h
+f
+91.5 260.082 m
+88 250.082 l
+84.5 260.082 l
+91.5 260.082 l
+h
+S
+/DeviceRGB {} cs
+[0 0 0] sc
+[1 0 0 1 0 0] Tm
+0 0 Td
+[9.999756 0 0 9.999756 88 271.5] Tm
+0 0 Td
+/F5_0 1 Tf
+(\021) 0.278 Tj
+-22 TJm
+(\022) 0.721 Tj
+-28 TJm
+(\012) 0.333 Tj
+33 TJm
+(\023) 0.222 Tj
+-3 TJm
+(\015) 0.278 Tj
+-22 TJm
+(\006) 0.556 Tj
+31 TJm
+(\010) 0.5 Tj
+/DeviceRGB {} CS
+[0 0 0] SC
+136.289 148 m
+136.289 138.059 114.672 130 88 130 c
+61.328 130 39.711 138.059 39.711 148 c
+39.711 157.941 61.328 166 88 166 c
+114.672 166 136.289 157.941 136.289 148 c
+S
+/DeviceRGB {} cs
+[0 0 0] sc
+[1 0 0 1 0 0] Tm
+0 0 Td
+[9.999756 0 0 9.999756 54.5 145.5] Tm
+0 0 Td
+/F5_0 1 Tf
+(\001) 0.556 Tj
+31 TJm
+(\002) 0.556 Tj
+31 TJm
+(\003) 0.5 Tj
+-25 TJm
+(\004) 0.5 Tj
+-25 TJm
+(\010) 0.5 Tj
+-25 TJm
+(\006) 0.556 Tj
+31 TJm
+(\011) 0.556 Tj
+31 TJm
+(\012) 0.333 Tj
+33 TJm
+(\013) 0.5 Tj
+-25 TJm
+(\014) 0.556 Tj
+31 TJm
+(\016) 0.278 Tj
+-23 TJm
+(\013) 0.5 Tj
+-25 TJm
+(\005) 0.556 Tj
+31 TJm
+(\023) 0.222 Tj
+/DeviceRGB {} CS
+[0 0 0] SC
+136.125 61 m
+136.125 49.164 114.578 39.57 88 39.57 c
+61.422 39.57 39.875 49.164 39.875 61 c
+39.875 72.836 61.422 82.43 88 82.43 c
+114.578 82.43 136.125 72.836 136.125 61 c
+S
+/DeviceRGB {} cs
+[0 0 0] sc
+[1 0 0 1 0 0] Tm
+0 0 Td
+[9.999756 0 0 9.999756 62 64] Tm
+0 0 Td
+/F5_0 1 Tf
+(\025) 0.721 Tj
+-28 TJm
+(\026) 0.61 Tj
+11 TJm
+(\027) 0.832 Tj
+8 TJm
+(\030) 0.556 Tj
+31 TJm
+(\021) 0.278 Tj
+-22 TJm
+(\031) 0.556 Tj
+31 TJm
+(\011) 0.556 Tj
+31 TJm
+(\005) 0.556 Tj
+31 TJm
+(\006) 0.556 Tj
+0.300007 -1.100027 Td
+(\023) 0.222 Tj
+-3 TJm
+(\007) 0.556 Tj
+31 TJm
+(\021) 0.278 Tj
+-22 TJm
+(\024) 0.556 Tj
+31 TJm
+(\012) 0.333 Tj
+33 TJm
+(\002) 0.556 Tj
+31 TJm
+(\022) 0.721 Tj
+-28 TJm
+(\010) 0.5 Tj
+-25 TJm
+(\006) 0.556 Tj
+31 TJm
+(\012) 0.333 Tj
+/DeviceRGB {} CS
+[0 0 0] SC
+65.395 131.844 m
+55.582 123.238 47.281 111.84 52 100 c
+53.711 95.703 56.164 91.617 58.996 87.82 c
+S
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+61.828 89.895 m
+65.66 80.02 l
+56.504 85.348 l
+61.828 89.895 l
+h
+f
+61.828 89.895 m
+65.66 80.02 l
+56.504 85.348 l
+61.828 89.895 l
+h
+S
+/DeviceRGB {} cs
+[0 0 0] sc
+[1 0 0 1 0 0] Tm
+0 0 Td
+[9.999756 0 0 9.999756 52 103.5] Tm
+0 0 Td
+/F5_0 1 Tf
+(\021) 0.278 Tj
+-22 TJm
+(\005) 0.556 Tj
+31 TJm
+(\006) 0.556 Tj
+31 TJm
+(\015) 0.278 Tj
+-22 TJm
+(\021) 0.278 Tj
+-22 TJm
+(\012) 0.333 Tj
+33 TJm
+(\006) 0.556 Tj
+31 TJm
+(\010) 0.5 Tj
+-25 TJm
+(\032) 0.556 Tj
+31 TJm
+(\020) 0.222 Tj
+-3 TJm
+(\015) 0.278 Tj
+-22 TJm
+(\010) 0.5 Tj
+-25 TJm
+(\021) 0.278 Tj
+/DeviceRGB {} CS
+[0 0 0] SC
+99.348 81.715 m
+103.281 90.82 106.211 101.848 104 112 c
+103.375 114.875 102.488 117.801 101.453 120.668 c
+S
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+98.152 119.488 m
+97.508 130.062 l
+104.605 122.199 l
+98.152 119.488 l
+h
+f
+98.152 119.488 m
+97.508 130.062 l
+104.605 122.199 l
+98.152 119.488 l
+h
+S
+/DeviceRGB {} cs
+[0 0 0] sc
+[1 0 0 1 0 0] Tm
+0 0 Td
+[9.999756 0 0 9.999756 104 103.5] Tm
+0 0 Td
+/F5_0 1 Tf
+(\021) 0.278 Tj
+-22 TJm
+(\033) 0.556 Tj
+31 TJm
+(\032) 0.556 Tj
+31 TJm
+(\006) 0.556 Tj
+31 TJm
+(\012) 0.333 Tj
+33 TJm
+(\004) 0.5 Tj
+-25 TJm
+(\021) 0.278 Tj
+/DeviceRGB {} CS
+[0 0 0] SC
+88 381.609 m
+88 370.773 88 356.602 88 344.293 c
+S
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+91.5 344.082 m
+88 334.082 l
+84.5 344.082 l
+91.5 344.082 l
+h
+f
+91.5 344.082 m
+88 334.082 l
+84.5 344.082 l
+91.5 344.082 l
+h
+S
+/DeviceRGB {} cs
+[0 0 0] sc
+[1 0 0 1 0 0] Tm
+0 0 Td
+[9.999756 0 0 9.999756 88 355.5] Tm
+0 0 Td
+/F5_0 1 Tf
+(\021) 0.278 Tj
+-22 TJm
+(\012) 0.333 Tj
+33 TJm
+(\006) 0.556 Tj
+31 TJm
+(\011) 0.556 Tj
+31 TJm
+(\001) 0.556 Tj
+31 TJm
+(\010) 0.5 Tj
+/DeviceRGB {} CS
+[0 0 0] SC
+88 213.609 m
+88 202.773 88 188.602 88 176.293 c
+S
+/DeviceRGB {} cs
+[0 0 0] sc
+/DeviceRGB {} CS
+[0 0 0] SC
+91.5 176.082 m
+88 166.082 l
+84.5 176.082 l
+91.5 176.082 l
+h
+f
+91.5 176.082 m
+88 166.082 l
+84.5 176.082 l
+91.5 176.082 l
+h
+S
+/DeviceRGB {} cs
+[0 0 0] sc
+[1 0 0 1 0 0] Tm
+0 0 Td
+[9.999756 0 0 9.999756 88 187.5] Tm
+0 0 Td
+/F5_0 1 Tf
+(\021) 0.278 Tj
+-22 TJm
+(\012) 0.333 Tj
+33 TJm
+(\006) 0.556 Tj
+31 TJm
+(\011) 0.556 Tj
+31 TJm
+(\001) 0.556 Tj
+31 TJm
+(\010) 0.5 Tj
+Q
+Q
+showpage
+%%PageTrailer
+pdfEndPage
+%%Trailer
+end
+%%DocumentSuppliedResources:
+%%+ font CairoFont-0-0
+%%EOF
diff --git a/doc/extsearch_flow.png b/doc/extsearch_flow.png
new file mode 100644 (file)
index 0000000..e99450c
Binary files /dev/null and b/doc/extsearch_flow.png differ
index 0475aa7..a4308b6 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -19,7 +19,7 @@
 <ol>
 <li><b>How to get information on the index page in HTML?</b>
 <p>
-You should use the \\mainpage command inside a comment block like this:
+You should use the \ref cmdmainpage "\\mainpage" command inside a comment block like this:
 \verbatim
 /*! \mainpage My Personal Index Page
  *
@@ -41,9 +41,9 @@ You should use the \\mainpage command inside a comment block like this:
   Check the following:
   <ol>
   <li>Is your class / file / namespace documented? If not, it will not 
-      be extracted from the sources unless \c EXTRACT_ALL is set to \c YES
+      be extracted from the sources unless \ref cfg_extract_all "EXTRACT_ALL" is set to \c YES
       in the config file.
-  <li>Are the members private? If so, you must set \c EXTRACT_PRIVATE to \c YES
+  <li>Are the members private? If so, you must set \ref cfg_extract_private "EXTRACT_PRIVATE" to \c YES
       to make them appear in the documentation.
   <li>Is there a function macro in your class that does not end with a 
       semicolon (e.g. MY_MACRO())? If so then you have to instruct 
@@ -67,12 +67,12 @@ PREDEFINED             = MY_MACRO()=
 
 In order for global functions, variables, enums, typedefs, and defines 
 to be documented you should document the file in which these commands are
-located using a comment block containing a \\file (or \@file
+located using a comment block containing a \ref cmdfile "\\file" (or \ref cmdfile "\@file"
 command. 
 
 Alternatively, you can put all members in a group (or module)
-using the \\ingroup command and then document the group using a comment
-block containing the \\defgroup command.
+using the \ref cmdingroup "\\ingroup" command and then document the group using a comment
+block containing the \ref cmddefgroup "\\defgroup" command.
 
 For member functions or functions that are part of a namespace you should
 document either the class or namespace.
@@ -98,12 +98,13 @@ around the blocks that should be hidden and put:
   PREDEFINED = DOXYGEN_SHOULD_SKIP_THIS
 \endverbatim
 in the config file then all blocks should be skipped by Doxygen as long
-as <code>PREPROCESSING = YES</code>.
+as \ref cfg_enable_preprocessing "ENABLE_PREPROCESSING" is set to `YES`.
 
-<li><b>How can I change what is after the <code>\#include</code> in the class documentation?</b>
+<li><b>How can I change what is after the <code>\#include</code> 
+in the class documentation?</b>
 
-In most cases you can use STRIP_FROM_INC_PATH to strip a user defined
-part of a path.
+In most cases you can use \ref cfg_strip_from_inc_path "STRIP_FROM_INC_PATH" 
+to strip a user defined part of a path.
 
 You can also document your class as follows
 
@@ -160,9 +161,9 @@ installdox -lb.tag@b.chm::
 
 <li><b>I don't like the quick index that is put above each HTML page, what do I do?</b>
 
-You can disable the index by setting DISABLE_INDEX to YES. Then you can
+You can disable the index by setting \ref cfg_disable_index "DISABLE_INDEX" to `YES`. Then you can
 put in your own header file by writing your own header and feed that to
-HTML_HEADER.
+\ref cfg_html_header "HTML_HEADER".
 
 <li><b>The overall HTML output looks different, while I only wanted to 
        use my own html header file</b>
@@ -237,8 +238,8 @@ various buffers and then run "texconfig init".
 
 <li><b>Why are dependencies via STL classes not shown in the dot graphs?</b>
 
-Doxygen is unaware of the STL classes, unless the option BUILTIN_STL_SUPPORT is
-turned on.
+Doxygen is unaware of the STL classes, unless the 
+option \ref cfg_builtin_stl_support "BUILTIN_STL_SUPPORT" is turned on.
 
 <li><b>I have problems getting the search engine to work with PHP5 and/or windows</b>
 
@@ -248,7 +249,7 @@ Please read <a href="searchengine.html">this</a> for hints on where to look.
 
 Not via command line options, but doxygen can read from <code>stdin</code>,
 so you can pipe things through it. Here's an example how to override an option
-in a configuration file from the command line (assuming a UNIX environment):
+in a configuration file from the command line (assuming a UNIX like environment):
 
 \verbatim
 ( cat Doxyfile ; echo "PROJECT_NUMBER=1.0" ) | doxygen -
@@ -273,16 +274,17 @@ documentation -> docs -> dox
 generator -> gen
 \endverbatim
 
-At the time I was looking into lex and yacc, where a lot of things start with
+At the time I was looking into \c lex and \c yacc, where a lot of things start with
 "yy", so the "y" slipped in and made things pronounceable 
 (the proper pronouncement is Docs-ee-gen, so with a long "e").
 
 <li><b>What was the reason to develop doxygen?</b>
 
 I once wrote a GUI widget based on the Qt library (it is still available at
-http://qdbttabular.sourceforge.net/ and maintained by Sven Meyer). 
+http://sourceforge.net/projects/qdbttabular/ but hasn't been updated since 2002). 
 Qt had nicely generated documentation (using an internal tool which 
-they didn't want to release) and I wrote similar docs by hand. 
+<a href="http://rant.gulbrandsen.priv.no/udoc/history">they didn't want to release</a>) 
+and I wrote similar docs by hand. 
 This was a nightmare to maintain, so I wanted a similar tool. I looked at
 Doc++ but that just wasn't good enough (it didn't support signals and
 slots and did not have the Qt look and feel I had grown to like), 
index 46a6219..87ca4bc 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
 Although doxygen can now be used in any project written in a language that is 
 supported by doxygen, initially it was specifically designed to be used for projects 
 that make use of Qt Software's 
-<A HREF="http://www.trolltech.com/products/qt.html">Qt toolkit</A>. I have tried to 
+<A HREF="http://qt-project.org/">Qt toolkit</A>. I have tried to 
 make doxygen `Qt-compatible'. That is: Doxygen can read the documentation contained in 
 the Qt source code and create a class browser that looks quite similar to the 
 one that is generated by Qt Software. Doxygen understands the C++ extensions 
@@ -113,4 +113,10 @@ members or classes belonging to the Qt toolkit, a link will be generated to
 the Qt documentation. This is done independent of where this documentation 
 is located! 
 
+
+\htmlonly
+Go to the <a href="doxygen_usage.html">next</a> section or return to the
+ <a href="index.html">index</a>.
+\endhtmlonly
+
 */
index bc23a11..ddae9ef 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 56f19f7..d7f6275 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -199,11 +199,6 @@ Here Group1 is displayed as a subsection of the "Public Members". And
 Group2 is a separate section because it contains members with
 different protection levels (i.e. public and protected).
 
-\htmlonly
-Go to the <a href="formulas.html">next</a> section or return to the
- <a href="index.html">index</a>.
-\endhtmlonly
-
 \section subpaging Subpaging
 
 Information can be grouped into pages using the \ref cmdpage "\\page" and
index db3c6f3..6fe96fe 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -20,7 +20,7 @@ Here is a list of all HTML commands that may be used inside the
 documentation. Note that although these HTML tags are translated to the
 proper commands for output formats other than HTML, all attributes 
 of a HTML tag are passed on to the HTML output only 
-(the HREF and NAME attributes for the A tag are the only exception).
+(the \c HREF and \c NAME attributes for the \c A tag are the only exception).
 
 <ul>
 <li><tt>\<A HREF="..."\></tt> Starts a hyperlink 
@@ -40,10 +40,10 @@ of a HTML tag are passed on to the HTML output only
 <li><tt>\<CAPTION\></tt> Starts a caption. Use within a table only.
 <li><tt>\</CAPTION\></tt> Ends a caption. Use within a table only.
 <li><tt>\<CODE\></tt>  Starts a piece of text displayed in a typewriter font.
-                       Note that for C# code, this command is equivalent to 
-                       \ref cmdcode "\\code".
+                       Note that only for C# code, this command is equivalent to 
+                       \ref cmdcode "\\code". 
 <li><tt>\</CODE\></tt> Ends a <tt>\<CODE\></tt> section.
-                       Note that for C# code, this command is equivalent to
+                       Note that only for C# code, this command is equivalent to
                        \ref cmdendcode "\\endcode".
 <li><tt>\<DD\></tt>    Starts an item description.
 <li><tt>\<DFN\></tt>   Starts a piece of text displayed in a typewriter font.
@@ -89,7 +89,7 @@ of a HTML tag are passed on to the HTML output only
 <li><tt>\<SUB\></tt>   Starts a piece of text displayed in subscript.
 <li><tt>\</SUB\></tt>  Ends a <tt>\<SUB\></tt> section.
 <li><tt>\<SUP\></tt>   Starts a piece of text displayed in superscript.
-<li><tt>\</SUP\></tt>  Ends a <tt>\</SUP\></tt> section.
+<li><tt>\</SUP\></tt>  Ends a <tt>\<SUP\></tt> section.
 <li><tt>\<TABLE\></tt> starts a table.
 <li><tt>\</TABLE\></tt> ends a table.
 <li><tt>\<TD\></tt>    Starts a new table data element.
@@ -216,4 +216,11 @@ comments can be used:
 /*! <!-- This is a comment with a comment block --> Visible text */
 \endverbatim
 
+
+\htmlonly
+<br/>
+Go to the <a href="xmlcmds.html">next</a> section or return to the
+ <a href="index.html">index</a>.
+\endhtmlonly
+
 */
index 3b2947d..55dceff 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -14,7 +14,9 @@
  * input used in their production; they are not affected by this license.
  *
  */
-/*! \mainpage Doxygen Manual
+/*! 
+\mainpage 
+<!--Doxygen Manual-->
 \if logo_on
 <center>
 \htmlonly
@@ -25,10 +27,12 @@ Version: $(VERSION)
 \endif
 
 <h2>Introduction</h2>
-Doxygen is a documentation system for C++, C, Java, Objective-C, Python, IDL 
-(Corba and Microsoft flavors), Fortran, VHDL, PHP, C#, and to some extent D.
+Doxygen is the de facto standard tool for generating documentation from
+annotated C++ sources, but it also supports other popular programming 
+languages such as C, Objective-C, C#, PHP, Java, Python, IDL 
+(Corba, Microsoft, and UNO/OpenOffice flavors), Fortran, VHDL, Tcl, and to some extent D.
 
-It can help you in three ways:
+Doxygen can help you in three ways:
 <ol>
 <li> It can generate an on-line documentation browser (in HTML) and/or an 
      off-line reference manual (in \f$\mbox{\LaTeX}\f$) from a set 
@@ -41,20 +45,19 @@ It can help you in three ways:
 <li> You can \ref extract_all "configure" doxygen to extract the code structure 
      from undocumented source files. This is very useful to quickly 
      find your way in large source distributions. 
-     You can also visualize the relations between the various elements 
+     Doxygen can also visualize the relations between the various elements 
      by means of include dependency graphs, inheritance diagrams,
      and collaboration diagrams, which are all generated automatically.
 <li> You can also use doxygen for creating normal documentation (as I did
-     for this manual).
+     for the doxygen user manual and web-site).
 </ol>
 
-Doxygen is developed under <a href="http://www.linux.org">Linux</a>
-and Mac OS X, but is set-up to be highly portable. As a result, it 
-runs on most other Unix flavors as well. Furthermore, executables for 
-Windows are available.
+Doxygen is developed under Mac OS X and Linux, but is set-up to be highly 
+portable. As a result, it runs on most other Unix flavors as well. 
+Furthermore, executables for Windows are available.
 
-\n This manual is divided into three parts, each of which is divided into several 
-sections.
+\n
+This manual is divided into three parts, each of which is divided into several sections.
 
 The first part forms a user manual:
 <ul>
@@ -115,7 +118,7 @@ The third part provides information for developers:
 \addindex license
 \addindex GPL
 
-Copyright &copy; 1997-2012 by 
+Copyright &copy; 1997-2013 by 
 <a href="mailto:dimitri@stack.nl">Dimitri van Heesch</a>.<p>
 
 Permission to use, copy, modify, and distribute this software and its
@@ -153,21 +156,6 @@ list of projects that use doxygen (see {\tt http://www.doxygen.org/projects.html
 If you know other projects, let <a href="mailto:dimitri@stack.nl?subject=New%20project%20using%20Doxygen">me</a> 
 know and I'll add them. 
 
-<h2>Commercial Support</h2>
-
-I'm currently investigating the possibilities of providing
-commercial support for doxygen. The forms of support I'm thinking of
-are: 
-<ul>
-<li>implementing features, 
-<li>fixing bugs, 
-<li>providing priority help in answering questions. 
-</ul>
-To get a better understanding of the feasibility,
-please let <a href="mailto:dimitri@stack.nl?subject=Doxygen%20Commercial%20Support">me</a> know if you 
-have a need for this type (or another type)
-of doxygen related commercial support.
-
 <h2>Future work</h2>
 Although doxygen is successfully used by large number of companies and 
 open source projects already, there is always room for improvement. 
@@ -176,8 +164,8 @@ You can submit enhancement requests in
 <a href="https://bugzilla.gnome.org/buglist.cgi?product=doxygen&bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&bug_severity=enhancement">the bug tracker</a>.
 Make sure the severity of the bug report is set to "enhancement".
 
-<h2>Acknowledgements</h2>
-\addindex acknowledgements
+<h2>Acknowledgments</h2>
+\addindex acknowledgments
 Thanks go to:
 <ul>
 <li>\addindex Doc++
@@ -206,5 +194,10 @@ Thanks go to:
     providing hours of great music to listen to while coding.
 <li>many, many others for suggestions, patches and bug reports.
 </ul>
+
+\htmlonly
+Go to the <a href="install.html">next</a> section.
+\endhtmlonly
+
 */
 
index 4622065..4eb0308 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -29,16 +29,16 @@ If you downloaded the source distribution, you need at least the
 following to build the executable:
 <ul>
 <li>The <a href="ftp://prep.ai.mit.edu/pub/gnu/">GNU</a> tools 
-    flex, bison and GNU make, and strip
+    \c flex, \c bison and <code>GNU make</code>, and \c strip
     \addindex flex
     \addindex bison
     \addindex make
     \addindex strip
-<li>In order to generate a Makefile for your platform, you need 
+<li>In order to generate a \c Makefile for your platform, you need 
     <a href="http://www.perl.com/">perl</a>
     \addindex perl
 <li>The configure script assume the availability of standard UNIX tools such 
-    as sed, date, find, uname, mv, cp, cat, echo, tr, cd, and rm.
+    as <code>sed, date, find, uname, mv, cp, cat, echo, tr, cd</code> and \c rm.
 </ul>
 
 To take full advantage of doxygen's features the following additional
@@ -46,12 +46,12 @@ tools should be installed.
 
 <ul>
 <li>Qt Software's GUI toolkit 
-    <a href="http://qt.nokia.com/">Qt</A>
+    <a href="http://qt-project.org/">Qt</A>
     \addindex Qt
     version 4.3 or higher.
     This is needed to build the GUI front-end doxywizard. 
 <li>A \f$\mbox{\LaTeX}\f$ distribution: for instance
-    <a href="http://www.tug.org/interest.html#free">teTeX 1.0</a>
+    <a href="http://www.tug.org/interest.html#free">TeX Live</a>
     This is needed for generating LaTeX, Postscript, and PDF output.
 <li><a href="http://www.graphviz.org/">
     the Graph visualization toolkit version 1.8.10 or higher</a>
@@ -168,9 +168,9 @@ standard installation procedure that is required for these packages.
 <b>Qt problems</b>
 
 The Qt include files and libraries are not a subdirectory of the
-directory pointed to by QTDIR on some systems
-(for instance on Red Hat 6.0 includes are in /usr/include/qt and
-libs are in /usr/lib).
+directory pointed to by <code>QTDIR</code> on some systems
+(for instance on Red Hat 6.0 includes are in <code>/usr/include/qt</code> and
+libs are in <code>/usr/lib</code>).
   
 The solution: go to the root of the doxygen distribution and do:
 
@@ -181,96 +181,26 @@ The solution: go to the root of the doxygen distribution and do:
     ln -s your-qt-bin-dir-here bin
     export QTDIR=$PWD
 
-If you have a csh-like shell you should use <code>setenv QTDIR \$PWD</code>
+If you have a <code>csh</code>-like shell you should use <code>setenv QTDIR \$PWD</code>
 instead of the <code>export</code> command above.
   
 Now install doxygen as described above.  
 
 <b>Bison problems</b>
 
-Versions 1.31 to 1.34 of bison contain a "bug" that results in a 
+Versions 1.31 to 1.34 of \c bison contain a "bug" that results in a 
 compiler errors like this:
 
-ce_parse.cpp:348: member `class CPPValue yyalloc::yyvs' with 
+<code>ce_parse.cpp:348: member `class CPPValue yyalloc::yyvs' with </code>
 constructor not allowed in union
 
 This problem has been solved in version 1.35 (versions before 1.31 
 will also work).
 
-<b>Latex problems</b>
-
-The file <code>a4wide.sty</code> is not available for all distributions. If
-your distribution does not have it please select another paper type
-in the config file (see the \ref cfg_paper_type "PAPER_TYPE" tag in the 
-config file).
-
-<b>HP-UX \& Digital UNIX problems</b>
-
-If you are compiling for HP-UX with aCC and you get this error:
-
-    /opt/aCC/lbin/ld: Unsatisfied symbols:
-    alloca (code)
-
-then you should (according to Anke Selig) edit <code>ce_parse.cpp</code> 
-and replace
-
-    extern "C" {
-      void *alloca (unsigned int);
-    };
-
-with
-
-    #include <alloca.h>  
-
-If that does not help, try removing <code>ce_parse.cpp</code> and let 
-bison rebuild it (this worked for me).
-
-If you are compiling for Digital UNIX, the same problem can be solved
-(according to Barnard Schmallhof) by replacing the following in 
-ce_parse.cpp:
-   
-\verbatim
-    #else /* not GNU C.  */
-    #if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) \
-        || defined (__sparc) || defined (__sgi)
-    #include <alloca.h>
-\endverbatim
-
-  with
-
-\verbatim
-    #else /* not GNU C.  */
-    #if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) \
-        || defined (__sparc) || defined (__sgi) || defined (__osf__)
-    #include <alloca.h>
-\endverbatim
-
-  Alternatively, one could fix the problem at the bison side.
-  Here is patch for bison.simple (provided by Andre Johansen):
-\verbatim
---- bison.simple~       Tue Nov 18 11:45:53 1997
-+++ bison.simple        Mon Jan 26 15:10:26 1998
-@@ -27,7 +27,7 @@
- #ifdef __GNUC__
- #define alloca __builtin_alloca
- #else /* not GNU C.  */
--#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) \
-     || defined (__sparc) || defined (__sgi)
-+#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) \
-     || defined (__sparc) || defined (__sgi) || defined (__alpha)
- #include <alloca.h>
- #else /* not sparc */
- #if defined (MSDOS) && !defined (__TURBOC__)
-\endverbatim
-
-  The generated scanner.cpp that comes with doxygen is build with this
-  patch applied.  
-
 <b>Sun compiler problems</b>
 
 It appears that doxygen doesn't work properly if it is compiled 
-with Sun's C++ WorkShop Compiler. I cannot verify this myself as I do 
+with Sun's C++ WorkShop Compiler. I cannot verify this myself as I do 
 not have access to a Solaris machine with this compiler. With GNU compiler
 it does work and installing Sun patch 111679-13 has also been reported 
 as a way to fix the problem.
@@ -338,7 +268,7 @@ compile doxygen. Alternatively, you can compile doxygen
 <a href="http://en.wikipedia.org/wiki/Cygwin">Cygwin</a>
 or <a href="http://www.mingw.org/">MinGW</a>.
 
-The next step is to install bison, flex, and tar
+The next step is to install \c bison, \c flex, and \c tar
 (see http://gnuwin32.sourceforge.net/packages.html).
 This packages are needed during the
 compilation process if you use a CVS snapshot of doxygen (the official source releases 
@@ -361,7 +291,7 @@ You can now build the Release or Debug flavor of Doxygen by right-clicking
 the project in the solutions explorer, and selecting Build.
 
 Note that compiling Doxywizard currently requires Qt version 4
-(see http://qt.nokia.com/products/platform/qt-for-windows).
+(see http://qt-project.org/).
 
 Also read the next section for additional tools you may need to install to run
 doxygen with certain features enabled.
@@ -399,7 +329,7 @@ Here is what is required:
 
     The good, tested, and free alternative is the <code>tar</code> utility
     supplied with <a href="http://sourceware.cygnus.com/cygwin/">cygwin
-    tools</a>. Anyway, the cygwin's flex, bison, and sed are also
+    tools</a>. Anyway, the Cygwin's \c flex, \c bison, and \c sed are also
     recommended below.
 
 <li>Microsoft Visual C++ (I only tested with version 6.0).
@@ -412,7 +342,7 @@ Here is what is required:
 <li>Perl 5.0 or higher for Windows. This can be downloaded from:
     http://www.ActiveState.com/Products/ActivePerl/
 
-<li>The GNU tools flex, bison, and sed.
+<li>The GNU tools \c flex, \c bison, and \c sed.
     To get these working on Windows you should install the 
     <a href="http://sources.redhat.com/cygwin/">cygwin tools</a>
     
@@ -446,7 +376,7 @@ Here is what is required:
     of Qt that is needed for to compile doxygen.
     The Windows specific part were also created.
     As a result doxygen (without the wizard) can be compiled on systems 
-    without X11 or (the commerical version of) Qt. 
+    without X11 or (the commercial version of) Qt.
 
 <li>If you used WinZip to extract the tar archive it will (apparently) not 
     create empty folders, so you have to add the folders
@@ -523,12 +453,12 @@ If you want to produce compressed HTML files (see \ref
 cfg_generate_htmlhelp "GENERATE_HTMLHELP") in the config file, then 
 you need the Microsoft HTML help workshop. 
 You can download it from 
-<a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/htmlhelp/html/vsconHH1Start.asp">Microsoft</a>.
+<a href="http://www.microsoft.com/en-us/download/details.aspx?id=21138">Microsoft</a>.
 
 If you want to produce Qt Compressed Help files (see \ref 
 cfg_qhg_location "QHG_LOCATION") in the config file, then 
 you need qhelpgenerator which is part of Qt. 
-You can download Qt from <a href="http://trolltech.com/downloads/">Qt Software Downloads</a>.
+You can download Qt from <a href="http://qt-project.org/downloads">Qt Software Downloads</a>.
 
 In order to generate PDF output or use scientific formulas you will also need to
 install <a href="http://en.wikipedia.org/wiki/LaTeX">LaTeX</a> and 
@@ -536,7 +466,7 @@ install <a href="http://en.wikipedia.org/wiki/LaTeX">LaTeX</a> and
 
 For LaTeX a number of distributions exists. Popular ones that should work with
 doxygen are <a href="http://www.miktex.org">MikTex</a> 
-and <a href="http://www.xemtex.org">XemTex</a>.
+and <a href="http://www.tug.org/protext/">proTeXt</a>.
 
 Ghostscript can be <a href="http://sourceforge.net/projects/ghostscript/">downloaded</a> 
 from Sourceforge.
@@ -601,7 +531,7 @@ features:
     cfg_qhelgenerator_loc "QHG_LOCATION") in the config file,
     then you need qhelpgenerator which is part of Qt. 
     You can download Qt from
-    <a href="http://trolltech.com/downloads/">Qt Software Downloads</a>.
+    <a href="http://qt-project.org/downloads">Qt Software Downloads</a>.
 
 <li><a href="http://www.graphviz.org/">
     the Graph visualization toolkit version 1.8.10</a><br>
@@ -616,16 +546,12 @@ features:
 Doxygen was developed and tested under Linux &amp; MacOSX using the following 
 open-source tools:
 <ul>
-<li>GCC version 3.3.6 (Linux) and 4.0.1 (MacOSX)
-<li>GNU flex version 2.5.33 (Linux) and 2.5.4 (MacOSX)
-<li>GNU bison version 1.75
-<li>GNU make version 3.80
-<li>Perl version 5.8.1
-<li>VIM version 6.2
-<li>Firefox 1.5
-<li>Trolltech's tmake version 1.3 (included in the distribution) 
-<li>teTeX version 2.0.2
-<li>CVS 1.12.12
+<li>GCC version 4.6.3 (Linux) and 4.2.1 (MacOSX)
+<li>GNU flex version 2.5.35 
+<li>GNU bison version 2.5 (Linux) and 2.3 (MacOSX)
+<li>GNU make version 3.81
+<li>Perl version 5.12
+<li>TeX Live 2009 (or later)
 </ul>
 
 \htmlonly
index b0e2ffc..0673fea 100644 (file)
@@ -1,7 +1,7 @@
 /******************************************************************************
  * Do not edit this file. It was generated by the translator.py script. 
  *
- * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -23,15 +23,15 @@ text fragments, generated by doxygen, can be produced in languages other
 than English (the default). The output language is chosen through the
 configuration file (with default name and known as Doxyfile).
 
-Currently (version 1.8.2), 39 languages 
+Currently (version 1.8.3.1), 40 languages 
 are supported (sorted alphabetically):
 Afrikaans, Arabic, Armenian, Brazilian Portuguese, Catalan, Chinese,
 Chinese Traditional, Croatian, Czech, Danish, Dutch, English,
 Esperanto, Finnish, French, German, Greek, Hungarian, Indonesian,
-Italian, Japanese (+En), Korean (+En), Lithuanian, Macedonian,
-Norwegian, Persian, Polish, Portuguese, Romanian, Russian, Serbian,
-SerbianCyrilic, Slovak, Slovene, Spanish, Swedish, Turkish, Ukrainian,
-and Vietnamese..
+Italian, Japanese (+En), Korean (+En), Latvian, Lithuanian,
+Macedonian, Norwegian, Persian, Polish, Portuguese, Romanian, Russian,
+Serbian, SerbianCyrilic, Slovak, Slovene, Spanish, Swedish, Turkish,
+Ukrainian, and Vietnamese..
 
 The table of information related to the supported languages follows.
 It is sorted by language alphabetically.  The <b>Status</b> column
@@ -104,7 +104,7 @@ when the translator was updated.
     <td>Czech</td>
     <td>Petr Přikryl</td>
     <td>prikryl at atlas dot cz</td>
-    <td>up-to-date</td>
+    <td>1.8.04</td>
   </tr>
   <tr bgcolor="#ffffff">
     <td>Danish</td>
@@ -116,7 +116,7 @@ when the translator was updated.
     <td>Dutch</td>
     <td>Dimitri van Heesch</td>
     <td>dimitri at stack dot nl</td>
-    <td>up-to-date</td>
+    <td>1.8.04</td>
   </tr>
   <tr bgcolor="#ffffff">
     <td>English</td>
@@ -128,7 +128,7 @@ when the translator was updated.
     <td>Esperanto</td>
     <td>Ander Martínez</td>
     <td>ander dot basaundi at gmail dot com</td>
-    <td>up-to-date</td>
+    <td>1.8.04</td>
   </tr>
   <tr bgcolor="#ffffff">
     <td>Finnish</td>
@@ -146,13 +146,13 @@ when the translator was updated.
     <td>German</td>
     <td>Peter Grotrian<br/>Jens Seidel</td>
     <td>Peter dot Grotrian at pdv-FS dot de<br/>jensseidel at users dot sf dot net</td>
-    <td>up-to-date</td>
+    <td>1.8.04</td>
   </tr>
   <tr bgcolor="#ffffff">
     <td>Greek</td>
     <td>Paul Gessos</td>
     <td>gessos dot paul at yahoo dot gr</td>
-    <td>up-to-date</td>
+    <td>1.8.04</td>
   </tr>
   <tr bgcolor="#ffffff">
     <td>Hungarian</td>
@@ -188,7 +188,7 @@ when the translator was updated.
     <td>Korean</td>
     <td>Kim Taedong<br/>SooYoung Jung<br/>Richard Kim</td>
     <td>fly1004 at gmail dot com<br/>jung5000 at gmail dot com<br/><span style="color: brown">[unreachable]</span></td>
-    <td>1.8.02</td>
+    <td>up-to-date</td>
   </tr>
   <tr bgcolor="#ffffff">
     <td>KoreanEn</td>
@@ -197,6 +197,12 @@ when the translator was updated.
     <td>English based</td>
   </tr>
   <tr bgcolor="#ffffff">
+    <td>Latvian</td>
+    <td>Lauris</td>
+    <td>lauris at nix.lv</td>
+    <td>up-to-date</td>
+  </tr>
+  <tr bgcolor="#ffffff">
     <td>Lithuanian</td>
     <td>Tomas Simonaitis<br/>Mindaugas Radzius<br/>Aidas Berukstis<br/><span style="color: red; background-color: yellow">-- searching for the maintainer --</span></td>
     <td><span style="color: brown">[unreachable]</span><br/><span style="color: brown">[unreachable]</span><br/><span style="color: brown">[unreachable]</span><br/><span style="color: brown">[Please, try to help to find someone.]</span></td>
@@ -236,7 +242,7 @@ when the translator was updated.
     <td>Romanian</td>
     <td>Ionut Dumitrascu<br/>Alexandru Iosup</td>
     <td>reddumy at yahoo dot com<br/>aiosup at yahoo dot com</td>
-    <td>1.6.0</td>
+    <td>up-to-date</td>
   </tr>
   <tr bgcolor="#ffffff">
     <td>Russian</td>
@@ -272,7 +278,7 @@ when the translator was updated.
     <td>Spanish</td>
     <td>Bartomeu<br/>Francisco Oltra Thennet<br/>David Vaquero</td>
     <td>bartomeu at loteria3cornella dot com<br/><span style="color: brown">[unreachable]</span><br/>david at grupoikusnet dot com</td>
-    <td>up-to-date</td>
+    <td>1.8.04</td>
   </tr>
   <tr bgcolor="#ffffff">
     <td>Swedish</td>
@@ -288,9 +294,9 @@ when the translator was updated.
   </tr>
   <tr bgcolor="#ffffff">
     <td>Ukrainian</td>
-    <td>Olexij Tkatchenko<br/><span style="color: red; background-color: yellow">-- searching for the maintainer --</span></td>
-    <td><span style="color: brown">[resigned]</span><br/><span style="color: brown">[Please, try to help to find someone.]</span></td>
-    <td>1.4.1</td>
+    <td>Olexij Tkatchenko<br/>Petro  Yermolenko</td>
+    <td><span style="color: brown">[resigned]</span><br/>python at i dot ua</td>
+    <td>1.8.04</td>
   </tr>
   <tr bgcolor="#ffffff">
     <td>Vietnamese</td>
@@ -309,7 +315,7 @@ when the translator was updated.
 \latexonly
 \footnotesize
 \begin{longtable}{|l|l|l|l|}
-  \hline 
+  \hline
   {\bf Language} & {\bf Maintainer} & {\bf Contact address} & {\bf Status} \\
   \hline
 
@@ -335,26 +341,26 @@ when the translator was updated.
   \hline
   Croatian & Boris Bralo & {\tt\tiny boris dot bralo at gmail dot com} & 1.8.2 \\
   \hline
-  Czech & Petr Přikryl & {\tt\tiny prikryl at atlas dot cz} & up-to-date \\
+  Czech & Petr Přikryl & {\tt\tiny prikryl at atlas dot cz} & 1.8.04 \\
   \hline
   Danish & Poul-Erik Hansen & {\tt\tiny pouhan at gnotometrics dot dk} & 1.8.0 \\
   ~ & Erik Søe Sørensen & {\tt\tiny eriksoe+doxygen at daimi dot au dot dk} & ~ \\
   \hline
-  Dutch & Dimitri van Heesch & {\tt\tiny dimitri at stack dot nl} & up-to-date \\
+  Dutch & Dimitri van Heesch & {\tt\tiny dimitri at stack dot nl} & 1.8.04 \\
   \hline
   English & Dimitri van Heesch & {\tt\tiny dimitri at stack dot nl} & up-to-date \\
   \hline
-  Esperanto & Ander Martínez & {\tt\tiny ander dot basaundi at gmail dot com} & up-to-date \\
+  Esperanto & Ander Martínez & {\tt\tiny ander dot basaundi at gmail dot com} & 1.8.04 \\
   \hline
   Finnish & Antti Laine & {\tt\tiny antti dot a dot laine at tut dot fi} & 1.6.0 \\
   \hline
   French & David Martinet & {\tt\tiny contact at e-concept-applications dot fr} & 1.8.0 \\
   ~ & Xavier Outhier & {\tt\tiny xouthier at yahoo dot fr} & ~ \\
   \hline
-  German & Peter Grotrian & {\tt\tiny Peter dot Grotrian at pdv-FS dot de} & up-to-date \\
+  German & Peter Grotrian & {\tt\tiny Peter dot Grotrian at pdv-FS dot de} & 1.8.04 \\
   ~ & Jens Seidel & {\tt\tiny jensseidel at users dot sf dot net} & ~ \\
   \hline
-  Greek & Paul Gessos & {\tt\tiny gessos dot paul at yahoo dot gr} & up-to-date \\
+  Greek & Paul Gessos & {\tt\tiny gessos dot paul at yahoo dot gr} & 1.8.04 \\
   \hline
   Hungarian & Ákos Kiss & {\tt\tiny akiss at users dot sourceforge dot net} & 1.4.6 \\
   ~ & Földvári György & {\tt\tiny [unreachable] foldvari lost at cyberspace} & ~ \\
@@ -371,12 +377,14 @@ when the translator was updated.
   \hline
   JapaneseEn & see the Japanese language & {\tt\tiny ~} & English based \\
   \hline
-  Korean & Kim Taedong & {\tt\tiny fly1004 at gmail dot com} & 1.8.02 \\
+  Korean & Kim Taedong & {\tt\tiny fly1004 at gmail dot com} & up-to-date \\
   ~ & SooYoung Jung & {\tt\tiny jung5000 at gmail dot com} & ~ \\
   ~ & Richard Kim & {\tt\tiny [unreachable] ryk at dspwiz dot com} & ~ \\
   \hline
   KoreanEn & see the Korean language & {\tt\tiny ~} & English based \\
   \hline
+  Latvian & Lauris & {\tt\tiny lauris at nix.lv} & up-to-date \\
+  \hline
   Lithuanian & Tomas Simonaitis & {\tt\tiny [unreachable] haden at homelan dot lt} & 1.4.6 \\
   ~ & Mindaugas Radzius & {\tt\tiny [unreachable] mindaugasradzius at takas dot lt} & ~ \\
   ~ & Aidas Berukstis & {\tt\tiny [unreachable] aidasber at takas dot lt} & ~ \\
@@ -395,7 +403,7 @@ when the translator was updated.
   Portuguese & Rui Godinho Lopes & {\tt\tiny [resigned] rgl at ruilopes dot com} & 1.8.0 \\
   ~ & Fabio "FJTC" Jun Takada Chino & {\tt\tiny jun-chino at uol dot com dot br} & ~ \\
   \hline
-  Romanian & Ionut Dumitrascu & {\tt\tiny reddumy at yahoo dot com} & 1.6.0 \\
+  Romanian & Ionut Dumitrascu & {\tt\tiny reddumy at yahoo dot com} & up-to-date \\
   ~ & Alexandru Iosup & {\tt\tiny aiosup at yahoo dot com} & ~ \\
   \hline
   Russian & Alexandr Chelpanov & {\tt\tiny cav at cryptopro dot ru} & 1.7.5 \\
@@ -409,7 +417,7 @@ when the translator was updated.
   \hline
   Slovene & Matjaž Ostroveršnik & {\tt\tiny matjaz dot ostroversnik at ostri dot org} & 1.4.6 \\
   \hline
-  Spanish & Bartomeu & {\tt\tiny bartomeu at loteria3cornella dot com} & up-to-date \\
+  Spanish & Bartomeu & {\tt\tiny bartomeu at loteria3cornella dot com} & 1.8.04 \\
   ~ & Francisco Oltra Thennet & {\tt\tiny [unreachable] foltra at puc dot cl} & ~ \\
   ~ & David Vaquero & {\tt\tiny david at grupoikusnet dot com} & ~ \\
   \hline
@@ -417,8 +425,8 @@ when the translator was updated.
   \hline
   Turkish & Emin Ilker Cetinbas & {\tt\tiny niw3 at yahoo dot com} & 1.7.5 \\
   \hline
-  Ukrainian & Olexij Tkatchenko & {\tt\tiny [resigned] olexij at tkatchenko dot com} & 1.4.1 \\
-  ~ & -- searching for the maintainer -- & {\tt\tiny [Please, try to help to find someone.]} & ~ \\
+  Ukrainian & Olexij Tkatchenko & {\tt\tiny [resigned] olexij at tkatchenko dot com} & 1.8.04 \\
+  ~ & Petro  Yermolenko & {\tt\tiny python at i dot ua} & ~ \\
   \hline
   Vietnamese & Dang Minh Tuan & {\tt\tiny tuanvietkey at gmail dot com} & 1.6.0 \\
   \hline
@@ -643,8 +651,8 @@ for the supported languages, the \c translator.py Python
 script was developed (located in \c doxygen/doc directory). 
 It extracts the important information about obsolete and
 new methods from the source files for each of the languages.  
-The information is stored in the <em>translator report</em> ASCII file
-(translator_report.txt). 
+The information is stored in the translator report ASCII file
+(\c translator_report.txt). 
 
 \htmlonly If you compiled this documentation
 from sources and if you have also doxygen sources available the
@@ -743,5 +751,10 @@ used if possible.  On the other hand, implementation of adapters for
 really obsolete translators brings too much maintenance and
 run-time overhead.
 
+\htmlonly
+Go to the <a href="perlmod.html">next</a> section or return to the
+ <a href="index.html">index</a>.
+\endhtmlonly
+
 */
 
index cba8b8a..661e67b 100644 (file)
@@ -5,7 +5,7 @@ change the language.doc, make the changes here and inside maintainers.txt.
 /******************************************************************************
  * %(editnote)s 
  *
- * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -254,8 +254,8 @@ for the supported languages, the \c translator.py Python
 script was developed (located in \c doxygen/doc directory). 
 It extracts the important information about obsolete and
 new methods from the source files for each of the languages.  
-The information is stored in the <em>translator report</em> ASCII file
-(%(translatorReportFileName)s). 
+The information is stored in the translator report ASCII file
+(\c %(translatorReportFileName)s). 
 
 \htmlonly If you compiled this documentation
 from sources and if you have also doxygen sources available the
@@ -353,5 +353,10 @@ used if possible.  On the other hand, implementation of adapters for
 really obsolete translators brings too much maintenance and
 run-time overhead.
 
+\htmlonly
+Go to the <a href="perlmod.html">next</a> section or return to the
+ <a href="index.html">index</a>.
+\endhtmlonly
+
 */
 
index 1eade70..306b123 100644 (file)
@@ -96,6 +96,9 @@ Kim Taedong: fly1004 at gmail dot com
 SooYoung Jung: jung5000 at gmail dot com
 Richard Kim: [unreachable] ryk at dspwiz dot com
 
+TranslatorLatvian
+Lauris: lauris at nix.lv
+
 TranslatorLithuanian
 Tomas Simonaitis: [unreachable] haden at homelan dot lt
 Mindaugas Radzius: [unreachable] mindaugasradzius at takas dot lt
@@ -154,7 +157,7 @@ Emin Ilker Cetinbas: niw3 at yahoo dot com
 
 TranslatorUkrainian
 Olexij Tkatchenko: [resigned] olexij at tkatchenko dot com
--- searching for the maintainer --: [Please, try to help to find someone.]
+Petro  Yermolenko: python at i dot ua
 
 TranslatorVietnamese
 Dang Minh Tuan: tuanvietkey at gmail dot com
index 3799fbc..b32cca4 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -520,7 +520,7 @@ stars, so the following will appear as-is:
 
     a_nice_identifier
 
-Futhermore, a `*` or `_` only starts an emphasis if
+Furthermore, a `*` or `_` only starts an emphasis if
 - it is followed by an alphanumberical character, and
 - it is preceded by a space, newline, or one the following characters `<{([,:;`
 
index d34e057..face02a 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
 The following output formats are \e directly supported by doxygen:
 <dl>
 <dt><b>HTML</b>
-<dd>Generated if \c GENERATE_HTML is set to \c YES in the configuration file.
+<dd>Generated if \ref cfg_generate_html "GENERATE_HTML" is set to \c YES in the configuration file.
 <dt>\f$\mbox{\LaTeX}\f$
-<dd>Generated if \c GENERATE_LATEX is set to \c YES in the configuration file.
+<dd>Generated if \ref cfg_generate_latex "GENERATE_LATEX" is set to \c YES in the configuration file.
 <dt><b>Man pages</b>
-<dd>Generated if \c GENERATE_MAN is set to \c YES in the configuration file.
+<dd>Generated if \ref cfg_generate_man "GENERATE_MAN" is set to \c YES in the configuration file.
 <dt><b>RTF</b>
-<dd>Generated if \c GENERATE_RTF is set to \c YES in the configuration file.<p>
+<dd>Generated if \ref cfg_generate_rtf "GENERATE_RTF" is set to \c YES in the configuration file.<p>
     Note that the RTF output probably only looks nice with Microsoft's 
     Word. If you have success with other programs, please let me know.
 <dt><b>XML</b>
-<dd>Generated if \c GENERATE_XML is set to \c YES in the configuration file.<p>
+<dd>Generated if \ref cfg_generate_xml "GENERATE_XML" is set to \c YES in the configuration file.<p>
+<dt><b>Docbook</b>
+<dd>Generated if \ref cfg_generate_docbook "GENERATE_DOCBOOOK" is set to \c YES in the configuration file.<p>
 </dl>
 
 The following output formats are \e indirectly supported by doxygen:
 <dl>
 <dt><b>Compiled HTML Help</b> (a.k.a. Windows 98 help)
 <dd>Generated by Microsoft's HTML Help workshop from the HTML output if 
-    \c GENERATE_HTMLHELP is set to \c YES.
+    \ref cfg_generate_htmlhelp "GENERATE_HTMLHELP" is set to \c YES.
 <dt><b>Qt Compressed Help (.qch)</b>
 <dd>Generated by Qt's qhelpgenerator tool from the HTML output if 
-    \c GENERATE_QHP is set to \c YES.
+    \ref cfg_generate_qhp "GENERATE_QHP" is set to \c YES.
 <dt><b>Eclipse Help</b>
 <dd>Generated from HTML with a special index file that is generated when
-    \c GENERATE_ECLIPSEHELP is set to \c YES.
+    \ref cfg_generate_eclipsehelp "GENERATE_ECLIPSEHELP" is set to \c YES.
 <dt><b>XCode DocSets</b>
 <dd>Compiled from HTML with a special index file that is generated when
-    \c GENERATE_DOCSET is set to \c YES.
+    \ref cfg_generate_docset "GENERATE_DOCSET" is set to \c YES.
 <dt><b>PostScript</b>
 <dd>Generated from the \f$\mbox{\LaTeX}\f$ output by 
     running <code>make ps</code> in the output directory.
-    For the best results \c PDF_HYPERLINKS should be set to \c NO.
+    For the best results \ref cfg_pdf_hyperlinks "PDF_HYPERLINKS" should be set to \c NO.
 <dt><b>PDF</b>\htmlonly &nbsp;&nbsp;&nbsp;\endhtmlonly
 <dd>Generated from the \f$\mbox{\LaTeX}\f$ output by
     running <code>make pdf</code> in the output directory.
@@ -61,4 +63,10 @@ The following output formats are \e indirectly supported by doxygen:
     \ref cfg_pdf_hyperlinks "PDF_HYPERLINKS".
 </dl>
 
+
+\htmlonly
+Go to the <a href="searching.html">next</a> section or return to the
+ <a href="index.html">index</a>.
+\endhtmlonly
+
 */
index b375e15..6a04434 100644 (file)
@@ -23,27 +23,27 @@ doxygen-develop mailing list.  Suggestions are welcome as well.
 
 \section using_perlmod_fmt Usage
 
-<p>When the <b>GENERATE_PERLMOD</b> tag is enabled in the Doxyfile, 
-running Doxygen generates a number of files in the <b>perlmod/</b> 
+<p>When the \ref cfg_generate_perlmod "GENERATE_PERLMOD" tag is enabled in the Doxyfile, 
+running Doxygen generates a number of files in the `perlmod/` 
 subdirectory of your output directory.  These files are the following:
 
 <ul>
 
-<li><b>DoxyDocs.pm</b>.  This is the Perl module that actually
+<li>`DoxyDocs.pm`:  This is the Perl module that actually
 contains the documentation, in the Perl Module format described 
 \ref doxydocs_format "below".
 
-<li><b>DoxyModel.pm</b>.  This Perl module describes the structure of
-<b>DoxyDocs.pm</b>, independently of the actual documentation.  See 
+<li>`DoxyModel.pm`:  This Perl module describes the structure of
+`DoxyDocs.pm`, independently of the actual documentation.  See 
 \ref doxymodel_format "below" for details.
 
-<li><b>doxyrules.make</b>.  This file contains the make rules to build 
+<li>`doxyrules.make`:  This file contains the make rules to build 
 and clean the files that are generated from the Doxyfile.  Also 
 contains the paths to those files and other relevant information. This 
 file is intended to be included by your own Makefile.
 
-<li><b>Makefile</b>.  This is a simple Makefile including 
-<b>doxyrules.make</b>.
+<li>`Makefile`:  This is a simple Makefile including 
+`doxyrules.make`.
 
 </ul>
 
@@ -65,70 +65,71 @@ within files and classes and can be customized quite a lot by
 redefining TeX macros.  However, there is still no documentation on
 how to do this.
 
-<p>Setting the <b>PERLMOD_LATEX</b> tag to <b>YES</b> in the Doxyfil
-enables the creation of some additional files in the <b>perlmod/</b> 
+<p>Setting the \ref cfg_perlmod_latex "PERLMOD_LATEX" tag to \c YES in th
+\c Doxyfile enables the creation of some additional files in the `perlmod/` 
 subdirectory of your output directory.  These files contain the Perl 
 scripts and LaTeX code necessary to generate PDF and DVI output from 
-the Perl Module output, using PDFLaTeX and LaTeX respectively.  Rules 
+the Perl Module output, using `pdflatex` and `latex` respectively.  Rules 
 to automate the use of these files are also added to 
-<b>doxyrules.make</b> and the <b>Makefile</b>.
+`doxyrules.make` and the `Makefile`.
 
 <p>The additional generated files are the following:
 
 <ul>
 
-<li><b>doxylatex.pl</b>.  This Perl script uses DoxyDocs.pm and 
-DoxyModel.pm to generate <b>doxydocs.tex</b>, a TeX file containing 
+<li>`doxylatex.pl`: This Perl script uses `DoxyDocs.pm` and 
+DoxyModel.pm to generate `doxydocs.tex`, a TeX file containing 
 the documentation in a format that can be accessed by LaTeX code. This 
 file is not directly LaTeXable.
 
-<li><b>doxyformat.tex</b>.  This file contains the LaTeX code that 
+<li>`doxyformat.tex`: This file contains the \f$\mbox{\LaTeX}\f$ code that 
 transforms the documentation from doxydocs.tex into LaTeX text 
-suitable to be LaTeX'ed and presented to the user.
+suitable to be \f$\mbox{\LaTeX}\f$'ed and presented to the user.
 
-<li><b>doxylatex-template.pl</b>.  This Perl script uses DoxyModel.pm 
-to generate <b>doxytemplate.tex</b>, a TeX file defining default 
+<li>`doxylatex-template.pl`:  This Perl script uses `DoxyModel.pm` 
+to generate `doxytemplate.tex`, a \f$\mbox{\TeX}\f$ file defining default 
 values for some macros.  doxytemplate.tex is included by 
 doxyformat.tex to avoid the need of explicitly defining some macros.
 
-<li><b>doxylatex.tex</b>.  This is a very simple LaTeX document that 
+<li>`doxylatex.tex`:  This is a very simple \f$\mbox{\LaTeX}\f$ document that 
 loads some packages and includes doxyformat.tex and doxydocs.tex. This 
-document is LaTeX'ed to produce the PDF and DVI documentation by the 
-rules added to <b>doxyrules.make</b>.
+document is \f$\mbox{\LaTeX}\f$'ed to produce the PDF and DVI documentation by the 
+rules added to `doxyrules.make`.
 
 </ul>
 
 \subsection pm_pdf_gen Creation of PDF and DVI output 
 
 <p>To try this you need to have installed LaTeX, PDFLaTeX and the 
-packages used by <b>doxylatex.tex</b>.
+packages used by `doxylatex.tex`.
 
 <ol>
 
-<li>Update your Doxyfile to the latest version using:
+<li>Update your `Doxyfile` to the latest version using:
 
 <pre>doxygen -u Doxyfile</pre>
 
-<li>Set both <b>GENERATE_PERLMOD</b> and <b>PERLMOD_LATEX</b> tags to 
-YES in your Doxyfile.
+<li>Set both \ref cfg_generate_perlmod "GENERATE_PERLMOD" and 
+\ref cfg_perlmod_latex "PERLMOD_LATEX" tags to 
+\c YES in your Doxyfile.
 
 <li>Run Doxygen on your Doxyfile:
 
 <pre>doxygen Doxyfile</pre>
 
-<li>A <b>perlmod/</b> subdirectory should have appeared in your output 
-directory.  Enter the <b>perlmod/</b> subdirectory and run:
+<li>A `perlmod/` subdirectory should have appeared in your output 
+directory.  Enter the `perlmod/` subdirectory and run:
 
 <pre>make pdf</pre>
 
-<p>This should generate a <b>doxylatex.pdf</b> with the documentation 
+<p>This should generate a `doxylatex.pdf` with the documentation 
 in PDF format.
 
 <li>Run:
 
 <pre>make dvi</pre>
 
-<p>This should generate a <b>doxylatex.dvi</b> with the documentation 
+<p>This should generate a `doxylatex.dvi` with the documentation 
 in DVI format.
 
 </ol>
@@ -136,29 +137,29 @@ in DVI format.
 \section doxydocs_format Documentation format.
 
 <p>The Perl Module documentation generated by Doxygen is stored in 
-<b>DoxyDocs.pm</b>.  This is a very simple Perl module that contains 
-only two statements: an assignment to the variable <b>$doxydocs</b> and 
-the customary <b>1;</b> statement which usually ends Perl modules.  
-The documentation is stored in the variable <b>$doxydocs</b>, which 
-can then be accessed by a Perl script using <b>DoxyDocs.pm</b>.
+`DoxyDocs.pm`.  This is a very simple Perl module that contains 
+only two statements: an assignment to the variable `$doxydocs` and 
+the customary `1;` statement which usually ends Perl modules.  
+The documentation is stored in the variable `$doxydocs`, which 
+can then be accessed by a Perl script using `DoxyDocs.pm`.
 
-<p><b>$doxydocs</b> contains a tree-like structure composed of three 
+<p>`$doxydocs` contains a tree-like structure composed of three 
 types of nodes: strings, hashes and lists.
 
 <ul>
 
-<li><b>Strings</b>.  These are normal Perl strings.  They can be of 
+<li>`Strings`: These are normal Perl strings.  They can be of 
 any length can contain any character.  Their semantics depends on 
 their location within the tree.  This type of node has no children.
 
-<li><b>Hashes</b>.  These are references to anonymous Perl hashes.  A 
+<li>`Hashes`:  These are references to anonymous Perl hashes.  A 
 hash can have multiple fields, each with a different key.  The value 
 of a hash field can be a string, a hash or a list, and its semantics 
 depends on the key of the hash field and the location of the hash 
 within the tree.  The values of the hash fields are the children of 
 the node.
 
-<li><b>Lists</b>.  These are references to anonymous Perl lists.  A 
+<li>`Lists`:  These are references to anonymous Perl lists.  A 
 list has an undefined number of elements, which are the children of 
 the node.  Each element has the same type (string, hash or list) and 
 the same semantics, depending on the location of the list within the 
@@ -166,12 +167,12 @@ tree.
 
 </ul>
 
-<p>As you can see, the documentation contained in <b>$doxydocs</b>
+<p>As you can see, the documentation contained in `$doxydocs`
 does not present any special impediment to be processed by a simple
 Perl script.  
 <!--
 To be able to generate meaningful output using the
-documentation contained in <b>$doxydocs</b> you'll probably need to
+documentation contained in `$doxydocs` you'll probably need to
 know the semantics of the nodes of the documentation tree, which we
 present in \ref perlmod_tree "this page".
 -->
@@ -179,15 +180,21 @@ present in \ref perlmod_tree "this page".
 \section doxymodel_format Data structure
 
 <p>You might be interested in processing the documentation contained
-in <b>DoxyDocs.pm</b> without needing to take into account the
+in `DoxyDocs.pm` without needing to take into account the
 semantics of each node of the documentation tree.  For this purpose,
-Doxygen generates a <b>DoxyModel.pm</b> file which contains a data
+Doxygen generates a `DoxyModel.pm` file which contains a data
 structure describing the type and children of each node in the
 documentation tree.
 
 <p>The rest of this section is to be written yet, but in the meantime
 you can look at the Perl scripts generated by Doxygen (such as
-<b>doxylatex.pl</b> or <b>doxytemplate-latex.pl</b>) to get an idea on
-how to use <b>DoxyModel.pm</b>.
+`doxylatex.pl` or `doxytemplate-latex.pl`) to get an idea on
+how to use `DoxyModel.pm`.
+
+
+\htmlonly
+Go to the <a href="perlmod_tree.html">next</a> section or return to the
+ <a href="index.html">index</a>.
+\endhtmlonly
 
 */
index be71315..a936320 100644 (file)
@@ -374,4 +374,10 @@ The meaning of each node in the documentation tree is as follows:
 </ul>
 </ul>
 
+
+\htmlonly
+Go to the <a href="arch.html">next</a> section or return to the
+ <a href="index.html">index</a>.
+\endhtmlonly
+
 */
index db5418f..f480780 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -96,6 +96,15 @@ PREDEFINED             = __declspec(x)=
 This will make sure the __declspec(dllexport) is removed before doxygen
 parses the source code.
 
+Similar settings can be used for removing __attribute__ expressions from the input:
+
+\verbatim  
+ENABLE_PREPROCESSING   = YES
+MACRO_EXPANSION        = YES
+EXPAND_ONLY_PREDEF     = YES
+PREDEFINED             = __attribute__(x)=
+\endverbatim
+
 For a more complex example, suppose you have the following obfuscated 
 code fragment of an abstract base class called \c IUnknown:
 
@@ -256,7 +265,7 @@ preprocessing has been done (Hint: set <code>QUIET = YES</code> and
 output).
 
 \htmlonly
-Go to the <a href="external.html">next</a> section or return to the
+Go to the <a href="autolink.html">next</a> section or return to the
  <a href="index.html">index</a>.
 \endhtmlonly
 
index f80e9f6..55b23dc 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -59,7 +59,7 @@ has its own advantages and disadvantages:
    Advantages over the client side search engine are that it provides full
    text search and it scales well to medium side projects.
 
-   Disadvantages are that it does not work locally (i.e. using a file:// URL)
+   Disadvantages are that it does not work locally (i.e. using a "file://" URL)
    and that it does not provide live search capabilities.
 
    @note In the future this option will probably be replaced by the next 
@@ -80,7 +80,7 @@ has its own advantages and disadvantages:
    \ref cfg_server_based_search "SERVER_BASED_SEARCH" and
    \ref cfg_external_search "EXTERNAL_SEARCH" all to \c YES.
 
-   See \ref extsearch for configuration details.
+   See \subpage extsearch for configuration details.
 
    Advantages over option 2 are that this method (potentially) scales to 
    very large projects. It is also possible to combine multiple doxygen 
@@ -126,7 +126,7 @@ has its own advantages and disadvantages:
    options you may want to set. After doxygen has finished you will find
    a Makefile in the HTML output directory. Running "make install" on this
    Makefile will compile and install the doc set.
-   See <a href="http://developer.apple.com/tools/creatingdocsetswithdoxygen.html">this 
+   See <a href="https://developer.apple.com/library/mac/#featuredarticles/DoxygenXcode/_index.html">this 
    article</a> for more info.
 
    Advantage of this method is that it nicely integrates with the Xcode
@@ -139,15 +139,15 @@ has its own advantages and disadvantages:
 <h2>6. Qt Compressed Help</h2> 
    If you develop for or want to install the Qt application framework,
    you will get an application 
-   called <a href="http://doc.trolltech.com/4.6/assistant-manual.html">Qt assistant</a>. 
-   This is a help viewer for Qt Compressed Help files (.qch).
+   called <a href="http://qt-project.org/doc/qt-4.8/assistant-manual.html">Qt assistant</a>. 
+   This is a help viewer for Qt Compressed Help files (<code>.qch</code>).
 
    To enable this feature set \ref cfg_generate_qhp "GENERATE_QHP" to \c YES.
    You also need to fill in the other Qt help related options, such as
    \ref cfg_qhp_namespace "QHP_NAMESPACE", 
    \ref cfg_qhg_location "QHG_LOCATION", 
    \ref cfg_qhp_virtual_folder "QHP_VIRTUAL_FOLDER".
-   See <a href="http://doc.trolltech.com/qq/qq28-qthelp.html#htmlfilesandhelpprojects">this article</a> 
+   See <a href="http://doc.qt.digia.com/qq/qq28-qthelp.html#htmlfilesandhelpprojects">this article</a> 
    for more info.
 
    Feature wise the Qt compressed help feature is comparable with the CHM 
@@ -185,4 +185,9 @@ has its own advantages and disadvantages:
    Qt compressed help or CHM output, but it does require that Eclipse is
    installed and running.
 
+\htmlonly
+Go to the <a href="customize.html">next</a> section or return to the
+ <a href="index.html">index</a>.
+\endhtmlonly
+
 */
index 4e5481e..a84be00 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -163,10 +163,10 @@ doxygen <config-file>
 \endverbatim
 
 Depending on your settings doxygen will create \c html, \c rtf, 
-\c latex, \c xml and/or \c man directories inside the output directory. 
+\c latex, \c xml, \c man, and/or docbook directories inside the output directory. 
 As the names suggest these directories contain the
-generated documentation in HTML, RTF, \f$\mbox{\LaTeX}\f$, XML and 
-Unix-Man page format.
+generated documentation in HTML, RTF, \f$\mbox{\LaTeX}\f$, XML,
+Unix-Man page, and DocBook format.
 
 The default output directory is the directory in which \c doxygen
 is started. The root directory to which the output is written can be changed 
@@ -174,7 +174,7 @@ using the \ref cfg_output_directory "OUTPUT_DIRECTORY". The format specific
 directory within the output directory can be selected using the
 \ref cfg_html_output "HTML_OUTPUT", \ref cfg_rtf_output "RTF_OUTPUT",
 \ref cfg_latex_output "LATEX_OUTPUT", \ref cfg_xml_output "XML_OUTPUT",
-and \ref cfg_man_output "MAN_OUTPUT" 
+\ref cfg_man_output "MAN_OUTPUT", and \ref cfg_docbook_output "DOCBOOK_OUTPUT".
 tags of the configuration file. If the output directory does not exist, 
 \c doxygen will try to create it for you (but it will \e not try to create
 a whole path recursively, like <code>mkdir -p</code> does). 
@@ -250,12 +250,19 @@ the XML output produced by doxygen in an incremental way
 (see `addon/doxmlparser/include/doxmlintf.h` for the interface of the library)
 
 \subsection man_out Man page output
+\addindex man
 The generated man pages can be viewed using the \c man program. You do need
 to make sure the man directory is in the man path (see the \c MANPATH
 environment variable). Note that there are some limitations to the 
 capabilities of the man page format, so some information 
 (like class diagrams, cross references and formulas) will be lost.
 
+\subsection docbook_out DocBook output
+\addindex docbook
+Doxygen can also generate output in the 
+<a href="http://www.docbook.org/">DocBook</a> format. How to process the
+DocBook output is beyond the scope of this manual.
+
 \section step3 Step 3: Documenting the sources
 
 Although documenting the sources is presented as step 3, in a new project 
index 5a78ee2..3550fc7 100644 (file)
@@ -4,25 +4,25 @@
   related to internationalization (the translator classes). It uses the
   information to generate documentation (language.doc,
   translator_report.txt) from templates (language.tpl, maintainers.txt).
-  
+
   Simply run the script without parameters to get the reports and
   documentation for all supported languages. If you want to generate the
   translator report only for some languages, pass their codes as arguments
   to the script. In that case, the language.doc will not be generated.
   Example:
-  
+
     python translator.py en nl cz
-  
+
   Originally, the script was written in Perl and was known as translator.pl.
   The last Perl version was dated 2002/05/21 (plus some later corrections)
 
   $Id$
-  
+
                                          Petr Prikryl (prikrylp@skil.cz)
-                               
+
   History:
   --------
-  2002/05/21 - This was the last Perl version. 
+  2002/05/21 - This was the last Perl version.
   2003/05/16 - List of language marks can be passed as arguments.
   2004/01/24 - Total reimplementation started: classes TrManager, and Transl.
   2004/02/05 - First version that produces translator report. No language.doc yet.
@@ -46,7 +46,7 @@
   2004/10/04 - Reporting of not called translator methods added.
   2004/10/05 - Modified to check only doxygen/src sources for the previous report.
   2005/02/28 - Slight modification to generate "mailto.txt" auxiliary file.
-  2005/08/15 - Doxygen's root directory determined primarily from DOXYGEN 
+  2005/08/15 - Doxygen's root directory determined primarily from DOXYGEN
                environment variable. When not found, then relatively to the script.
   2007/03/20 - The "translate me!" searched in comments and reported if found.
   2008/06/09 - Warning when the MAX_DOT_GRAPH_HEIGHT is still part of trLegendDocs().
@@ -62,7 +62,8 @@
   2010/08/30 - Highlighting in what will be the table in langhowto.html modified.
   2010/09/27 - The underscore in \latexonly part of the generated language.doc
                was prefixed by backslash (was LaTeX related error).
-  """                               
+  2013/02/19 - Better diagnostics when translator_xx.h is too crippled.
+  """
 
 from __future__ import generators
 import codecs
@@ -73,16 +74,16 @@ import sys
 
 def fill(s):
     """Returns string formated to the wrapped paragraph multiline string.
-    
+
     Replaces whitespaces by one space and then uses he textwrap.fill()."""
-    
+
     # Replace all whitespace by spaces, remove whitespaces that are not
-    # necessary, strip the left and right whitespaces, and break the string 
+    # necessary, strip the left and right whitespaces, and break the string
     # to list of words.
     rexWS = re.compile(r'\s+')
     lst = rexWS.sub(' ', s).strip().split()
-    
-    # If the list is not empty, put the words together and form the lines 
+
+    # If the list is not empty, put the words together and form the lines
     # of maximum 70 characters. Build the list of lines.
     lines = []
     if lst:
@@ -96,17 +97,17 @@ def fill(s):
         lines.append(line)          # the last line
     return '\n'.join(lines)
 
-    
+
 # The following function dedent() is the verbatim copy from the textwrap.py
 # module. The textwrap.py was introduced in Python 2.3. To make this script
-# working also in older Python versions, I have decided to copy it. 
+# working also in older Python versions, I have decided to copy it.
 # Notice that the textwrap.py is copyrighted:
 #
 # Copyright (C) 1999-2001 Gregory P. Ward.
 # Copyright (C) 2002, 2003 Python Software Foundation.
 # Written by Greg Ward <gward@python.net>
 #
-# The explicit permission to use the code here was sent by Guido van Rossum 
+# The explicit permission to use the code here was sent by Guido van Rossum
 # (4th June, 2004).
 #
 def dedent(text):
@@ -147,29 +148,29 @@ def dedent(text):
             lines[i] = lines[i][margin:]
 
     return '\n'.join(lines)
-    
+
 
 class Transl:
     """One instance is build for each translator.
-    
+
     The abbreviation of the source file--part after 'translator_'--is used as
     the identification of the object. The empty string is used for the
     abstract Translator class from translator.h. The other information is
     extracted from inside the source file."""
-    
+
     def __init__(self, fname, manager):
         """Bind to the manager and initialize."""
-        
+
         # Store the filename and the reference to the manager object.
         self.fname = fname
         self.manager = manager
-        
+
         # The instance is responsible for loading the source file, so it checks
         # for its existence and quits if something goes wrong.
         if not os.path.isfile(fname):
             sys.stderr.write("\a\nFile '%s' not found!\n" % fname)
             sys.exit(1)
-            
+
         # Initialize the other collected information.
         self.classId = None
         self.baseClassId = None
@@ -186,11 +187,11 @@ class Transl:
         self.missingMethods = None   # list of prototypes to be implemented
         self.implementedMethods = None  # list of implemented required methods
         self.adaptMinClass = None    # The newest adapter class that can be used
-        self.isDecodedTranslator = None  # Flag related to internal usage of UTF-8    
-        
+        self.isDecodedTranslator = None  # Flag related to internal usage of UTF-8
+
     def __tokenGenerator(self):
         """Generator that reads the file and yields tokens as 4-tuples.
-        
+
         The tokens have the form (tokenId, tokenString, lineNo). The
         last returned token has the form ('eof', None, None). When trying
         to access next token afer that, the exception would be raised."""
@@ -205,14 +206,14 @@ class Transl:
                      'private':   'private',
                      'static':    'static',
                      'virtual':   'virtual',
-                     ':':         'colon',    
+                     ':':         'colon',
                      ';':         'semic',
                      ',':         'comma',
-                     '[':         'lsqbra',   
+                     '[':         'lsqbra',
                      ']':         'rsqbra',
-                     '(':         'lpar',    
+                     '(':         'lpar',
                      ')':         'rpar',
-                     '{':         'lcurly',    
+                     '{':         'lcurly',
                      '}':         'rcurly',
                      '=':         'assign',
                      '*':         'star',
@@ -230,7 +231,7 @@ class Transl:
                      '~':         'tilde',
                      '^':         'caret',
                    }
-        
+
         # Regular expression for recognizing identifiers.
         rexId = re.compile(r'^[a-zA-Z]\w*$')
 
@@ -241,14 +242,14 @@ class Transl:
         line = ''         # init -- see the pos initialization below
         linelen = 0       # init
         pos = 100         # init -- pos after the end of line
-        status = 0     
-        
+        status = 0
+
         tokenId = None    # init
         tokenStr = ''     # init -- the characters will be appended.
         tokenLineNo = 0
 
         while status != 777:
-            
+
             # Get the next character. Read next line first, if necessary.
             if pos < linelen:
                 c = line[pos]
@@ -263,18 +264,18 @@ class Transl:
                     status = 777
                 else:
                     c = line[pos]
-                
+
             # Consume the character based on the status
 
             if status == 0:     # basic status
-                
+
                 # This is the initial status. If tokenId is set, yield the
                 # token here and only here (except when eof is found).
                 # Initialize the token variables after the yield.
                 if tokenId:
                     # If it is an unknown item, it can still be recognized
                     # here. Keywords and separators are the example.
-                    if tokenId == 'unknown': 
+                    if tokenId == 'unknown':
                         if tokenDic.has_key(tokenStr):
                             tokenId = tokenDic[tokenStr]
                         elif tokenStr.isdigit():
@@ -283,28 +284,28 @@ class Transl:
                             tokenId = 'id'
                         else:
                             msg = '\aWarning: unknown token "' + tokenStr + '"'
-                            msg += '\tfound on line %d' % tokenLineNo 
+                            msg += '\tfound on line %d' % tokenLineNo
                             msg += ' in "' + self.fname + '".\n'
                             sys.stderr.write(msg)
-                    
+
                     yield (tokenId, tokenStr, tokenLineNo)
 
-                    # If it is a comment that contains the self.translateMeText 
+                    # If it is a comment that contains the self.translateMeText
                     # string, set the flag -- the situation will be reported.
                     if tokenId == 'comment' and tokenStr.find(self.translateMeText) >= 0:
                         self.translateMeFlag = True
-            
+
                     tokenId = None
                     tokenStr = ''
-                    tokenLineNo = 0 
-                
+                    tokenLineNo = 0
+
                 # Now process the character. When we just skip it (spaces),
                 # stay in this status. All characters that will be part of
                 # some token cause moving to the specific status. And only
-                # when moving to the status == 0 (or the final state 777), 
+                # when moving to the status == 0 (or the final state 777),
                 # the token is yielded. With respect to that the automaton
-                # behaves as Moore's one (output bound to status). When 
-                # collecting tokens, the automaton is the Mealy's one 
+                # behaves as Moore's one (output bound to status). When
+                # collecting tokens, the automaton is the Mealy's one
                 # (actions bound to transitions).
                 if c.isspace():
                     pass                 # just skip whitespace characters
@@ -328,7 +329,7 @@ class Transl:
                     tokenStr = c
                     tokenLineNo = lineNo
                     status = 8
-                elif tokenDic.has_key(c):  # known one-char token 
+                elif tokenDic.has_key(c):  # known one-char token
                     tokenId = tokenDic[c]
                     tokenStr = c
                     tokenLineNo = lineNo
@@ -338,30 +339,30 @@ class Transl:
                     tokenStr = c
                     tokenLineNo = lineNo
                     status = 333
-                
+
                 pos += 1                 # move position in any case
-                    
+
             elif status == 1:            # possibly a comment
                 if c == '/':             # ... definitely the C++ comment
                     tokenId = 'comment'
                     tokenStr += c
-                    pos += 1            
+                    pos += 1
                     status = 2
                 elif c == '*':           # ... definitely the C comment
                     tokenId = 'comment'
                     tokenStr += c
-                    pos += 1            
+                    pos += 1
                     status = 3
                 else:
                     status = 0           # unrecognized, don't move pos
-                    
+
             elif status == 2:            # inside the C++ comment
                 if c == '\n':            # the end of C++ comment
                     status = 0           # yield the token
                 else:
                     tokenStr += c        # collect the C++ comment
                 pos += 1
-                
+
             elif status == 3:            # inside the C comment
                 if c == '*':             # possibly the end of the C comment
                     tokenStr += c
@@ -387,7 +388,7 @@ class Transl:
                 else:
                     tokenStr += c        # collect the preproc
                 pos += 1
-                
+
             elif status == 6:            # inside the string
                 if c == '\\':            # escaped char inside the string
                     tokenStr += c
@@ -398,17 +399,17 @@ class Transl:
                 else:
                     tokenStr += c        # collect the chars of the string
                 pos += 1
-                
+
             elif status == 7:            # escaped char inside the string
                 tokenStr += c            # collect the char of the string
                 status = 6
                 pos += 1
-                
+
             elif status == 8:            # inside the char literal
                 tokenStr += c            # collect the char of the literal
                 status = 9
                 pos += 1
-                
+
             elif status == 9:            # end of char literal expected
                 if c == "'":             # ... and found
                     tokenStr += c
@@ -428,32 +429,32 @@ class Transl:
                 else:
                     tokenStr += c        # collect
                     pos += 1
-                    
-        # We should have finished in the final status. If some token 
+
+        # We should have finished in the final status. If some token
         # have been extracted, yield it first.
         assert(status == 777)
         if tokenId:
             yield (tokenId, tokenStr, tokenLineNo)
             tokenId = None
             tokenStr = ''
-            tokenLineNo = 0 
+            tokenLineNo = 0
 
-        # The file content is processed. Close the file. Then always yield 
+        # The file content is processed. Close the file. Then always yield
         # the eof token.
         f.close()
         yield ('eof', None, None)
-            
-        
+
+
     def __collectClassInfo(self, tokenIterator):
         """Collect the information about the class and base class.
-        
+
         The tokens including the opening left curly brace of the class are
         consumed."""
-        
+
         status = 0  # initial state
-        
+
         while status != 777:   # final state
-            
+
             # Always assume that the previous tokens were processed. Get
             # the next one.
             tokenId, tokenStr, tokenLineNo = tokenIterator.next()
@@ -462,14 +463,14 @@ class Transl:
             if status == 0:    # waiting for the 'class' keyword.
                 if tokenId == 'class':
                     status = 1
-                    
+
             elif status == 1:  # expecting the class identification
                 if tokenId == 'id':
                     self.classId = tokenStr
                     status = 2
                 else:
                     self.__unexpectedToken(status, tokenId, tokenLineNo)
-                
+
             elif status == 2:  # expecting the curly brace or base class info
                 if tokenId == 'lcurly':
                     status = 777        # correctly finished
@@ -477,20 +478,20 @@ class Transl:
                     status = 3
                 else:
                     self.__unexpectedToken(status, tokenId, tokenLineNo)
-                    
+
             elif status == 3:  # expecting the 'public' in front of base class id
                 if tokenId == 'public':
                     status = 4
                 else:
                     self.__unexpectedToken(status, tokenId, tokenLineNo)
-                
+
             elif status == 4:  # expecting the base class id
                 if tokenId == 'id':
                     self.baseClassId = tokenStr
                     status = 5
                 else:
                     self.__unexpectedToken(status, tokenId, tokenLineNo)
-                
+
             elif status == 5:  # expecting the curly brace and quitting
                 if tokenId == 'lcurly':
                     status = 777        # correctly finished
@@ -498,7 +499,7 @@ class Transl:
                     pass
                 else:
                     self.__unexpectedToken(status, tokenId, tokenLineNo)
-                
+
         # Extract the status of the TranslatorXxxx class. The readable form
         # will be used in reports the status form is a string that can be
         # compared lexically (unified length, padding with zeros, etc.).
@@ -523,13 +524,13 @@ class Transl:
                 else:
                     self.readableStatus = 'obsolete'
                     self.status = '0.0.00'
-                    
+
             # Check whether status was set, or set 'strange'.
-            if self.status == None: 
+            if self.status == None:
                 self.status = 'strange'
-            if not self.readableStatus: 
+            if not self.readableStatus:
                 self.readableStatus = 'strange'
-                
+
             # Extract the name of the language and the readable form.
             self.lang = self.classId[10:]  # without 'Translator'
             if self.lang == 'Brazilian':
@@ -538,11 +539,11 @@ class Transl:
                 self.langReadable = 'Chinese Traditional'
             else:
                 self.langReadable = self.lang
-                
+
 
     def __unexpectedToken(self, status, tokenId, tokenLineNo):
         """Reports unexpected token and quits with exit code 1."""
-    
+
         import inspect
         calledFrom = inspect.stack()[1][3]
         msg = "\a\nUnexpected token '%s' on the line %d in '%s'.\n"
@@ -550,25 +551,25 @@ class Transl:
         msg += 'status = %d in %s()\n' % (status, calledFrom)
         sys.stderr.write(msg)
         sys.exit(1)
-        
-                
+
+
     def collectPureVirtualPrototypes(self):
         """Returns dictionary 'unified prototype' -> 'full prototype'.
 
         The method is expected to be called only for the translator.h. It
         extracts only the pure virtual method and build the dictionary where
         key is the unified prototype without argument identifiers."""
-        
+
         # Prepare empty dictionary that will be returned.
         resultDic = {}
-        
+
         # Start the token generator which parses the class source file.
         tokenIterator = self.__tokenGenerator()
 
         # Collect the class and the base class identifiers.
         self.__collectClassInfo(tokenIterator)
         assert(self.classId == 'Translator')
-        
+
         # Let's collect readable form of the public virtual pure method
         # prototypes in the readable form -- as defined in translator.h.
         # Let's collect also unified form of the same prototype that omits
@@ -576,7 +577,7 @@ class Transl:
         # identifiers.
         prototype = ''    # readable prototype (with everything)
         uniPrototype = '' # unified prototype (without arg. identifiers)
-        
+
         # Collect the pure virtual method prototypes. Stop on the closing
         # curly brace followed by the semicolon (end of class).
         status = 0
@@ -584,21 +585,21 @@ class Transl:
 
         # Loop until the final state 777 is reached. The errors are processed
         # immediately. In this implementation, it always quits the application.
-        while status != 777:     
-            
+        while status != 777:
+
             # Get the next token.
             tokenId, tokenStr, tokenLineNo = tokenIterator.next()
-            
+
             if status == 0:      # waiting for 'public:'
                 if tokenId == 'public':
                     status = 1
-                
+
             elif status == 1:    # colon after the 'public'
                 if tokenId == 'colon':
                     status = 2
                 else:
                     self.__unexpectedToken(status, tokenId, tokenLineNo)
-                
+
             elif status == 2:    # waiting for 'virtual'
                 if tokenId == 'virtual':
                     prototype = tokenStr  # but not to unified prototype
@@ -609,7 +610,7 @@ class Transl:
                     status = 11         # expected end of class
                 else:
                     self.__unexpectedToken(status, tokenId, tokenLineNo)
-                    
+
             elif status == 3:    # return type of the method expected
                 if tokenId == 'id':
                     prototype += ' ' + tokenStr
@@ -619,7 +620,7 @@ class Transl:
                     status = 4
                 else:
                     self.__unexpectedToken(status, tokenId, tokenLineNo)
-                    
+
             elif status == 4:    # method identifier expected
                 if tokenId == 'id':
                     prototype += ' ' + tokenStr
@@ -627,7 +628,7 @@ class Transl:
                     status = 5
                 else:
                     self.__unexpectedToken(status, tokenId, tokenLineNo)
-                    
+
             elif status == 5:    # left bracket of the argument list expected
                 if tokenId == 'lpar':
                     prototype += tokenStr
@@ -635,7 +636,7 @@ class Transl:
                     status = 6
                 else:
                     self.__unexpectedToken(status, tokenId, tokenLineNo)
-                    
+
             elif status == 6:    # collecting arguments of the method
                 if tokenId == 'rpar':
                     prototype += tokenStr
@@ -651,22 +652,22 @@ class Transl:
                     status = 13
                 else:
                     self.__unexpectedToken(status, tokenId, tokenLineNo)
-                    
+
             elif status == 7:    # assignment expected or left curly brace
                 if tokenId == 'assign':
                     status = 8
                 elif tokenId == 'lcurly':
-                    curlyCnt = 1      # method body entered 
+                    curlyCnt = 1      # method body entered
                     status = 10
                 else:
                     self.__unexpectedToken(status, tokenId, tokenLineNo)
-                    
+
             elif status == 8:    # zero expected
                 if tokenId == 'num' and tokenStr == '0':
                     status = 9
                 else:
                     self.__unexpectedToken(status, tokenId, tokenLineNo)
-                    
+
             elif status == 9:    # after semicolon, produce the dic item
                 if tokenId == 'semic':
                     assert(not resultDic.has_key(uniPrototype))
@@ -674,7 +675,7 @@ class Transl:
                     status = 2
                 else:
                     self.__unexpectedToken(status, tokenId, tokenLineNo)
-                    
+
             elif status == 10:   # consuming the body of the method
                 if tokenId == 'rcurly':
                     curlyCnt -= 1
@@ -682,13 +683,13 @@ class Transl:
                         status = 2     # body consumed
                 elif tokenId == 'lcurly':
                     curlyCnt += 1
-                        
+
             elif status == 11:   # probably the end of class
                 if tokenId == 'semic':
                     status = 777
                 else:
                     self.__unexpectedToken(status, tokenId, tokenLineNo)
-                   
+
             elif status == 12:   # type id for argument expected
                 if tokenId == 'id':
                     prototype += ' ' + tokenStr
@@ -696,7 +697,7 @@ class Transl:
                     status = 13
                 else:
                     self.__unexpectedToken(status, tokenId, tokenLineNo)
-                   
+
             elif status == 13:   # namespace qualification or * or & expected
                 if tokenId == 'colon':        # was namespace id
                     prototype += tokenStr
@@ -712,33 +713,33 @@ class Transl:
                     status = 17
                 else:
                     self.__unexpectedToken(status, tokenId, tokenLineNo)
-                   
+
             elif status == 14:   # second colon for namespace:: expected
-                if tokenId == 'colon':        
+                if tokenId == 'colon':
                     prototype += tokenStr
                     uniPrototype += tokenStr
                     status = 15
                 else:
                     self.__unexpectedToken(status, tokenId, tokenLineNo)
-                   
+
             elif status == 15:   # type after namespace:: expected
-                if tokenId == 'id':        
+                if tokenId == 'id':
                     prototype += tokenStr
                     uniPrototype += tokenStr
                     status = 13
                 else:
                     self.__unexpectedToken(status, tokenId, tokenLineNo)
-                   
+
             elif status == 16:   # argument identifier expected
-                if tokenId == 'id':        
+                if tokenId == 'id':
                     prototype += ' ' + tokenStr
                     # don't put this into unified prototype
                     status = 17
                 else:
                     self.__unexpectedToken(status, tokenId, tokenLineNo)
-                   
+
             elif status == 17:   # comma or ')' after argument identifier expected
-                if tokenId == 'comma':        
+                if tokenId == 'comma':
                     prototype += ', '
                     uniPrototype += ', '
                     status = 6
@@ -748,26 +749,26 @@ class Transl:
                     status = 7
                 else:
                     self.__unexpectedToken(status, tokenId, tokenLineNo)
+
         # Eat the rest of the source to cause closing the file.
         while tokenId != 'eof':
             tokenId, tokenStr, tokenLineNo = tokenIterator.next()
-            
+
         # Return the resulting dictionary with 'uniPrototype -> prototype'.
         return resultDic
-            
-        
-    def __collectPublicMethodPrototypes(self, tokenIterator):    
+
+
+    def __collectPublicMethodPrototypes(self, tokenIterator):
         """Collects prototypes of public methods and fills self.prototypeDic.
-        
-        The dictionary is filled by items: uniPrototype -> prototype. 
+
+        The dictionary is filled by items: uniPrototype -> prototype.
         The method is expected to be called only for TranslatorXxxx classes,
         i.e. for the classes that implement translation to some language.
         It assumes that the openning curly brace of the class was already
-        consumed. The source is consumed until the end of the class. 
-        The caller should consume the source until the eof to cause closing 
+        consumed. The source is consumed until the end of the class.
+        The caller should consume the source until the eof to cause closing
         the source file."""
-        
+
         assert(self.classId != 'Translator')
         assert(self.baseClassId != None)
 
@@ -779,7 +780,7 @@ class Transl:
         # TranslatorAdapterBase (states 8 and 9). Argument identifier inside
         # method argument lists can be omitted or commented.
         #
-        # Let's collect readable form of all public method prototypes in 
+        # Let's collect readable form of all public method prototypes in
         # the readable form -- as defined in the source file.
         # Let's collect also unified form of the same prototype that omits
         # everything that can be omitted, namely 'virtual' and argument
@@ -788,7 +789,7 @@ class Transl:
         uniPrototype = '' # unified prototype (without arg. identifiers)
         warning = ''      # warning message -- if something special detected
         methodId = None   # processed method id
-        
+
         # Collect the method prototypes. Stop on the closing
         # curly brace followed by the semicolon (end of class).
         status = 0
@@ -796,23 +797,23 @@ class Transl:
 
         # Loop until the final state 777 is reached. The errors are processed
         # immediately. In this implementation, it always quits the application.
-        while status != 777:     
-            
+        while status != 777:
+
             # Get the next token.
             tokenId, tokenStr, tokenLineNo = tokenIterator.next()
-            
+
             if status == 0:      # waiting for 'public:'
                 if tokenId == 'public':
                     status = 1
                 elif tokenId == 'eof':  # non-public things until the eof
                     status = 777
-                
+
             elif status == 1:    # colon after the 'public'
                 if tokenId == 'colon':
                     status = 2
                 else:
                     self.__unexpectedToken(status, tokenId, tokenLineNo)
-                
+
             elif status == 2:    # waiting for 'virtual' (can be omitted)
                 if tokenId == 'virtual':
                     prototype = tokenStr  # but not to unified prototype
@@ -829,7 +830,7 @@ class Transl:
                     status = 11         # expected end of class
                 else:
                     self.__unexpectedToken(status, tokenId, tokenLineNo)
-                    
+
             elif status == 3:    # return type of the method expected
                 if tokenId == 'id':
                     prototype += ' ' + tokenStr
@@ -837,7 +838,7 @@ class Transl:
                     status = 4
                 else:
                     self.__unexpectedToken(status, tokenId, tokenLineNo)
-                    
+
             elif status == 4:    # method identifier expected
                 if tokenId == 'id':
                     prototype += ' ' + tokenStr
@@ -846,7 +847,7 @@ class Transl:
                     status = 5
                 else:
                     self.__unexpectedToken(status, tokenId, tokenLineNo)
-                    
+
             elif status == 5:    # left bracket of the argument list expected
                 if tokenId == 'lpar':
                     prototype += tokenStr
@@ -854,7 +855,7 @@ class Transl:
                     status = 6
                 else:
                     self.__unexpectedToken(status, tokenId, tokenLineNo)
-                    
+
             elif status == 6:    # collecting arguments of the method
                 if tokenId == 'rpar':
                     prototype += tokenStr
@@ -870,10 +871,10 @@ class Transl:
                     status = 13
                 else:
                     self.__unexpectedToken(status, tokenId, tokenLineNo)
-                    
-            elif status == 7:    # left curly brace expected 
+
+            elif status == 7:    # left curly brace expected
                 if tokenId == 'lcurly':
-                    curlyCnt = 1      # method body entered 
+                    curlyCnt = 1      # method body entered
                     status = 10
                 elif tokenId == 'comment':
                     pass
@@ -882,14 +883,14 @@ class Transl:
                     status = 8
                 else:
                     self.__unexpectedToken(status, tokenId, tokenLineNo)
-                    
+
             elif status == 8:    # zero expected (TranslatorAdapterBase)
                 assert(self.classId == 'TranslatorAdapterBase')
                 if tokenId == 'num' and tokenStr == '0':
                     status = 9
                 else:
                     self.__unexpectedToken(status, tokenId, tokenLineNo)
-                    
+
             elif status == 9:    # after semicolon (TranslatorAdapterBase)
                 assert(self.classId == 'TranslatorAdapterBase')
                 if tokenId == 'semic':
@@ -901,26 +902,36 @@ class Transl:
                 if tokenId == 'rcurly':
                     curlyCnt -= 1
                     if curlyCnt == 0:
-                        # Insert new dictionary item.
+                        # Check for possible copy/paste error when name
+                        # of the method was not corrected (i.e. the same
+                        # name already exists).
+                        if uniPrototype in self.prototypeDic:
+                            msg = "'%s' prototype found again (duplicity)\n"
+                            msg += "in '%s'.\n" % self.fname
+                            msg = msg % uniPrototype
+                            sys.stderr.write(msg)
+                            assert False
+
                         assert(not self.prototypeDic.has_key(uniPrototype))
+                        # Insert new dictionary item.
                         self.prototypeDic[uniPrototype] = prototype
                         status = 2      # body consumed
                         methodId = None # outside of any method
                 elif tokenId == 'lcurly':
                     curlyCnt += 1
-                    
-                # Warn in special case.     
+
+                # Warn in special case.
                 elif methodId == 'trLegendDocs' and tokenId == 'string' \
                     and tokenStr.find('MAX_DOT_GRAPH_HEIGHT') >= 0:
-                        self.txtMAX_DOT_GRAPH_HEIGHT_flag = True  
-  
-                    
+                        self.txtMAX_DOT_GRAPH_HEIGHT_flag = True
+
+
             elif status == 11:   # probably the end of class
                 if tokenId == 'semic':
                     status = 777
                 else:
                     self.__unexpectedToken(status, tokenId, tokenLineNo)
-                   
+
             elif status == 12:   # type id for argument expected
                 if tokenId == 'id':
                     prototype += ' ' + tokenStr
@@ -928,7 +939,7 @@ class Transl:
                     status = 13
                 else:
                     self.__unexpectedToken(status, tokenId, tokenLineNo)
-                   
+
             elif status == 13:   # :: or * or & or id or ) expected
                 if tokenId == 'colon':        # was namespace id
                     prototype += tokenStr
@@ -948,31 +959,31 @@ class Transl:
                     prototype += tokenStr
                     uniPrototype += tokenStr
                     status = 7
-                elif tokenId == 'comma':        
+                elif tokenId == 'comma':
                     prototype += ', '
                     uniPrototype += ', '
                     status = 6
                 else:
                     self.__unexpectedToken(status, tokenId, tokenLineNo)
-                   
+
             elif status == 14:   # second colon for namespace:: expected
-                if tokenId == 'colon':        
+                if tokenId == 'colon':
                     prototype += tokenStr
                     uniPrototype += tokenStr
                     status = 15
                 else:
                     self.__unexpectedToken(status, tokenId, tokenLineNo)
-                   
+
             elif status == 15:   # type after namespace:: expected
-                if tokenId == 'id':        
+                if tokenId == 'id':
                     prototype += tokenStr
                     uniPrototype += tokenStr
                     status = 13
                 else:
                     self.__unexpectedToken(status, tokenId, tokenLineNo)
-                   
+
             elif status == 16:   # argument identifier or ) expected
-                if tokenId == 'id':        
+                if tokenId == 'id':
                     prototype += ' ' + tokenStr
                     # don't put this into unified prototype
                     status = 17
@@ -984,9 +995,9 @@ class Transl:
                     prototype += tokenStr
                 else:
                     self.__unexpectedToken(status, tokenId, tokenLineNo)
-                   
+
             elif status == 17:   # comma or ')' after argument identifier expected
-                if tokenId == 'comma':        
+                if tokenId == 'comma':
                     prototype += ', '
                     uniPrototype += ', '
                     status = 6
@@ -996,17 +1007,17 @@ class Transl:
                     status = 7
                 else:
                     self.__unexpectedToken(status, tokenId, tokenLineNo)
-                   
-        
+
+
 
     def collectAdapterPrototypes(self):
         """Returns the dictionary of prototypes implemented by adapters.
-        
-        It is created to process the translator_adapter.h. The returned 
+
+        It is created to process the translator_adapter.h. The returned
         dictionary has the form: unifiedPrototype -> (version, classId)
-        thus by looking for the prototype, we get the information what is 
-        the newest (least adapting) adapter that is sufficient for 
-        implementing the method."""            
+        thus by looking for the prototype, we get the information what is
+        the newest (least adapting) adapter that is sufficient for
+        implementing the method."""
 
         # Start the token generator which parses the class source file.
         assert(os.path.split(self.fname)[1] == 'translator_adapter.h')
@@ -1017,8 +1028,8 @@ class Transl:
 
         # Create the empty dictionary that will be returned.
         adaptDic = {}
-        
-        
+
+
         # Loop through the source of the adapter file until no other adapter
         # class is found.
         while True:
@@ -1038,16 +1049,16 @@ class Transl:
                         version += '.' + ('%02d' % int(lst[3]))
                     else:
                         version += '.00'
-                
+
                 # Collect the prototypes of implemented public methods.
                 self.__collectPublicMethodPrototypes(tokenIterator)
-        
-                # For the required methods, update the dictionary of methods 
+
+                # For the required methods, update the dictionary of methods
                 # implemented by the adapter.
                 for protoUni in self.prototypeDic:
                     if reqDic.has_key(protoUni):
                         # This required method will be marked as implemented
-                        # by this adapter class. This implementation assumes 
+                        # by this adapter class. This implementation assumes
                         # that newer adapters do not reimplement any required
                         # methods already implemented by older adapters.
                         assert(not adaptDic.has_key(protoUni))
@@ -1058,16 +1069,16 @@ class Transl:
                 self.prototypeDic.clear()
                 self.classId = None
                 self.baseClassId = None
-                
+
             except StopIteration:
                 break
 
         # Return the result dictionary.
-        return adaptDic    
+        return adaptDic
+
 
-        
     def processing(self):
-        """Processing of the source file -- only for TranslatorXxxx classes."""            
+        """Processing of the source file -- only for TranslatorXxxx classes."""
 
         # Start the token generator which parses the class source file.
         tokenIterator = self.__tokenGenerator()
@@ -1076,10 +1087,10 @@ class Transl:
         self.__collectClassInfo(tokenIterator)
         assert(self.classId != 'Translator')
         assert(self.classId[:17] != 'TranslatorAdapter')
-        
+
         # Collect the prototypes of implemented public methods.
         self.__collectPublicMethodPrototypes(tokenIterator)
-        
+
         # Eat the rest of the source to cause closing the file.
         while True:
             try:
@@ -1091,13 +1102,13 @@ class Transl:
         reqDic = self.manager.requiredMethodsDic
         adaptDic = self.manager.adaptMethodsDic
         myDic = self.prototypeDic
-        
+
         # Build the list of obsolete methods.
         self.obsoleteMethods = []
         for p in myDic:
             if not reqDic.has_key(p):
                 self.obsoleteMethods.append(p)
-        
+
         # Build the list of missing methods and the list of implemented
         # required methods.
         self.missingMethods = []
@@ -1114,17 +1125,17 @@ class Transl:
         self.isDecodedTranslator = self.classId in self.manager.decodedTranslators
         if self.isDecodedTranslator:
             self.note = 'Reimplementation using UTF-8 suggested.'
-            
+
         # Check whether adapter must be used or suggest the newest one.
         # Change the status and set the note accordingly.
         if self.baseClassId != 'Translator':
-            if not self.missingMethods: 
+            if not self.missingMethods:
                 self.note = 'Change the base class to Translator.'
                 self.status = ''
                 self.readableStatus = 'up-to-date'
             elif self.baseClassId != 'TranslatorEnglish':
                 # The translator uses some of the adapters.
-                # Look at the missing methods and check what adapter 
+                # Look at the missing methods and check what adapter
                 # implements them. Remember the one with the lowest version.
                 adaptMinVersion = '9.9.99'
                 adaptMinClass = 'TranslatorAdapter_9_9_99'
@@ -1134,12 +1145,12 @@ class Transl:
                         if version < adaptMinVersion:
                             adaptMinVersion = version
                             adaptMinClass = cls
-                
+
                 # Test against the current status -- preserve the self.status.
-                # Possibly, the translator implements enough methods to 
+                # Possibly, the translator implements enough methods to
                 # use some newer adapter.
                 status = self.status
-                    
+
                 # If the version of the used adapter is smaller than
                 # the required, set the note and update the status as if
                 # the newer adapter was used.
@@ -1148,40 +1159,40 @@ class Transl:
                     self.status = adaptMinVersion
                     self.adaptMinClass = adaptMinClass
                     self.readableStatus = adaptMinVersion # simplified
-        
-        # If everything seems OK, some explicit warning flags still could 
-        # be set. 
+
+        # If everything seems OK, some explicit warning flags still could
+        # be set.
         if not self.note and self.status == '' and \
            (self.translateMeFlag or self.txtMAX_DOT_GRAPH_HEIGHT_flag):
-           self.note = '' 
+           self.note = ''
            if self.translateMeFlag:
                self.note += 'The "%s" found in a comment.' % self.translateMeText
            if self.note != '':
-               self.note += '\n\t\t'          
+               self.note += '\n\t\t'
            if self.txtMAX_DOT_GRAPH_HEIGHT_flag:
                 self.note += 'The MAX_DOT_GRAPH_HEIGHT found in trLegendDocs()'
-        
-        # If everything seems OK, but there are obsolete methods, set 
+
+        # If everything seems OK, but there are obsolete methods, set
         # the note to clean-up source. This note will be used only when
         # the previous code did not set another note (priority).
         if not self.note and self.status == '' and self.obsoleteMethods:
             self.note = 'Remove the obsolete methods (never used).'
-            
-                
+
+
     def report(self, fout):
         """Returns the report part for the source as a multiline string.
-        
+
         No output for up-to-date translators without problem."""
-        
+
         # If there is nothing to report, return immediately.
         if self.status == '' and not self.note:
             return
-            
+
         # Report the number of not implemented methods.
         fout.write('\n\n\n')
         fout.write(self.classId + '   (' + self.baseClassId + ')')
         percentImplemented = 100    # init
-        allNum = len(self.manager.requiredMethodsDic) 
+        allNum = len(self.manager.requiredMethodsDic)
         if self.missingMethods:
             num = len(self.missingMethods)
             percentImplemented = 100 * (allNum - num) / allNum
@@ -1191,11 +1202,11 @@ class Transl:
                 fout.write('s')
             fout.write(' to implement (%d %%)' % (100 * num / allNum))
         fout.write('\n' + '-' * len(self.classId))
-        
+
         # Write the info about the implemented required methods.
         fout.write('\n\n  Implements %d' % len(self.implementedMethods))
         fout.write(' of the required methods (%d %%).' % percentImplemented)
-        
+
         # Report the missing method, but only when it is not English-based
         # translator.
         if self.missingMethods and self.status != 'En':
@@ -1219,67 +1230,67 @@ class Transl:
             for p in self.implementedMethods:
                 fout.write('\n    ' + reqDic[p])
 
-                
+
     def getmtime(self):
         """Returns the last modification time of the source file."""
         assert(os.path.isfile(self.fname))
         return os.path.getmtime(self.fname)
-        
-                
+
+
 class TrManager:
     """Collects basic info and builds subordinate Transl objects."""
-    
+
     def __init__(self):
         """Determines paths, creates and initializes structures.
-        
-        The arguments of the script may explicitly say what languages should 
+
+        The arguments of the script may explicitly say what languages should
         be processed. Write the two letter identifications that are used
         for composing the source filenames, so...
-            
+
             python translator.py cz
-            
+
         this will process only translator_cz.h source.
         """
-        
+
         # Determine the path to the script and its name.
-        self.script = os.path.abspath(sys.argv[0]) 
-        self.script_path, self.script_name = os.path.split(self.script) 
+        self.script = os.path.abspath(sys.argv[0])
+        self.script_path, self.script_name = os.path.split(self.script)
         self.script_path = os.path.abspath(self.script_path)
-        
+
         # Determine the absolute path to the Doxygen's root subdirectory.
         # If DOXYGEN environment variable is not found, the directory is
         # determined from the path of the script.
-        doxy_default = os.path.join(self.script_path, '..')    
+        doxy_default = os.path.join(self.script_path, '..')
         self.doxy_path = os.path.abspath(os.getenv('DOXYGEN', doxy_default))
-        
+
         # Get the explicit arguments of the script.
         self.script_argLst = sys.argv[1:]
-        
+
         # Build the path names based on the Doxygen's root knowledge.
         self.doc_path = os.path.join(self.doxy_path, 'doc')
         self.src_path = os.path.join(self.doxy_path, 'src')
-        
+
         # Create the empty dictionary for Transl object identitied by the
-        # class identifier of the translator. 
+        # class identifier of the translator.
         self.__translDic = {}
 
         # Create the None dictionary of required methods. The key is the
         # unified prototype, the value is the full prototype. Set inside
         # the self.__build().
         self.requiredMethodsDic = None
-        
+
         # Create the empty dictionary that says what method is implemented
         # by what adapter.
         self.adaptMethodsDic = {}
-        
+
         # The last modification time will capture the modification of this
-        # script, of the translator.h, of the translator_adapter.h (see the 
+        # script, of the translator.h, of the translator_adapter.h (see the
         # self.__build() for the last two) of all the translator_xx.h files
         # and of the template for generating the documentation. So, this
-        # time can be compared with modification time of the generated 
+        # time can be compared with modification time of the generated
         # documentation to decide, whether the doc should be re-generated.
         self.lastModificationTime = os.path.getmtime(self.script)
-        
+
         # Set the names of the translator report text file, of the template
         # for generating "Internationalization" document, for the generated
         # file itself, and for the maintainers list.
@@ -1287,36 +1298,36 @@ class TrManager:
         self.maintainersFileName = 'maintainers.txt'
         self.languageTplFileName = 'language.tpl'
         self.languageDocFileName = 'language.doc'
-        
-        # The information about the maintainers will be stored 
+
+        # The information about the maintainers will be stored
         # in the dictionary with the following name.
         self.__maintainersDic = None
-        
+
         # Define the other used structures and variables for information.
         self.langLst = None                   # including English based
         self.supportedLangReadableStr = None  # coupled En-based as a note
         self.numLang = None                   # excluding coupled En-based
         self.doxVersion = None                # Doxygen version
-        
+
         # Capture the knowledge about translators that are not implemented
         # to use UTF-8 internally.
         self.decodedTranslators = self.getDecodedTranslators()
-        
+
         # Build objects where each one is responsible for one translator.
         self.__build()
-        
-        
+
+
     def getDecodedTranslators(self):
         """Parses language.cpp to find what translators do not use UTF-8 yet"""
         decodedTranslators = []
-        
+
         # Regular expression to detect the lines like
         #     theTranslator=new TranslatorDecoder(new TranslatorSwedish);
         rex = re.compile(r'^\s*theTranslator\s*=\s*new\s+.*$')
-        
+
         # Regular expression to get the (optional) TranslatorDecoder and TranslatorXXX
         rex2 = re.compile(r'\bTranslator\w+')
-        
+
         # Parse the lines in the specific source code.
         f = open(os.path.join(self.src_path, 'language.cpp'), 'rU')
         for line in f:
@@ -1325,20 +1336,20 @@ class TrManager:
                 if lst[0] == 'TranslatorDecoder':
                     decodedTranslators.append(lst[1])
         f.close()
-        
-        # Display warning when all translator implementations were converted 
+
+        # Display warning when all translator implementations were converted
         # to UTF-8.
         if len(decodedTranslators) == 0:
             print 'This script should be updated. All translators do use UTF-8'
             print 'internally.  The TranslatorDecoder adapter should be removed'
             print 'from the code and its usage should not be checked any more.'
-            
+
         return decodedTranslators
-    
-        
+
+
     def __build(self):
         """Find the translator files and build the objects for translators."""
-        
+
         # The translator.h must exist (the Transl object will check it),
         # create the object for it and let it build the dictionary of
         # required methods.
@@ -1347,7 +1358,7 @@ class TrManager:
         tim = tr.getmtime()
         if tim > self.lastModificationTime:
             self.lastModificationTime = tim
-        
+
         # The translator_adapter.h must exist (the Transl object will check it),
         # create the object for it and store the reference in the dictionary.
         tr = Transl(os.path.join(self.src_path, 'translator_adapter.h'), self)
@@ -1355,7 +1366,7 @@ class TrManager:
         tim = tr.getmtime()
         if tim > self.lastModificationTime:
             self.lastModificationTime = tim
-            
+
         # Create the list of the filenames with language translator sources.
         # If the explicit arguments of the script were typed, process only
         # those files.
@@ -1365,13 +1376,13 @@ class TrManager:
                 if not os.path.isfile(os.path.join(self.src_path, fname)):
                     sys.stderr.write("\a\nFile '%s' not found!\n" % fname)
                     sys.exit(1)
-        else:                    
+        else:
             lst = os.listdir(self.src_path)
             lst = filter(lambda x: x[:11] == 'translator_'
                                    and x[-2:] == '.h'
                                    and x != 'translator_adapter.h', lst)
-    
-        # Build the object for the translator_xx.h files, and process the 
+
+        # Build the object for the translator_xx.h files, and process the
         # content of the file. Then insert the object to the dictionary
         # accessed via classId.
         for fname in lst:
@@ -1381,12 +1392,12 @@ class TrManager:
             assert(tr.classId != 'Translator')
             self.__translDic[tr.classId] = tr
 
-        # Extract the global information of the processed info. 
+        # Extract the global information of the processed info.
         self.__extractProcessedInfo()
-        
-    
+
+
     def __extractProcessedInfo(self):
-        """Build lists and strings of the processed info."""        
+        """Build lists and strings of the processed info."""
 
         # Build the auxiliary list with strings compound of the status,
         # readable form of the language, and classId.
@@ -1395,7 +1406,7 @@ class TrManager:
             assert(obj.classId != 'Translator')
             s = obj.status + '|' + obj.langReadable + '|' + obj.classId
             statLst.append(s)
-        
+
         # Sort the list and extract the object identifiers (classId's) for
         # the up-to-date translators and English-based translators.
         statLst.sort()
@@ -1406,13 +1417,13 @@ class TrManager:
         statLst.reverse()
         self.adaptIdLst = [x.split('|')[2] for x in statLst if x[0].isdigit()]
 
-        # Build the list of tuples that contain (langReadable, obj). 
+        # Build the list of tuples that contain (langReadable, obj).
         # Sort it by readable name.
         self.langLst = []
         for obj in self.__translDic.values():
             self.langLst.append((obj.langReadable, obj))
         self.langLst.sort(lambda a, b: cmp(a[0], b[0]))
-            
+
         # Create the list with readable language names. If the language has
         # also the English-based version, modify the item by appending
         # the note. Number of the supported languages is equal to the length
@@ -1420,28 +1431,28 @@ class TrManager:
         langReadableLst = []
         for name, obj in self.langLst:
             if obj.status == 'En': continue
-            
+
             # Append the 'En' to the classId to possibly obtain the classId
             # of the English-based object. If the object exists, modify the
             # name for the readable list of supported languages.
             classIdEn = obj.classId + 'En'
             if self.__translDic.has_key(classIdEn):
                 name += ' (+En)'
-            
+
             # Append the result name of the language, possibly with note.
             langReadableLst.append(name)
 
-        # Create the multiline string of readable language names, 
+        # Create the multiline string of readable language names,
         # with punctuation, wrapped to paragraph.
         if len(langReadableLst) == 1:
             s = langReadableLst[0]
         elif len(langReadableLst) == 2:
-            s = ' and '.join(langReadableLst) 
-        else:    
-            s = ', '.join(langReadableLst[:-1]) + ', and ' 
+            s = ' and '.join(langReadableLst)
+        else:
+            s = ', '.join(langReadableLst[:-1]) + ', and '
             s += langReadableLst[-1]
-        
-        self.supportedLangReadableStr = fill(s + '.') 
+
+        self.supportedLangReadableStr = fill(s + '.')
 
         # Find the number of the supported languages. The English based
         # languages are not counted if the non-English based also exists.
@@ -1451,32 +1462,32 @@ class TrManager:
                 classId = obj.classId[:-2]
                 if self.__translDic.has_key(classId):
                     self.numLang -= 1    # the couple will be counted as one
-        
+
         # Extract the version of Doxygen.
         f = open(os.path.join(self.doxy_path, 'VERSION'))
         self.doxVersion = f.readline().strip()
         f.close()
-        
+
         # Update the last modification time.
         for tr in self.__translDic.values():
             tim = tr.getmtime()
             if tim > self.lastModificationTime:
                 self.lastModificationTime = tim
-        
-        
+
+
     def __getNoTrSourceFilesLst(self):
         """Returns the list of sources to be checked.
-        
+
         All .cpp files and also .h files that do not declare or define
-        the translator methods are included in the list. The file names 
+        the translator methods are included in the list. The file names
         are searched in doxygen/src directory.
-        """ 
+        """
         files = []
         for item in os.listdir(self.src_path):
             # Split the bare name to get the extension.
             name, ext = os.path.splitext(item)
             ext = ext.lower()
-            
+
             # Include only .cpp and .h files (case independent) and exclude
             # the files where the checked identifiers are defined.
             if ext == '.cpp' or (ext == '.h' and name.find('translator') == -1):
@@ -1484,37 +1495,37 @@ class TrManager:
                 assert os.path.isfile(fname) # assumes no directory with the ext
                 files.append(fname)          # full name
         return files
-        
-    
+
+
     def __removeUsedInFiles(self, fname, dic):
         """Removes items for method identifiers that are found in fname.
-        
+
         The method reads the content of the file as one string and searches
         for all identifiers from dic. The identifiers that were found in
         the file are removed from the dictionary.
-        
+
         Note: If more files is to be checked, the files where most items are
-        probably used should be checked first and the resulting reduced 
+        probably used should be checked first and the resulting reduced
         dictionary should be used for checking the next files (speed up).
         """
         lst_in = dic.keys()   # identifiers to be searched for
-        
+
         # Read content of the file as one string.
         assert os.path.isfile(fname)
         f = open(fname)
         cont = f.read()
         f.close()
-        
+
         # Remove the items for identifiers that were found in the file.
         while lst_in:
             item = lst_in.pop(0)
             if cont.find(item) != -1:
                 del dic[item]
 
-    
+
     def __checkForNotUsedTrMethods(self):
         """Returns the dictionary of not used translator methods.
-        
+
         The method can be called only after self.requiredMethodsDic has been
         built. The stripped prototypes are the values, the method identifiers
         are the keys.
@@ -1526,45 +1537,45 @@ class TrManager:
             ri = prototype.split('(')[0]
             identifier = ri.split()[1].strip()
             trdic[identifier] = prototype
-        
+
         # Build the list of source files where translator method identifiers
         # can be used.
         files = self.__getNoTrSourceFilesLst()
-        
+
         # Loop through the files and reduce the dictionary of id -> proto.
         for fname in files:
             self.__removeUsedInFiles(fname, trdic)
-        
+
         # Return the dictionary of not used translator methods.
         return trdic
-        
-        
+
+
     def __emails(self, classId):
         """Returns the list of maintainer emails.
-        
+
         The method returns the list of e-mail adresses for the translator
         class, but only the addresses that were not marked as [xxx]."""
         lst = []
         for m in self.__maintainersDic[classId]:
             if not m[1].startswith('['):
                 email = m[1]
-                email = email.replace(' at ', '@') # Unmangle the mangled e-mail 
+                email = email.replace(' at ', '@') # Unmangle the mangled e-mail
                 email = email.replace(' dot ', '.')
                 lst.append(email)
         return lst
-                    
-    
+
+
     def generateTranslatorReport(self):
         """Generates the translator report."""
 
         output = os.path.join(self.doc_path, self.translatorReportFileName)
-        
+
         # Open the textual report file for the output.
         f = open(output, 'w')
 
         # Output the information about the version.
         f.write('(' + self.doxVersion + ')\n\n')
-        
+
         # Output the information about the number of the supported languages
         # and the list of the languages, or only the note about the explicitly
         # given languages to process.
@@ -1577,30 +1588,30 @@ class TrManager:
             f.write(str(self.numLang))
             f.write(' languages (sorted alphabetically):\n\n')
             f.write(self.supportedLangReadableStr + '\n\n')
-        
-            # Write the summary about the status of language translators (how 
+
+            # Write the summary about the status of language translators (how
             # many translators) are up-to-date, etc.
             s = 'Of them, %d translators are up-to-date, ' % len(self.upToDateIdLst)
-            s += '%d translators are based on some adapter class, ' % len(self.adaptIdLst)  
+            s += '%d translators are based on some adapter class, ' % len(self.adaptIdLst)
             s += 'and %d are English based.' % len(self.EnBasedIdLst)
             f.write(fill(s) + '\n\n')
-        
-        # The e-mail addresses of the maintainers will be collected to 
+
+        # The e-mail addresses of the maintainers will be collected to
         # the auxiliary file in the order of translator classes listed
         # in the translator report.
         fmail = open('mailto.txt', 'w')
-        
-        # Write the list of up-to-date translator classes. 
+
+        # Write the list of up-to-date translator classes.
         if self.upToDateIdLst:
             s = '''The following translator classes are up-to-date (sorted
                 alphabetically). This means that they derive from the
                 Translator class and they implement all %d of the required
-                methods. Anyway, there still may be some details listed even 
+                methods. Anyway, there still may be some details listed even
                 for them:'''
-            s = s % len(self.requiredMethodsDic)    
+            s = s % len(self.requiredMethodsDic)
             f.write('-' * 70 + '\n')
             f.write(fill(s) + '\n\n')
-            
+
             mailtoLst = []
             for x in self.upToDateIdLst:
                 obj = self.__translDic[x]
@@ -1609,24 +1620,24 @@ class TrManager:
                     f.write(' -- ' + obj.note)
                 f.write('\n')
                 mailtoLst.extend(self.__emails(obj.classId))
-                
+
             fmail.write('up-to-date\n')
             fmail.write('; '.join(mailtoLst))
 
         # Write the list of the adapter based classes. The very obsolete
         # translators that derive from TranslatorEnglish are included.
         if self.adaptIdLst:
-            s = '''The following translator classes need some maintenance 
+            s = '''The following translator classes need some maintenance
                 (the most obsolete at the end). The other info shows the
                 estimation of Doxygen version when the class was last
                 updated and number of methods that must be implemented to
                 become up-to-date:'''
             f.write('\n' + '-' * 70 + '\n')
             f.write(fill(s) + '\n\n')
-    
+
             # Find also whether some adapter classes may be removed.
             adaptMinVersion = '9.9.99'
-            
+
             mailtoLst = []
             numRequired = len(self.requiredMethodsDic)
             for x in self.adaptIdLst:
@@ -1643,48 +1654,48 @@ class TrManager:
                     f.write('\n\tNote: ' + obj.note + '\n')
                 f.write('\n')
                 mailtoLst.extend(self.__emails(obj.classId)) # to maintainer
-                
+
                 # Check the level of required adapter classes.
                 if obj.status != '0.0.00' and obj.status < adaptMinVersion:
                     adaptMinVersion = obj.status
 
             fmail.write('\n\ntranslator based\n')
             fmail.write('; '.join(mailtoLst))
-                
-            # Set the note if some old translator adapters are not needed 
+
+            # Set the note if some old translator adapters are not needed
             # any more. Do it only when the script is called without arguments,
-            # i.e. all languages were checked against the needed translator 
-            # adapters. 
+            # i.e. all languages were checked against the needed translator
+            # adapters.
             if not self.script_argLst:
                 to_remove = {}
                 for version, adaptClassId in self.adaptMethodsDic.values():
                     if version < adaptMinVersion:
                         to_remove[adaptClassId] = True
-                
+
                 if to_remove:
                     lst = to_remove.keys()
                     lst.sort()
                     plural = len(lst) > 1
                     note = 'Note: The adapter class'
                     if plural: note += 'es'
-                    note += ' ' + ', '.join(lst)    
-                    if not plural: 
+                    note += ' ' + ', '.join(lst)
+                    if not plural:
                         note += ' is'
                     else:
                         note += ' are'
                     note += ' not used and can be removed.'
                     f.write('\n' + fill(note) + '\n')
-                
+
         # Write the list of the English-based classes.
         if self.EnBasedIdLst:
-            s = '''The following translator classes derive directly from the 
-                TranslatorEnglish. The class identifier has the suffix 'En' 
-                that says that this is intentional. Usually, there is also 
-                a non-English based version of the translator for 
+            s = '''The following translator classes derive directly from the
+                TranslatorEnglish. The class identifier has the suffix 'En'
+                that says that this is intentional. Usually, there is also
+                a non-English based version of the translator for
                 the language:'''
             f.write('\n' + '-' * 70 + '\n')
             f.write(fill(s) + '\n\n')
-    
+
             for x in self.EnBasedIdLst:
                 obj = self.__translDic[x]
                 f.write('  ' + obj.classId)
@@ -1692,7 +1703,7 @@ class TrManager:
                 if obj.note:
                     f.write(' -- ' + obj.note)
                 f.write('\n')
-            
+
         # Check for not used translator methods and generate warning if found.
         # The check is rather time consuming, so it is not done when report
         # is restricted to explicitly given language identifiers.
@@ -1700,42 +1711,42 @@ class TrManager:
             dic = self.__checkForNotUsedTrMethods()
             if dic:
                 s = '''WARNING: The following translator methods are declared
-                    in the Translator class but their identifiers do not appear 
-                    in source files. The situation should be checked. The .cpp 
-                    files and .h files excluding the '*translator*' files 
-                    in doxygen/src directory were simply searched for occurence 
+                    in the Translator class but their identifiers do not appear
+                    in source files. The situation should be checked. The .cpp
+                    files and .h files excluding the '*translator*' files
+                    in doxygen/src directory were simply searched for occurrence
                     of the method identifiers:'''
                 f.write('\n' + '=' * 70 + '\n')
                 f.write(fill(s) + '\n\n')
-                
+
                 keys = dic.keys()
                 keys.sort()
                 for key in keys:
                     f.write('  ' + dic[key] + '\n')
                 f.write('\n')
-        
+
         # Write the details for the translators.
         f.write('\n' + '=' * 70)
         f.write('\nDetails for translators (classes sorted alphabetically):\n')
-        
+
         cls = self.__translDic.keys()
         cls.sort()
-        
+
         for c in cls:
             obj = self.__translDic[c]
-            assert(obj.classId != 'Translator') 
+            assert(obj.classId != 'Translator')
             obj.report(f)
-                
-        # Close the report file and the auxiliary file with e-mails.     
+
+        # Close the report file and the auxiliary file with e-mails.
         f.close()
         fmail.close()
-        
-            
+
+
     def __loadMaintainers(self):
         """Load and process the file with the maintainers.
-        
+
         Fills the dictionary classId -> [(name, e-mail), ...]."""
-        
+
         fname = os.path.join(self.doc_path, self.maintainersFileName)
 
         # Include the maintainers file to the group of files checked with
@@ -1743,7 +1754,7 @@ class TrManager:
         tim = os.path.getmtime(fname)
         if tim > self.lastModificationTime:
             self.lastModificationTime = tim
-        
+
         # Process the content of the maintainers file.
         f = codecs.open(fname, 'r', 'utf-8')
         inside = False  # inside the record for the language
@@ -1754,26 +1765,26 @@ class TrManager:
         while lineReady:
             line = f.readline()            # next line
             lineReady = line != ''         # when eof, then line == ''
-                
+
             line = line.strip()            # eof should also behave as separator
             if line != u'' and line[0] == u'%':    # skip the comment line
-                continue           
-        
+                continue
+
             if not inside:                 # if outside of the record
                 if line != u'':            # should be language identifier
                     classId = line
                     maintainersLst = []
                     inside = True
                 # Otherwise skip empty line that do not act as separator.
-                
-            else:                          # if inside the record                       
+
+            else:                          # if inside the record
                 if line == u'':            # separator found
                     inside = False
                 else:
                     # If it is the first maintainer, create the empty list.
                     if not self.__maintainersDic.has_key(classId):
                         self.__maintainersDic[classId] = []
-                    
+
                     # Split the information about the maintainer and append
                     # the tuple. The address may be prefixed '[unreachable]'
                     # or whatever '[xxx]'. This will be processed later.
@@ -1783,11 +1794,11 @@ class TrManager:
                     self.__maintainersDic[classId].append(t)
         f.close()
 
-        
+
     def generateLanguageDoc(self):
         """Checks the modtime of files and generates language.doc."""
         self.__loadMaintainers()
-        
+
         # Check the last modification time of the template file. It is the
         # last file from the group that decide whether the documentation
         # should or should not be generated.
@@ -1796,14 +1807,14 @@ class TrManager:
         if tim > self.lastModificationTime:
             self.lastModificationTime = tim
 
-        # If the generated documentation exists and is newer than any of 
-        # the source files from the group, do not generate it and quit 
+        # If the generated documentation exists and is newer than any of
+        # the source files from the group, do not generate it and quit
         # quietly.
         fDocName = os.path.join(self.doc_path, self.languageDocFileName)
-        if os.path.isfile(fDocName): 
+        if os.path.isfile(fDocName):
             if os.path.getmtime(fDocName) > self.lastModificationTime:
                 return
-            
+
         # The document or does not exist or is older than some of the
         # sources. It must be generated again.
         #
@@ -1817,15 +1828,15 @@ class TrManager:
         assert pos != -1
         doctpl = doctpl[pos:]
 
-        # Fill the tplDic by symbols that will be inserted into the 
+        # Fill the tplDic by symbols that will be inserted into the
         # document template.
         tplDic = {}
-        
+
         s = u'Do not edit this file. It was generated by the %s script.' % self.script_name
         tplDic['editnote'] = s
-        
+
         tplDic['doxVersion'] = self.doxVersion
-        tplDic['supportedLangReadableStr'] = self.supportedLangReadableStr 
+        tplDic['supportedLangReadableStr'] = self.supportedLangReadableStr
         tplDic['translatorReportFileName'] = self.translatorReportFileName
 
         ahref = u'<a href="../doc/' + self.translatorReportFileName
@@ -1833,7 +1844,7 @@ class TrManager:
         ahref += u'</code></a>'
         tplDic['translatorReportLink'] = ahref
         tplDic['numLangStr'] = str(self.numLang)
-        
+
         # Define templates for HTML table parts of the documentation.
         htmlTableTpl = u'''\
             \\htmlonly
@@ -1857,7 +1868,7 @@ class TrManager:
             </table>
             \\endhtmlonly
             '''
-        htmlTableTpl = dedent(htmlTableTpl)    
+        htmlTableTpl = dedent(htmlTableTpl)
         htmlTrTpl = u'\n  <tr bgcolor="#ffffff">%s\n  </tr>'
         htmlTdTpl = u'\n    <td>%s</td>'
 
@@ -1868,10 +1879,10 @@ class TrManager:
             # Fill the table data elements for one row. The first element
             # contains the readable name of the language.
             lst = [ htmlTdTpl % obj.langReadable ]
-            
-            # The next two elements contain the list of maintainers 
+
+            # The next two elements contain the list of maintainers
             # and the list of their mangled e-mails. For English-based
-            # translators that are coupled with the non-English based, 
+            # translators that are coupled with the non-English based,
             # insert the 'see' note.
             mm = None  # init -- maintainer
             ee = None  # init -- e-mail address
@@ -1882,11 +1893,11 @@ class TrManager:
                     lang = self.__translDic[classId].langReadable
                     mm = u'see the %s language' % lang
                     ee = u'&nbsp;'
-            
+
             if not mm and obj.classId in self.__maintainersDic:
                 # Build a string of names separated by the HTML break element.
                 # Special notes used instead of names are highlighted.
-                lm = []  
+                lm = []
                 for maintainer in self.__maintainersDic[obj.classId]:
                     name = maintainer[0]
                     if name.startswith(u'--'):
@@ -1894,8 +1905,8 @@ class TrManager:
                                + name + u'</span>'
                     lm.append(name)
                 mm = u'<br/>'.join(lm)
-                
-                # The marked adresses (they start with the mark '[unreachable]', 
+
+                # The marked adresses (they start with the mark '[unreachable]',
                 # '[resigned]', whatever '[xxx]') will not be displayed at all.
                 # Only the mark will be used instead.
                 rexMark = re.compile(ur'(?P<mark>\[.*?\])')
@@ -1906,28 +1917,28 @@ class TrManager:
                     if m is not None:
                         address = u'<span style="color: brown">'\
                                   + m.group(u'mark') + u'</span>'
-                    le.append(address)    
+                    le.append(address)
                 ee = u'<br/>'.join(le)
-            
+
             # Append the maintainer and e-mail elements.
             lst.append(htmlTdTpl % mm)
             lst.append(htmlTdTpl % ee)
-            
+
             # The last element contains the readable form of the status.
             lst.append(htmlTdTpl % obj.readableStatus)
-            
-            # Join the table data to one table row. 
+
+            # Join the table data to one table row.
             trlst.append(htmlTrTpl % (''.join(lst)))
-             
+
         # Join the table rows and insert into the template.
         htmlTable = htmlTableTpl % (''.join(trlst))
-        
+
         # Define templates for LaTeX table parts of the documentation.
         latexTableTpl = ur'''
             \latexonly
             \footnotesize
             \begin{longtable}{|l|l|l|l|}
-              \hline 
+              \hline
               {\bf Language} & {\bf Maintainer} & {\bf Contact address} & {\bf Status} \\
               \hline
             %s
@@ -1936,7 +1947,7 @@ class TrManager:
             \normalsize
             \endlatexonly
             '''
-        latexTableTpl = dedent(latexTableTpl)    
+        latexTableTpl = dedent(latexTableTpl)
         latexLineTpl = u'\n' + r'  %s & %s & {\tt\tiny %s} & %s \\'
 
         # Loop through transl objects in the order of sorted readable names
@@ -1961,9 +1972,9 @@ class TrManager:
                     langNE = self.__translDic[classId].langReadable
                     maintainer = u'see the %s language' % langNE
                     email = u'~'
-            
+
             if not maintainer and (obj.classId in self.__maintainersDic):
-                lm = [ m[0] for m in self.__maintainersDic[obj.classId] ]  
+                lm = [ m[0] for m in self.__maintainersDic[obj.classId] ]
                 maintainer = maintainers[0][0]
                 email = maintainers[0][1]
 
@@ -1976,7 +1987,7 @@ class TrManager:
             s = latexLineTpl % (lang, maintainer, email, status)
             s = s.replace(u'_', u'\\_')
             trlst.append(s)
-                        
+
             # List the other maintainers for the language. Do not set
             # lang and status for them.
             lang = u'~'
@@ -1987,26 +1998,26 @@ class TrManager:
                 s = latexLineTpl % (lang, maintainer, email, status)
                 s = s.replace(u'_', u'\\_')
                 trlst.append(s)
-            
+
         # Join the table lines and insert into the template.
         latexTable = latexTableTpl % (u''.join(trlst))
-            
+
         # Put the HTML and LaTeX parts together and define the dic item.
-        tplDic['informationTable'] = htmlTable + u'\n' + latexTable 
+        tplDic['informationTable'] = htmlTable + u'\n' + latexTable
 
         # Insert the symbols into the document template and write it down.
         f = codecs.open(fDocName, 'w', 'utf-8')
         f.write(doctpl % tplDic)
         f.close()
-                    
+
 if __name__ == '__main__':
-    
+
     # Create the manager, build the transl objects, and parse the related
     # sources.
     trMan = TrManager()
 
     # Generate the language.doc.
     trMan.generateLanguageDoc()
-    
+
     # Generate the translator report.
     trMan.generateTranslatorReport()
index ad25228..0fffb30 100644 (file)
@@ -1,32 +1,29 @@
-(1.8.2)
+(1.8.3.1)
 
-Doxygen supports the following 39 languages (sorted alphabetically):
+Doxygen supports the following 40 languages (sorted alphabetically):
 
 Afrikaans, Arabic, Armenian, Brazilian Portuguese, Catalan, Chinese,
 Chinese Traditional, Croatian, Czech, Danish, Dutch, English,
 Esperanto, Finnish, French, German, Greek, Hungarian, Indonesian,
-Italian, Japanese (+En), Korean (+En), Lithuanian, Macedonian,
-Norwegian, Persian, Polish, Portuguese, Romanian, Russian, Serbian,
-SerbianCyrilic, Slovak, Slovene, Spanish, Swedish, Turkish, Ukrainian,
-and Vietnamese.
+Italian, Japanese (+En), Korean (+En), Latvian, Lithuanian,
+Macedonian, Norwegian, Persian, Polish, Portuguese, Romanian, Russian,
+Serbian, SerbianCyrilic, Slovak, Slovene, Spanish, Swedish, Turkish,
+Ukrainian, and Vietnamese.
 
-Of them, 8 translators are up-to-date, 31 translators are based on
+Of them, 5 translators are up-to-date, 35 translators are based on
 some adapter class, and 2 are English based.
 
 ----------------------------------------------------------------------
 The following translator classes are up-to-date (sorted
 alphabetically). This means that they derive from the Translator class
-and they implement all 242 of the required methods. Anyway, there
+and they implement all 250 of the required methods. Anyway, there
 still may be some details listed even for them:
 
-  TranslatorCzech
-  TranslatorDutch
   TranslatorEnglish
-  TranslatorEsperanto
-  TranslatorGerman
-  TranslatorGreek
+  TranslatorKorean -- Change the base class to Translator.
+  TranslatorLatvian -- Reimplementation using UTF-8 suggested.
+  TranslatorRomanian -- Reimplementation using UTF-8 suggested.
   TranslatorSlovak
-  TranslatorSpanish
 
 ----------------------------------------------------------------------
 The following translator classes need some maintenance (the most
@@ -34,71 +31,81 @@ obsolete at the end). The other info shows the estimation of Doxygen
 version when the class was last updated and number of methods that
 must be implemented to become up-to-date:
 
-  TranslatorPolish                1.8.2         7 methods to implement (2 %)
-  TranslatorKorean                1.8.02        7 methods to implement (2 %)
-       Note: Change the base class to TranslatorAdapter_1_8_2.
+  TranslatorUkrainian             1.8.04        8 methods to implement (3 %)
+       Note: Change the base class to TranslatorAdapter_1_8_4.
 
-  TranslatorItalian               1.8.2         7 methods to implement (2 %)
-  TranslatorCroatian              1.8.2         7 methods to implement (2 %)
-  TranslatorChinese               1.8.2         7 methods to implement (2 %)
-  TranslatorPortuguese            1.8.0        14 methods to implement (5 %)
-  TranslatorIndonesian            1.8.0        14 methods to implement (5 %)
-       Note: Reimplementation using UTF-8 suggested.
+  TranslatorSpanish               1.8.04        8 methods to implement (3 %)
+       Note: Change the base class to TranslatorAdapter_1_8_4.
 
-  TranslatorFrench                1.8.0        14 methods to implement (5 %)
-       Note: Reimplementation using UTF-8 suggested.
+  TranslatorGreek                 1.8.04        8 methods to implement (3 %)
+       Note: Change the base class to TranslatorAdapter_1_8_4.
 
-  TranslatorDanish                1.8.0        14 methods to implement (5 %)
-       Note: Reimplementation using UTF-8 suggested.
+  TranslatorGerman                1.8.04        8 methods to implement (3 %)
+       Note: Change the base class to TranslatorAdapter_1_8_4.
+
+  TranslatorEsperanto             1.8.04        8 methods to implement (3 %)
+       Note: Change the base class to TranslatorAdapter_1_8_4.
+
+  TranslatorDutch                 1.8.04        8 methods to implement (3 %)
+       Note: Change the base class to TranslatorAdapter_1_8_4.
+
+  TranslatorCzech                 1.8.04        8 methods to implement (3 %)
+       Note: Change the base class to TranslatorAdapter_1_8_4.
 
-  TranslatorChinesetraditional    1.8.0        14 methods to implement (5 %)
+  TranslatorPolish                1.8.2        14 methods to implement (5 %)
+  TranslatorItalian               1.8.2        15 methods to implement (6 %)
+  TranslatorCroatian              1.8.2        15 methods to implement (6 %)
+  TranslatorChinese               1.8.2        15 methods to implement (6 %)
+  TranslatorPortuguese            1.8.0        22 methods to implement (8 %)
+  TranslatorIndonesian            1.8.0        22 methods to implement (8 %)
        Note: Reimplementation using UTF-8 suggested.
 
-  TranslatorCatalan               1.8.0        14 methods to implement (5 %)
-  TranslatorBrazilian             1.8.0        14 methods to implement (5 %)
-  TranslatorArmenian              1.8.0        14 methods to implement (5 %)
-  TranslatorTurkish               1.7.5        17 methods to implement (7 %)
-  TranslatorRussian               1.7.5        17 methods to implement (7 %)
+  TranslatorFrench                1.8.0        22 methods to implement (8 %)
        Note: Reimplementation using UTF-8 suggested.
 
-  TranslatorPersian               1.7.5        17 methods to implement (7 %)
-  TranslatorVietnamese            1.6.0        26 methods to implement (10 %)
-  TranslatorSwedish               1.6.0        26 methods to implement (10 %)
+  TranslatorDanish                1.8.0        22 methods to implement (8 %)
        Note: Reimplementation using UTF-8 suggested.
 
-  TranslatorSerbian               1.6.0        26 methods to implement (10 %)
+  TranslatorChinesetraditional    1.8.0        22 methods to implement (8 %)
        Note: Reimplementation using UTF-8 suggested.
 
-  TranslatorSerbianCyrilic        1.6.0        26 methods to implement (10 %)
-  TranslatorRomanian              1.6.0        26 methods to implement (10 %)
+  TranslatorCatalan               1.8.0        22 methods to implement (8 %)
+  TranslatorBrazilian             1.8.0        22 methods to implement (8 %)
+  TranslatorArmenian              1.8.0        22 methods to implement (8 %)
+  TranslatorTurkish               1.7.5        25 methods to implement (10 %)
+  TranslatorRussian               1.7.5        25 methods to implement (10 %)
        Note: Reimplementation using UTF-8 suggested.
 
-  TranslatorMacedonian            1.6.0        26 methods to implement (10 %)
-  TranslatorJapanese              1.6.0        26 methods to implement (10 %)
+  TranslatorPersian               1.7.5        25 methods to implement (10 %)
+  TranslatorVietnamese            1.6.0        34 methods to implement (13 %)
+  TranslatorSwedish               1.6.0        34 methods to implement (13 %)
        Note: Reimplementation using UTF-8 suggested.
 
-  TranslatorFinnish               1.6.0        26 methods to implement (10 %)
-  TranslatorAfrikaans             1.6.0        26 methods to implement (10 %)
+  TranslatorSerbian               1.6.0        34 methods to implement (13 %)
        Note: Reimplementation using UTF-8 suggested.
 
-  TranslatorSlovene               1.4.6        50 methods to implement (20 %)
+  TranslatorSerbianCyrilic        1.6.0        34 methods to implement (13 %)
+  TranslatorMacedonian            1.6.0        34 methods to implement (13 %)
+  TranslatorJapanese              1.6.0        33 methods to implement (13 %)
        Note: Reimplementation using UTF-8 suggested.
 
-  TranslatorNorwegian             1.4.6        49 methods to implement (20 %)
+  TranslatorFinnish               1.6.0        34 methods to implement (13 %)
+  TranslatorAfrikaans             1.6.0        34 methods to implement (13 %)
        Note: Reimplementation using UTF-8 suggested.
 
-  TranslatorLithuanian            1.4.6        50 methods to implement (20 %)
+  TranslatorSlovene               1.4.6        58 methods to implement (23 %)
        Note: Reimplementation using UTF-8 suggested.
 
-  TranslatorHungarian             1.4.6        50 methods to implement (20 %)
+  TranslatorNorwegian             1.4.6        56 methods to implement (22 %)
        Note: Reimplementation using UTF-8 suggested.
 
-  TranslatorArabic                1.4.6        49 methods to implement (20 %)
+  TranslatorLithuanian            1.4.6        58 methods to implement (23 %)
        Note: Reimplementation using UTF-8 suggested.
 
-  TranslatorUkrainian             1.4.1        50 methods to implement (20 %)
+  TranslatorHungarian             1.4.6        58 methods to implement (23 %)
        Note: Reimplementation using UTF-8 suggested.
 
+  TranslatorArabic                1.4.6        56 methods to implement (22 %)
 
 ----------------------------------------------------------------------
 The following translator classes derive directly from the
@@ -114,7 +121,7 @@ WARNING: The following translator methods are declared in the
 Translator class but their identifiers do not appear in source files.
 The situation should be checked. The .cpp files and .h files excluding
 the '*translator*' files in doxygen/src directory were simply searched
-for occurence of the method identifiers:
+for occurrence of the method identifiers:
 
   QCString idLanguageCharset()
   QCString trAlphabeticalList()
@@ -123,6 +130,7 @@ for occurence of the method identifiers:
   QCString trFuncProtos()
   QCString trFunctionPrototypeDocumentation()
   QCString trSearchForIndex()
+  QCString trWrittenBy()
 
 
 ======================================================================
@@ -130,10 +138,10 @@ Details for translators (classes sorted alphabetically):
 
 
 
-TranslatorAfrikaans   (TranslatorAdapter_1_6_0)  26 methods to implement (10 %)
+TranslatorAfrikaans   (TranslatorAdapter_1_6_0)  34 methods to implement (13 %)
 -------------------
 
-  Implements 216 of the required methods (89 %).
+  Implements 216 of the required methods (86 %).
 
   Missing methods (should be implemented):
 
@@ -143,12 +151,16 @@ TranslatorAfrikaans   (TranslatorAdapter_1_6_0)  26 methods to implement (10 %)
     virtual QCString trNoMatches()
     virtual QCString trLoading()
     virtual QCString trDateTime(int year, int month, int day, int dayOfWeek, int hour, int minutes, int seconds, bool includeTime)
+    virtual QCString trServices()
     virtual QCString trFileIn(const char * name)
     virtual QCString trClassMethods()
     virtual QCString trProvidedByCategory()
+    virtual QCString trSingletonGeneratedFromFiles(bool single)
     virtual QCString trGlobalNamespace()
+    virtual QCString trServiceReference(const char * sName)
     virtual QCString trDesignOverview()
     virtual QCString trAndMore(const QCString & number)
+    virtual QCString trConstantGroups()
     virtual QCString trDirDepGraph(const char * name)
     virtual QCString trDirRelation(const char * name)
     virtual QCString trMethodDocumentation()
@@ -157,18 +169,22 @@ TranslatorAfrikaans   (TranslatorAdapter_1_6_0)  26 methods to implement (10 %)
     virtual QCString trCiteReferences()
     virtual QCString trAdditionalInheritedMembers()
     virtual QCString trDirDependency(const char * name)
+    virtual QCString trInterfaces()
     virtual QCString trCopyright()
     virtual QCString trIncludesFileIn(const char * name)
+    virtual QCString trServiceGeneratedFromFiles(bool single)
     virtual QCString trEnumGeneratedFromFiles(bool single)
+    virtual QCString trConstantGroupReference(const char * namespaceName)
     virtual QCString trPanelSynchronisationTooltip(bool enable)
     virtual QCString trExtendsClass()
+    virtual QCString trSingletonReference(const char * sName)
     virtual QCString trInstanceMethods()
 
 
-TranslatorArabic   (TranslatorAdapter_1_4_6)  49 methods to implement (20 %)
+TranslatorArabic   (TranslatorAdapter_1_4_6)  56 methods to implement (22 %)
 ----------------
 
-  Implements 193 of the required methods (79 %).
+  Implements 194 of the required methods (77 %).
 
   Missing methods (should be implemented):
 
@@ -181,18 +197,22 @@ TranslatorArabic   (TranslatorAdapter_1_4_6)  49 methods to implement (20 %)
     virtual QCString trLoading()
     virtual QCString trSubprograms()
     virtual QCString trDateTime(int year, int month, int day, int dayOfWeek, int hour, int minutes, int seconds, bool includeTime)
+    virtual QCString trServices()
     virtual QCString trModulesListDescription(bool extractAll)
     virtual QCString trModulesList()
     virtual QCString trTypeConstraints()
     virtual QCString trFileIn(const char * name)
     virtual QCString trClassMethods()
     virtual QCString trProvidedByCategory()
+    virtual QCString trSingletonGeneratedFromFiles(bool single)
     virtual QCString trGlobalNamespace()
     virtual QCString trMemberFunctionDocumentationFortran()
     virtual QCString trCompoundListDescriptionFortran()
+    virtual QCString trServiceReference(const char * sName)
     virtual QCString trDesignOverview()
     virtual QCString trTypeDocumentation()
     virtual QCString trAndMore(const QCString & number)
+    virtual QCString trConstantGroups()
     virtual QCString trModuleReference(const char * namespaceName)
     virtual QCString trModulesMemberDescription(bool extractAll)
     virtual QCString trModulesMembers()
@@ -209,9 +229,11 @@ TranslatorArabic   (TranslatorAdapter_1_4_6)  49 methods to implement (20 %)
     virtual QCString trDirDependency(const char * name)
     virtual QCString trCopyright()
     virtual QCString trIncludesFileIn(const char * name)
+    virtual QCString trServiceGeneratedFromFiles(bool single)
     virtual QCString trEnumGeneratedFromFiles(bool single)
     virtual QCString trCompoundIndexFortran()
     virtual QCString trSubprogram(bool first_capital, bool singular)
+    virtual QCString trConstantGroupReference(const char * namespaceName)
     virtual QCString trPanelSynchronisationTooltip(bool enable)
     virtual QCString trCallerGraph()
     virtual QCString trExtendsClass()
@@ -220,6 +242,7 @@ TranslatorArabic   (TranslatorAdapter_1_4_6)  49 methods to implement (20 %)
     virtual QCString trModule(bool first_capital, bool singular)
     virtual QCString trCompoundMembersFortran()
     virtual QCString trSubprogramDocumentation()
+    virtual QCString trSingletonReference(const char * sName)
     virtual QCString trInstanceMethods()
 
   Obsolete methods (should be removed, never used):
@@ -229,163 +252,269 @@ TranslatorArabic   (TranslatorAdapter_1_4_6)  49 methods to implement (20 %)
     virtual QCString trPackageDocumentation()
     virtual QCString trSources()
     virtual QCString trReimplementedForInternalReasons()
-    virtual QCString trInterfaces()
     virtual QCString trHeaderFiles()
     virtual QCString trBugsAndLimitations()
     virtual QCString trNoDescriptionAvailable()
 
 
-TranslatorArmenian   (TranslatorAdapter_1_8_0)  14 methods to implement (5 %)
+TranslatorArmenian   (TranslatorAdapter_1_8_0)  22 methods to implement (8 %)
 ------------------
 
-  Implements 228 of the required methods (94 %).
+  Implements 228 of the required methods (91 %).
 
   Missing methods (should be implemented):
 
     virtual QCString trDetailLevel()
     virtual QCString trTemplateParameters()
+    virtual QCString trServices()
     virtual QCString trClassMethods()
     virtual QCString trProvidedByCategory()
+    virtual QCString trSingletonGeneratedFromFiles(bool single)
+    virtual QCString trServiceReference(const char * sName)
     virtual QCString trDesignOverview()
     virtual QCString trAndMore(const QCString & number)
+    virtual QCString trConstantGroups()
     virtual QCString trMethodDocumentation()
     virtual QCString trEnumReference(const char * name)
     virtual QCString trInheritedFrom(const char * members, const char * what)
     virtual QCString trAdditionalInheritedMembers()
+    virtual QCString trInterfaces()
+    virtual QCString trServiceGeneratedFromFiles(bool single)
     virtual QCString trEnumGeneratedFromFiles(bool single)
+    virtual QCString trConstantGroupReference(const char * namespaceName)
     virtual QCString trPanelSynchronisationTooltip(bool enable)
     virtual QCString trExtendsClass()
+    virtual QCString trSingletonReference(const char * sName)
     virtual QCString trInstanceMethods()
 
 
-TranslatorBrazilian   (TranslatorAdapter_1_8_0)  14 methods to implement (5 %)
+TranslatorBrazilian   (TranslatorAdapter_1_8_0)  22 methods to implement (8 %)
 -------------------
 
-  Implements 228 of the required methods (94 %).
+  Implements 228 of the required methods (91 %).
 
   Missing methods (should be implemented):
 
     virtual QCString trDetailLevel()
     virtual QCString trTemplateParameters()
+    virtual QCString trServices()
     virtual QCString trClassMethods()
     virtual QCString trProvidedByCategory()
+    virtual QCString trSingletonGeneratedFromFiles(bool single)
+    virtual QCString trServiceReference(const char * sName)
     virtual QCString trDesignOverview()
     virtual QCString trAndMore(const QCString & number)
+    virtual QCString trConstantGroups()
     virtual QCString trMethodDocumentation()
     virtual QCString trEnumReference(const char * name)
     virtual QCString trInheritedFrom(const char * members, const char * what)
     virtual QCString trAdditionalInheritedMembers()
+    virtual QCString trInterfaces()
+    virtual QCString trServiceGeneratedFromFiles(bool single)
     virtual QCString trEnumGeneratedFromFiles(bool single)
+    virtual QCString trConstantGroupReference(const char * namespaceName)
     virtual QCString trPanelSynchronisationTooltip(bool enable)
     virtual QCString trExtendsClass()
+    virtual QCString trSingletonReference(const char * sName)
     virtual QCString trInstanceMethods()
 
 
-TranslatorCatalan   (TranslatorAdapter_1_8_0)  14 methods to implement (5 %)
+TranslatorCatalan   (TranslatorAdapter_1_8_0)  22 methods to implement (8 %)
 -----------------
 
-  Implements 228 of the required methods (94 %).
+  Implements 228 of the required methods (91 %).
 
   Missing methods (should be implemented):
 
     virtual QCString trDetailLevel()
     virtual QCString trTemplateParameters()
+    virtual QCString trServices()
     virtual QCString trClassMethods()
     virtual QCString trProvidedByCategory()
+    virtual QCString trSingletonGeneratedFromFiles(bool single)
+    virtual QCString trServiceReference(const char * sName)
     virtual QCString trDesignOverview()
     virtual QCString trAndMore(const QCString & number)
+    virtual QCString trConstantGroups()
     virtual QCString trMethodDocumentation()
     virtual QCString trEnumReference(const char * name)
     virtual QCString trInheritedFrom(const char * members, const char * what)
     virtual QCString trAdditionalInheritedMembers()
+    virtual QCString trInterfaces()
+    virtual QCString trServiceGeneratedFromFiles(bool single)
     virtual QCString trEnumGeneratedFromFiles(bool single)
+    virtual QCString trConstantGroupReference(const char * namespaceName)
     virtual QCString trPanelSynchronisationTooltip(bool enable)
     virtual QCString trExtendsClass()
+    virtual QCString trSingletonReference(const char * sName)
     virtual QCString trInstanceMethods()
 
 
-TranslatorChinese   (TranslatorAdapter_1_8_2)  7 methods to implement (2 %)
+TranslatorChinese   (TranslatorAdapter_1_8_2)  15 methods to implement (6 %)
 -----------------
 
-  Implements 235 of the required methods (97 %).
+  Implements 235 of the required methods (94 %).
 
   Missing methods (should be implemented):
 
+    virtual QCString trServices()
     virtual QCString trClassMethods()
     virtual QCString trProvidedByCategory()
+    virtual QCString trSingletonGeneratedFromFiles(bool single)
+    virtual QCString trServiceReference(const char * sName)
     virtual QCString trDesignOverview()
+    virtual QCString trConstantGroups()
     virtual QCString trMethodDocumentation()
+    virtual QCString trInterfaces()
+    virtual QCString trServiceGeneratedFromFiles(bool single)
+    virtual QCString trConstantGroupReference(const char * namespaceName)
     virtual QCString trPanelSynchronisationTooltip(bool enable)
     virtual QCString trExtendsClass()
+    virtual QCString trSingletonReference(const char * sName)
     virtual QCString trInstanceMethods()
 
 
-TranslatorChinesetraditional   (TranslatorAdapter_1_8_0)  14 methods to implement (5 %)
+TranslatorChinesetraditional   (TranslatorAdapter_1_8_0)  22 methods to implement (8 %)
 ----------------------------
 
-  Implements 228 of the required methods (94 %).
+  Implements 228 of the required methods (91 %).
 
   Missing methods (should be implemented):
 
     virtual QCString trDetailLevel()
     virtual QCString trTemplateParameters()
+    virtual QCString trServices()
     virtual QCString trClassMethods()
     virtual QCString trProvidedByCategory()
+    virtual QCString trSingletonGeneratedFromFiles(bool single)
+    virtual QCString trServiceReference(const char * sName)
     virtual QCString trDesignOverview()
     virtual QCString trAndMore(const QCString & number)
+    virtual QCString trConstantGroups()
     virtual QCString trMethodDocumentation()
     virtual QCString trEnumReference(const char * name)
     virtual QCString trInheritedFrom(const char * members, const char * what)
     virtual QCString trAdditionalInheritedMembers()
+    virtual QCString trInterfaces()
+    virtual QCString trServiceGeneratedFromFiles(bool single)
     virtual QCString trEnumGeneratedFromFiles(bool single)
+    virtual QCString trConstantGroupReference(const char * namespaceName)
     virtual QCString trPanelSynchronisationTooltip(bool enable)
     virtual QCString trExtendsClass()
+    virtual QCString trSingletonReference(const char * sName)
     virtual QCString trInstanceMethods()
 
 
-TranslatorCroatian   (TranslatorAdapter_1_8_2)  7 methods to implement (2 %)
+TranslatorCroatian   (TranslatorAdapter_1_8_2)  15 methods to implement (6 %)
 ------------------
 
-  Implements 235 of the required methods (97 %).
+  Implements 235 of the required methods (94 %).
 
   Missing methods (should be implemented):
 
+    virtual QCString trServices()
     virtual QCString trClassMethods()
     virtual QCString trProvidedByCategory()
+    virtual QCString trSingletonGeneratedFromFiles(bool single)
+    virtual QCString trServiceReference(const char * sName)
     virtual QCString trDesignOverview()
+    virtual QCString trConstantGroups()
     virtual QCString trMethodDocumentation()
+    virtual QCString trInterfaces()
+    virtual QCString trServiceGeneratedFromFiles(bool single)
+    virtual QCString trConstantGroupReference(const char * namespaceName)
     virtual QCString trPanelSynchronisationTooltip(bool enable)
     virtual QCString trExtendsClass()
+    virtual QCString trSingletonReference(const char * sName)
     virtual QCString trInstanceMethods()
 
 
-TranslatorDanish   (TranslatorAdapter_1_8_0)  14 methods to implement (5 %)
+TranslatorCzech   (TranslatorAdapter_1_8_2)  8 methods to implement (3 %)
+---------------
+
+  Implements 242 of the required methods (96 %).
+
+  Missing methods (should be implemented):
+
+    virtual QCString trServices()
+    virtual QCString trSingletonGeneratedFromFiles(bool single)
+    virtual QCString trServiceReference(const char * sName)
+    virtual QCString trConstantGroups()
+    virtual QCString trInterfaces()
+    virtual QCString trServiceGeneratedFromFiles(bool single)
+    virtual QCString trConstantGroupReference(const char * namespaceName)
+    virtual QCString trSingletonReference(const char * sName)
+
+
+TranslatorDanish   (TranslatorAdapter_1_8_0)  22 methods to implement (8 %)
 ----------------
 
-  Implements 228 of the required methods (94 %).
+  Implements 228 of the required methods (91 %).
 
   Missing methods (should be implemented):
 
     virtual QCString trDetailLevel()
     virtual QCString trTemplateParameters()
+    virtual QCString trServices()
     virtual QCString trClassMethods()
     virtual QCString trProvidedByCategory()
+    virtual QCString trSingletonGeneratedFromFiles(bool single)
+    virtual QCString trServiceReference(const char * sName)
     virtual QCString trDesignOverview()
     virtual QCString trAndMore(const QCString & number)
+    virtual QCString trConstantGroups()
     virtual QCString trMethodDocumentation()
     virtual QCString trEnumReference(const char * name)
     virtual QCString trInheritedFrom(const char * members, const char * what)
     virtual QCString trAdditionalInheritedMembers()
+    virtual QCString trInterfaces()
+    virtual QCString trServiceGeneratedFromFiles(bool single)
     virtual QCString trEnumGeneratedFromFiles(bool single)
+    virtual QCString trConstantGroupReference(const char * namespaceName)
     virtual QCString trPanelSynchronisationTooltip(bool enable)
     virtual QCString trExtendsClass()
+    virtual QCString trSingletonReference(const char * sName)
     virtual QCString trInstanceMethods()
 
 
-TranslatorFinnish   (TranslatorAdapter_1_6_0)  26 methods to implement (10 %)
+TranslatorDutch   (TranslatorAdapter_1_8_2)  8 methods to implement (3 %)
+---------------
+
+  Implements 242 of the required methods (96 %).
+
+  Missing methods (should be implemented):
+
+    virtual QCString trServices()
+    virtual QCString trSingletonGeneratedFromFiles(bool single)
+    virtual QCString trServiceReference(const char * sName)
+    virtual QCString trConstantGroups()
+    virtual QCString trInterfaces()
+    virtual QCString trServiceGeneratedFromFiles(bool single)
+    virtual QCString trConstantGroupReference(const char * namespaceName)
+    virtual QCString trSingletonReference(const char * sName)
+
+
+TranslatorEsperanto   (TranslatorAdapter_1_8_2)  8 methods to implement (3 %)
+-------------------
+
+  Implements 242 of the required methods (96 %).
+
+  Missing methods (should be implemented):
+
+    virtual QCString trServices()
+    virtual QCString trSingletonGeneratedFromFiles(bool single)
+    virtual QCString trServiceReference(const char * sName)
+    virtual QCString trConstantGroups()
+    virtual QCString trInterfaces()
+    virtual QCString trServiceGeneratedFromFiles(bool single)
+    virtual QCString trConstantGroupReference(const char * namespaceName)
+    virtual QCString trSingletonReference(const char * sName)
+
+
+TranslatorFinnish   (TranslatorAdapter_1_6_0)  34 methods to implement (13 %)
 -----------------
 
-  Implements 216 of the required methods (89 %).
+  Implements 216 of the required methods (86 %).
 
   Missing methods (should be implemented):
 
@@ -395,12 +524,16 @@ TranslatorFinnish   (TranslatorAdapter_1_6_0)  26 methods to implement (10 %)
     virtual QCString trNoMatches()
     virtual QCString trLoading()
     virtual QCString trDateTime(int year, int month, int day, int dayOfWeek, int hour, int minutes, int seconds, bool includeTime)
+    virtual QCString trServices()
     virtual QCString trFileIn(const char * name)
     virtual QCString trClassMethods()
     virtual QCString trProvidedByCategory()
+    virtual QCString trSingletonGeneratedFromFiles(bool single)
     virtual QCString trGlobalNamespace()
+    virtual QCString trServiceReference(const char * sName)
     virtual QCString trDesignOverview()
     virtual QCString trAndMore(const QCString & number)
+    virtual QCString trConstantGroups()
     virtual QCString trDirDepGraph(const char * name)
     virtual QCString trDirRelation(const char * name)
     virtual QCString trMethodDocumentation()
@@ -409,41 +542,87 @@ TranslatorFinnish   (TranslatorAdapter_1_6_0)  26 methods to implement (10 %)
     virtual QCString trCiteReferences()
     virtual QCString trAdditionalInheritedMembers()
     virtual QCString trDirDependency(const char * name)
+    virtual QCString trInterfaces()
     virtual QCString trCopyright()
     virtual QCString trIncludesFileIn(const char * name)
+    virtual QCString trServiceGeneratedFromFiles(bool single)
     virtual QCString trEnumGeneratedFromFiles(bool single)
+    virtual QCString trConstantGroupReference(const char * namespaceName)
     virtual QCString trPanelSynchronisationTooltip(bool enable)
     virtual QCString trExtendsClass()
+    virtual QCString trSingletonReference(const char * sName)
     virtual QCString trInstanceMethods()
 
 
-TranslatorFrench   (TranslatorAdapter_1_8_0)  14 methods to implement (5 %)
+TranslatorFrench   (TranslatorAdapter_1_8_0)  22 methods to implement (8 %)
 ----------------
 
-  Implements 228 of the required methods (94 %).
+  Implements 228 of the required methods (91 %).
 
   Missing methods (should be implemented):
 
     virtual QCString trDetailLevel()
     virtual QCString trTemplateParameters()
+    virtual QCString trServices()
     virtual QCString trClassMethods()
     virtual QCString trProvidedByCategory()
+    virtual QCString trSingletonGeneratedFromFiles(bool single)
+    virtual QCString trServiceReference(const char * sName)
     virtual QCString trDesignOverview()
     virtual QCString trAndMore(const QCString & number)
+    virtual QCString trConstantGroups()
     virtual QCString trMethodDocumentation()
     virtual QCString trEnumReference(const char * name)
     virtual QCString trInheritedFrom(const char * members, const char * what)
     virtual QCString trAdditionalInheritedMembers()
+    virtual QCString trInterfaces()
+    virtual QCString trServiceGeneratedFromFiles(bool single)
     virtual QCString trEnumGeneratedFromFiles(bool single)
+    virtual QCString trConstantGroupReference(const char * namespaceName)
     virtual QCString trPanelSynchronisationTooltip(bool enable)
     virtual QCString trExtendsClass()
+    virtual QCString trSingletonReference(const char * sName)
     virtual QCString trInstanceMethods()
 
 
-TranslatorHungarian   (TranslatorAdapter_1_4_6)  50 methods to implement (20 %)
+TranslatorGerman   (TranslatorAdapter_1_8_2)  8 methods to implement (3 %)
+----------------
+
+  Implements 242 of the required methods (96 %).
+
+  Missing methods (should be implemented):
+
+    virtual QCString trServices()
+    virtual QCString trSingletonGeneratedFromFiles(bool single)
+    virtual QCString trServiceReference(const char * sName)
+    virtual QCString trConstantGroups()
+    virtual QCString trInterfaces()
+    virtual QCString trServiceGeneratedFromFiles(bool single)
+    virtual QCString trConstantGroupReference(const char * namespaceName)
+    virtual QCString trSingletonReference(const char * sName)
+
+
+TranslatorGreek   (TranslatorAdapter_1_8_2)  8 methods to implement (3 %)
+---------------
+
+  Implements 242 of the required methods (96 %).
+
+  Missing methods (should be implemented):
+
+    virtual QCString trServices()
+    virtual QCString trSingletonGeneratedFromFiles(bool single)
+    virtual QCString trServiceReference(const char * sName)
+    virtual QCString trConstantGroups()
+    virtual QCString trInterfaces()
+    virtual QCString trServiceGeneratedFromFiles(bool single)
+    virtual QCString trConstantGroupReference(const char * namespaceName)
+    virtual QCString trSingletonReference(const char * sName)
+
+
+TranslatorHungarian   (TranslatorAdapter_1_4_6)  58 methods to implement (23 %)
 -------------------
 
-  Implements 192 of the required methods (79 %).
+  Implements 192 of the required methods (76 %).
 
   Missing methods (should be implemented):
 
@@ -456,18 +635,22 @@ TranslatorHungarian   (TranslatorAdapter_1_4_6)  50 methods to implement (20 %)
     virtual QCString trLoading()
     virtual QCString trSubprograms()
     virtual QCString trDateTime(int year, int month, int day, int dayOfWeek, int hour, int minutes, int seconds, bool includeTime)
+    virtual QCString trServices()
     virtual QCString trModulesListDescription(bool extractAll)
     virtual QCString trModulesList()
     virtual QCString trTypeConstraints()
     virtual QCString trFileIn(const char * name)
     virtual QCString trClassMethods()
     virtual QCString trProvidedByCategory()
+    virtual QCString trSingletonGeneratedFromFiles(bool single)
     virtual QCString trGlobalNamespace()
     virtual QCString trMemberFunctionDocumentationFortran()
     virtual QCString trCompoundListDescriptionFortran()
+    virtual QCString trServiceReference(const char * sName)
     virtual QCString trDesignOverview()
     virtual QCString trTypeDocumentation()
     virtual QCString trAndMore(const QCString & number)
+    virtual QCString trConstantGroups()
     virtual QCString trModuleReference(const char * namespaceName)
     virtual QCString trModulesMemberDescription(bool extractAll)
     virtual QCString trModulesMembers()
@@ -482,11 +665,14 @@ TranslatorHungarian   (TranslatorAdapter_1_4_6)  50 methods to implement (20 %)
     virtual QCString trCiteReferences()
     virtual QCString trAdditionalInheritedMembers()
     virtual QCString trDirDependency(const char * name)
+    virtual QCString trInterfaces()
     virtual QCString trCopyright()
     virtual QCString trIncludesFileIn(const char * name)
+    virtual QCString trServiceGeneratedFromFiles(bool single)
     virtual QCString trEnumGeneratedFromFiles(bool single)
     virtual QCString trCompoundIndexFortran()
     virtual QCString trSubprogram(bool first_capital, bool singular)
+    virtual QCString trConstantGroupReference(const char * namespaceName)
     virtual QCString trPanelSynchronisationTooltip(bool enable)
     virtual QCString trCallerGraph()
     virtual QCString trExtendsClass()
@@ -496,52 +682,69 @@ TranslatorHungarian   (TranslatorAdapter_1_4_6)  50 methods to implement (20 %)
     virtual QCString trModule(bool first_capital, bool singular)
     virtual QCString trCompoundMembersFortran()
     virtual QCString trSubprogramDocumentation()
+    virtual QCString trSingletonReference(const char * sName)
     virtual QCString trInstanceMethods()
 
 
-TranslatorIndonesian   (TranslatorAdapter_1_8_0)  14 methods to implement (5 %)
+TranslatorIndonesian   (TranslatorAdapter_1_8_0)  22 methods to implement (8 %)
 --------------------
 
-  Implements 228 of the required methods (94 %).
+  Implements 228 of the required methods (91 %).
 
   Missing methods (should be implemented):
 
     virtual QCString trDetailLevel()
     virtual QCString trTemplateParameters()
+    virtual QCString trServices()
     virtual QCString trClassMethods()
     virtual QCString trProvidedByCategory()
+    virtual QCString trSingletonGeneratedFromFiles(bool single)
+    virtual QCString trServiceReference(const char * sName)
     virtual QCString trDesignOverview()
     virtual QCString trAndMore(const QCString & number)
+    virtual QCString trConstantGroups()
     virtual QCString trMethodDocumentation()
     virtual QCString trEnumReference(const char * name)
     virtual QCString trInheritedFrom(const char * members, const char * what)
     virtual QCString trAdditionalInheritedMembers()
+    virtual QCString trInterfaces()
+    virtual QCString trServiceGeneratedFromFiles(bool single)
     virtual QCString trEnumGeneratedFromFiles(bool single)
+    virtual QCString trConstantGroupReference(const char * namespaceName)
     virtual QCString trPanelSynchronisationTooltip(bool enable)
     virtual QCString trExtendsClass()
+    virtual QCString trSingletonReference(const char * sName)
     virtual QCString trInstanceMethods()
 
 
-TranslatorItalian   (TranslatorAdapter_1_8_2)  7 methods to implement (2 %)
+TranslatorItalian   (TranslatorAdapter_1_8_2)  15 methods to implement (6 %)
 -----------------
 
-  Implements 235 of the required methods (97 %).
+  Implements 235 of the required methods (94 %).
 
   Missing methods (should be implemented):
 
+    virtual QCString trServices()
     virtual QCString trClassMethods()
     virtual QCString trProvidedByCategory()
+    virtual QCString trSingletonGeneratedFromFiles(bool single)
+    virtual QCString trServiceReference(const char * sName)
     virtual QCString trDesignOverview()
+    virtual QCString trConstantGroups()
     virtual QCString trMethodDocumentation()
+    virtual QCString trInterfaces()
+    virtual QCString trServiceGeneratedFromFiles(bool single)
+    virtual QCString trConstantGroupReference(const char * namespaceName)
     virtual QCString trPanelSynchronisationTooltip(bool enable)
     virtual QCString trExtendsClass()
+    virtual QCString trSingletonReference(const char * sName)
     virtual QCString trInstanceMethods()
 
 
-TranslatorJapanese   (TranslatorAdapter_1_6_0)  26 methods to implement (10 %)
+TranslatorJapanese   (TranslatorAdapter_1_6_0)  33 methods to implement (13 %)
 ------------------
 
-  Implements 216 of the required methods (89 %).
+  Implements 217 of the required methods (86 %).
 
   Missing methods (should be implemented):
 
@@ -551,12 +754,16 @@ TranslatorJapanese   (TranslatorAdapter_1_6_0)  26 methods to implement (10 %)
     virtual QCString trNoMatches()
     virtual QCString trLoading()
     virtual QCString trDateTime(int year, int month, int day, int dayOfWeek, int hour, int minutes, int seconds, bool includeTime)
+    virtual QCString trServices()
     virtual QCString trFileIn(const char * name)
     virtual QCString trClassMethods()
     virtual QCString trProvidedByCategory()
+    virtual QCString trSingletonGeneratedFromFiles(bool single)
     virtual QCString trGlobalNamespace()
+    virtual QCString trServiceReference(const char * sName)
     virtual QCString trDesignOverview()
     virtual QCString trAndMore(const QCString & number)
+    virtual QCString trConstantGroups()
     virtual QCString trDirDepGraph(const char * name)
     virtual QCString trDirRelation(const char * name)
     virtual QCString trMethodDocumentation()
@@ -567,9 +774,12 @@ TranslatorJapanese   (TranslatorAdapter_1_6_0)  26 methods to implement (10 %)
     virtual QCString trDirDependency(const char * name)
     virtual QCString trCopyright()
     virtual QCString trIncludesFileIn(const char * name)
+    virtual QCString trServiceGeneratedFromFiles(bool single)
     virtual QCString trEnumGeneratedFromFiles(bool single)
+    virtual QCString trConstantGroupReference(const char * namespaceName)
     virtual QCString trPanelSynchronisationTooltip(bool enable)
     virtual QCString trExtendsClass()
+    virtual QCString trSingletonReference(const char * sName)
     virtual QCString trInstanceMethods()
 
   Obsolete methods (should be removed, never used):
@@ -579,13 +789,12 @@ TranslatorJapanese   (TranslatorAdapter_1_6_0)  26 methods to implement (10 %)
     virtual QCString trPackageDocumentation()
     virtual QCString trSources()
     virtual QCString trReimplementedForInternalReasons()
-    virtual QCString trInterfaces()
     virtual QCString trHeaderFiles()
     virtual QCString trBugsAndLimitations()
     virtual QCString trNoDescriptionAvailable()
 
 
-TranslatorJapaneseEn   (TranslatorEnglish)  237 methods to implement (97 %)
+TranslatorJapaneseEn   (TranslatorEnglish)  245 methods to implement (98 %)
 --------------------
 
   Implements 5 of the required methods (2 %).
@@ -599,23 +808,13 @@ TranslatorJapaneseEn   (TranslatorEnglish)  237 methods to implement (97 %)
     virtual QCString latexLanguageSupportCommand()
 
 
-TranslatorKorean   (TranslatorAdapter_1_7_5)  7 methods to implement (2 %)
+TranslatorKorean   (TranslatorAdapter_1_7_5)
 ----------------
 
-  Implements 235 of the required methods (97 %).
+  Implements 250 of the required methods (100 %).
 
-  Missing methods (should be implemented):
 
-    virtual QCString trClassMethods()
-    virtual QCString trProvidedByCategory()
-    virtual QCString trDesignOverview()
-    virtual QCString trMethodDocumentation()
-    virtual QCString trPanelSynchronisationTooltip(bool enable)
-    virtual QCString trExtendsClass()
-    virtual QCString trInstanceMethods()
-
-
-TranslatorKoreanEn   (TranslatorEnglish)  237 methods to implement (97 %)
+TranslatorKoreanEn   (TranslatorEnglish)  245 methods to implement (98 %)
 ------------------
 
   Implements 5 of the required methods (2 %).
@@ -629,10 +828,27 @@ TranslatorKoreanEn   (TranslatorEnglish)  237 methods to implement (97 %)
     virtual QCString latexLanguageSupportCommand()
 
 
-TranslatorLithuanian   (TranslatorAdapter_1_4_6)  50 methods to implement (20 %)
+TranslatorLatvian   (Translator)  8 methods to implement (3 %)
+-----------------
+
+  Implements 242 of the required methods (96 %).
+
+  Missing methods (should be implemented):
+
+    virtual QCString trServices()
+    virtual QCString trSingletonGeneratedFromFiles(bool single)
+    virtual QCString trServiceReference(const char * sName)
+    virtual QCString trConstantGroups()
+    virtual QCString trInterfaces()
+    virtual QCString trServiceGeneratedFromFiles(bool single)
+    virtual QCString trConstantGroupReference(const char * namespaceName)
+    virtual QCString trSingletonReference(const char * sName)
+
+
+TranslatorLithuanian   (TranslatorAdapter_1_4_6)  58 methods to implement (23 %)
 --------------------
 
-  Implements 192 of the required methods (79 %).
+  Implements 192 of the required methods (76 %).
 
   Missing methods (should be implemented):
 
@@ -645,18 +861,22 @@ TranslatorLithuanian   (TranslatorAdapter_1_4_6)  50 methods to implement (20 %)
     virtual QCString trLoading()
     virtual QCString trSubprograms()
     virtual QCString trDateTime(int year, int month, int day, int dayOfWeek, int hour, int minutes, int seconds, bool includeTime)
+    virtual QCString trServices()
     virtual QCString trModulesListDescription(bool extractAll)
     virtual QCString trModulesList()
     virtual QCString trTypeConstraints()
     virtual QCString trFileIn(const char * name)
     virtual QCString trClassMethods()
     virtual QCString trProvidedByCategory()
+    virtual QCString trSingletonGeneratedFromFiles(bool single)
     virtual QCString trGlobalNamespace()
     virtual QCString trMemberFunctionDocumentationFortran()
     virtual QCString trCompoundListDescriptionFortran()
+    virtual QCString trServiceReference(const char * sName)
     virtual QCString trDesignOverview()
     virtual QCString trTypeDocumentation()
     virtual QCString trAndMore(const QCString & number)
+    virtual QCString trConstantGroups()
     virtual QCString trModuleReference(const char * namespaceName)
     virtual QCString trModulesMemberDescription(bool extractAll)
     virtual QCString trModulesMembers()
@@ -671,11 +891,14 @@ TranslatorLithuanian   (TranslatorAdapter_1_4_6)  50 methods to implement (20 %)
     virtual QCString trCiteReferences()
     virtual QCString trAdditionalInheritedMembers()
     virtual QCString trDirDependency(const char * name)
+    virtual QCString trInterfaces()
     virtual QCString trCopyright()
     virtual QCString trIncludesFileIn(const char * name)
+    virtual QCString trServiceGeneratedFromFiles(bool single)
     virtual QCString trEnumGeneratedFromFiles(bool single)
     virtual QCString trCompoundIndexFortran()
     virtual QCString trSubprogram(bool first_capital, bool singular)
+    virtual QCString trConstantGroupReference(const char * namespaceName)
     virtual QCString trPanelSynchronisationTooltip(bool enable)
     virtual QCString trCallerGraph()
     virtual QCString trExtendsClass()
@@ -685,13 +908,14 @@ TranslatorLithuanian   (TranslatorAdapter_1_4_6)  50 methods to implement (20 %)
     virtual QCString trModule(bool first_capital, bool singular)
     virtual QCString trCompoundMembersFortran()
     virtual QCString trSubprogramDocumentation()
+    virtual QCString trSingletonReference(const char * sName)
     virtual QCString trInstanceMethods()
 
 
-TranslatorMacedonian   (TranslatorAdapter_1_6_0)  26 methods to implement (10 %)
+TranslatorMacedonian   (TranslatorAdapter_1_6_0)  34 methods to implement (13 %)
 --------------------
 
-  Implements 216 of the required methods (89 %).
+  Implements 216 of the required methods (86 %).
 
   Missing methods (should be implemented):
 
@@ -701,12 +925,16 @@ TranslatorMacedonian   (TranslatorAdapter_1_6_0)  26 methods to implement (10 %)
     virtual QCString trNoMatches()
     virtual QCString trLoading()
     virtual QCString trDateTime(int year, int month, int day, int dayOfWeek, int hour, int minutes, int seconds, bool includeTime)
+    virtual QCString trServices()
     virtual QCString trFileIn(const char * name)
     virtual QCString trClassMethods()
     virtual QCString trProvidedByCategory()
+    virtual QCString trSingletonGeneratedFromFiles(bool single)
     virtual QCString trGlobalNamespace()
+    virtual QCString trServiceReference(const char * sName)
     virtual QCString trDesignOverview()
     virtual QCString trAndMore(const QCString & number)
+    virtual QCString trConstantGroups()
     virtual QCString trDirDepGraph(const char * name)
     virtual QCString trDirRelation(const char * name)
     virtual QCString trMethodDocumentation()
@@ -715,18 +943,22 @@ TranslatorMacedonian   (TranslatorAdapter_1_6_0)  26 methods to implement (10 %)
     virtual QCString trCiteReferences()
     virtual QCString trAdditionalInheritedMembers()
     virtual QCString trDirDependency(const char * name)
+    virtual QCString trInterfaces()
     virtual QCString trCopyright()
     virtual QCString trIncludesFileIn(const char * name)
+    virtual QCString trServiceGeneratedFromFiles(bool single)
     virtual QCString trEnumGeneratedFromFiles(bool single)
+    virtual QCString trConstantGroupReference(const char * namespaceName)
     virtual QCString trPanelSynchronisationTooltip(bool enable)
     virtual QCString trExtendsClass()
+    virtual QCString trSingletonReference(const char * sName)
     virtual QCString trInstanceMethods()
 
 
-TranslatorNorwegian   (TranslatorAdapter_1_4_6)  49 methods to implement (20 %)
+TranslatorNorwegian   (TranslatorAdapter_1_4_6)  56 methods to implement (22 %)
 -------------------
 
-  Implements 193 of the required methods (79 %).
+  Implements 194 of the required methods (77 %).
 
   Missing methods (should be implemented):
 
@@ -739,18 +971,22 @@ TranslatorNorwegian   (TranslatorAdapter_1_4_6)  49 methods to implement (20 %)
     virtual QCString trLoading()
     virtual QCString trSubprograms()
     virtual QCString trDateTime(int year, int month, int day, int dayOfWeek, int hour, int minutes, int seconds, bool includeTime)
+    virtual QCString trServices()
     virtual QCString trModulesListDescription(bool extractAll)
     virtual QCString trModulesList()
     virtual QCString trTypeConstraints()
     virtual QCString trFileIn(const char * name)
     virtual QCString trClassMethods()
     virtual QCString trProvidedByCategory()
+    virtual QCString trSingletonGeneratedFromFiles(bool single)
     virtual QCString trGlobalNamespace()
     virtual QCString trMemberFunctionDocumentationFortran()
     virtual QCString trCompoundListDescriptionFortran()
+    virtual QCString trServiceReference(const char * sName)
     virtual QCString trDesignOverview()
     virtual QCString trTypeDocumentation()
     virtual QCString trAndMore(const QCString & number)
+    virtual QCString trConstantGroups()
     virtual QCString trModuleReference(const char * namespaceName)
     virtual QCString trModulesMemberDescription(bool extractAll)
     virtual QCString trModulesMembers()
@@ -767,9 +1003,11 @@ TranslatorNorwegian   (TranslatorAdapter_1_4_6)  49 methods to implement (20 %)
     virtual QCString trDirDependency(const char * name)
     virtual QCString trCopyright()
     virtual QCString trIncludesFileIn(const char * name)
+    virtual QCString trServiceGeneratedFromFiles(bool single)
     virtual QCString trEnumGeneratedFromFiles(bool single)
     virtual QCString trCompoundIndexFortran()
     virtual QCString trSubprogram(bool first_capital, bool singular)
+    virtual QCString trConstantGroupReference(const char * namespaceName)
     virtual QCString trPanelSynchronisationTooltip(bool enable)
     virtual QCString trCallerGraph()
     virtual QCString trExtendsClass()
@@ -778,6 +1016,7 @@ TranslatorNorwegian   (TranslatorAdapter_1_4_6)  49 methods to implement (20 %)
     virtual QCString trModule(bool first_capital, bool singular)
     virtual QCString trCompoundMembersFortran()
     virtual QCString trSubprogramDocumentation()
+    virtual QCString trSingletonReference(const char * sName)
     virtual QCString trInstanceMethods()
 
   Obsolete methods (should be removed, never used):
@@ -787,51 +1026,65 @@ TranslatorNorwegian   (TranslatorAdapter_1_4_6)  49 methods to implement (20 %)
     virtual QCString trPackageDocumentation()
     virtual QCString trSources()
     virtual QCString trReimplementedForInternalReasons()
-    virtual QCString trInterfaces()
     virtual QCString trHeaderFiles()
     virtual QCString trBugsAndLimitations()
     virtual QCString trNoDescriptionAvailable()
 
 
-TranslatorPersian   (TranslatorAdapter_1_7_5)  17 methods to implement (7 %)
+TranslatorPersian   (TranslatorAdapter_1_7_5)  25 methods to implement (10 %)
 -----------------
 
-  Implements 225 of the required methods (92 %).
+  Implements 225 of the required methods (90 %).
 
   Missing methods (should be implemented):
 
     virtual QCString trDetailLevel()
     virtual QCString trTemplateParameters()
+    virtual QCString trServices()
     virtual QCString trClassMethods()
     virtual QCString trProvidedByCategory()
+    virtual QCString trSingletonGeneratedFromFiles(bool single)
+    virtual QCString trServiceReference(const char * sName)
     virtual QCString trDesignOverview()
     virtual QCString trAndMore(const QCString & number)
+    virtual QCString trConstantGroups()
     virtual QCString trDirDepGraph(const char * name)
     virtual QCString trMethodDocumentation()
     virtual QCString trEnumReference(const char * name)
     virtual QCString trInheritedFrom(const char * members, const char * what)
     virtual QCString trCiteReferences()
     virtual QCString trAdditionalInheritedMembers()
+    virtual QCString trInterfaces()
     virtual QCString trCopyright()
+    virtual QCString trServiceGeneratedFromFiles(bool single)
     virtual QCString trEnumGeneratedFromFiles(bool single)
+    virtual QCString trConstantGroupReference(const char * namespaceName)
     virtual QCString trPanelSynchronisationTooltip(bool enable)
     virtual QCString trExtendsClass()
+    virtual QCString trSingletonReference(const char * sName)
     virtual QCString trInstanceMethods()
 
 
-TranslatorPolish   (TranslatorAdapter_1_8_2)  7 methods to implement (2 %)
+TranslatorPolish   (TranslatorAdapter_1_8_2)  14 methods to implement (5 %)
 ----------------
 
-  Implements 235 of the required methods (97 %).
+  Implements 236 of the required methods (94 %).
 
   Missing methods (should be implemented):
 
+    virtual QCString trServices()
     virtual QCString trClassMethods()
     virtual QCString trProvidedByCategory()
+    virtual QCString trSingletonGeneratedFromFiles(bool single)
+    virtual QCString trServiceReference(const char * sName)
     virtual QCString trDesignOverview()
+    virtual QCString trConstantGroups()
     virtual QCString trMethodDocumentation()
+    virtual QCString trServiceGeneratedFromFiles(bool single)
+    virtual QCString trConstantGroupReference(const char * namespaceName)
     virtual QCString trPanelSynchronisationTooltip(bool enable)
     virtual QCString trExtendsClass()
+    virtual QCString trSingletonReference(const char * sName)
     virtual QCString trInstanceMethods()
 
   Obsolete methods (should be removed, never used):
@@ -841,100 +1094,86 @@ TranslatorPolish   (TranslatorAdapter_1_8_2)  7 methods to implement (2 %)
     virtual QCString trPackageDocumentation()
     QCString trSources()
     QCString trReimplementedForInternalReasons()
-    virtual QCString trInterfaces()
     QCString trHeaderFiles()
     QCString trBugsAndLimitations()
     QCString trNoDescriptionAvailable()
 
 
-TranslatorPortuguese   (TranslatorAdapter_1_8_0)  14 methods to implement (5 %)
+TranslatorPortuguese   (TranslatorAdapter_1_8_0)  22 methods to implement (8 %)
 --------------------
 
-  Implements 228 of the required methods (94 %).
+  Implements 228 of the required methods (91 %).
 
   Missing methods (should be implemented):
 
     virtual QCString trDetailLevel()
     virtual QCString trTemplateParameters()
+    virtual QCString trServices()
     virtual QCString trClassMethods()
     virtual QCString trProvidedByCategory()
+    virtual QCString trSingletonGeneratedFromFiles(bool single)
+    virtual QCString trServiceReference(const char * sName)
     virtual QCString trDesignOverview()
     virtual QCString trAndMore(const QCString & number)
+    virtual QCString trConstantGroups()
     virtual QCString trMethodDocumentation()
     virtual QCString trEnumReference(const char * name)
     virtual QCString trInheritedFrom(const char * members, const char * what)
     virtual QCString trAdditionalInheritedMembers()
+    virtual QCString trInterfaces()
+    virtual QCString trServiceGeneratedFromFiles(bool single)
     virtual QCString trEnumGeneratedFromFiles(bool single)
+    virtual QCString trConstantGroupReference(const char * namespaceName)
     virtual QCString trPanelSynchronisationTooltip(bool enable)
     virtual QCString trExtendsClass()
+    virtual QCString trSingletonReference(const char * sName)
     virtual QCString trInstanceMethods()
 
 
-TranslatorRomanian   (TranslatorAdapter_1_6_0)  26 methods to implement (10 %)
+TranslatorRomanian   (Translator)
 ------------------
 
-  Implements 216 of the required methods (89 %).
-
-  Missing methods (should be implemented):
-
-    virtual QCString trDetailLevel()
-    virtual QCString trSearching()
-    virtual QCString trTemplateParameters()
-    virtual QCString trNoMatches()
-    virtual QCString trLoading()
-    virtual QCString trDateTime(int year, int month, int day, int dayOfWeek, int hour, int minutes, int seconds, bool includeTime)
-    virtual QCString trFileIn(const char * name)
-    virtual QCString trClassMethods()
-    virtual QCString trProvidedByCategory()
-    virtual QCString trGlobalNamespace()
-    virtual QCString trDesignOverview()
-    virtual QCString trAndMore(const QCString & number)
-    virtual QCString trDirDepGraph(const char * name)
-    virtual QCString trDirRelation(const char * name)
-    virtual QCString trMethodDocumentation()
-    virtual QCString trEnumReference(const char * name)
-    virtual QCString trInheritedFrom(const char * members, const char * what)
-    virtual QCString trCiteReferences()
-    virtual QCString trAdditionalInheritedMembers()
-    virtual QCString trDirDependency(const char * name)
-    virtual QCString trCopyright()
-    virtual QCString trIncludesFileIn(const char * name)
-    virtual QCString trEnumGeneratedFromFiles(bool single)
-    virtual QCString trPanelSynchronisationTooltip(bool enable)
-    virtual QCString trExtendsClass()
-    virtual QCString trInstanceMethods()
+  Implements 250 of the required methods (100 %).
 
 
-TranslatorRussian   (TranslatorAdapter_1_7_5)  17 methods to implement (7 %)
+TranslatorRussian   (TranslatorAdapter_1_7_5)  25 methods to implement (10 %)
 -----------------
 
-  Implements 225 of the required methods (92 %).
+  Implements 225 of the required methods (90 %).
 
   Missing methods (should be implemented):
 
     virtual QCString trDetailLevel()
     virtual QCString trTemplateParameters()
+    virtual QCString trServices()
     virtual QCString trClassMethods()
     virtual QCString trProvidedByCategory()
+    virtual QCString trSingletonGeneratedFromFiles(bool single)
+    virtual QCString trServiceReference(const char * sName)
     virtual QCString trDesignOverview()
     virtual QCString trAndMore(const QCString & number)
+    virtual QCString trConstantGroups()
     virtual QCString trDirDepGraph(const char * name)
     virtual QCString trMethodDocumentation()
     virtual QCString trEnumReference(const char * name)
     virtual QCString trInheritedFrom(const char * members, const char * what)
     virtual QCString trCiteReferences()
     virtual QCString trAdditionalInheritedMembers()
+    virtual QCString trInterfaces()
     virtual QCString trCopyright()
+    virtual QCString trServiceGeneratedFromFiles(bool single)
     virtual QCString trEnumGeneratedFromFiles(bool single)
+    virtual QCString trConstantGroupReference(const char * namespaceName)
     virtual QCString trPanelSynchronisationTooltip(bool enable)
     virtual QCString trExtendsClass()
+    virtual QCString trSingletonReference(const char * sName)
     virtual QCString trInstanceMethods()
 
 
-TranslatorSerbian   (TranslatorAdapter_1_6_0)  26 methods to implement (10 %)
+TranslatorSerbian   (TranslatorAdapter_1_6_0)  34 methods to implement (13 %)
 -----------------
 
-  Implements 216 of the required methods (89 %).
+  Implements 216 of the required methods (86 %).
 
   Missing methods (should be implemented):
 
@@ -944,12 +1183,16 @@ TranslatorSerbian   (TranslatorAdapter_1_6_0)  26 methods to implement (10 %)
     virtual QCString trNoMatches()
     virtual QCString trLoading()
     virtual QCString trDateTime(int year, int month, int day, int dayOfWeek, int hour, int minutes, int seconds, bool includeTime)
+    virtual QCString trServices()
     virtual QCString trFileIn(const char * name)
     virtual QCString trClassMethods()
     virtual QCString trProvidedByCategory()
+    virtual QCString trSingletonGeneratedFromFiles(bool single)
     virtual QCString trGlobalNamespace()
+    virtual QCString trServiceReference(const char * sName)
     virtual QCString trDesignOverview()
     virtual QCString trAndMore(const QCString & number)
+    virtual QCString trConstantGroups()
     virtual QCString trDirDepGraph(const char * name)
     virtual QCString trDirRelation(const char * name)
     virtual QCString trMethodDocumentation()
@@ -958,18 +1201,22 @@ TranslatorSerbian   (TranslatorAdapter_1_6_0)  26 methods to implement (10 %)
     virtual QCString trCiteReferences()
     virtual QCString trAdditionalInheritedMembers()
     virtual QCString trDirDependency(const char * name)
+    virtual QCString trInterfaces()
     virtual QCString trCopyright()
     virtual QCString trIncludesFileIn(const char * name)
+    virtual QCString trServiceGeneratedFromFiles(bool single)
     virtual QCString trEnumGeneratedFromFiles(bool single)
+    virtual QCString trConstantGroupReference(const char * namespaceName)
     virtual QCString trPanelSynchronisationTooltip(bool enable)
     virtual QCString trExtendsClass()
+    virtual QCString trSingletonReference(const char * sName)
     virtual QCString trInstanceMethods()
 
 
-TranslatorSerbianCyrilic   (TranslatorAdapter_1_6_0)  26 methods to implement (10 %)
+TranslatorSerbianCyrilic   (TranslatorAdapter_1_6_0)  34 methods to implement (13 %)
 ------------------------
 
-  Implements 216 of the required methods (89 %).
+  Implements 216 of the required methods (86 %).
 
   Missing methods (should be implemented):
 
@@ -979,12 +1226,16 @@ TranslatorSerbianCyrilic   (TranslatorAdapter_1_6_0)  26 methods to implement (1
     virtual QCString trNoMatches()
     virtual QCString trLoading()
     virtual QCString trDateTime(int year, int month, int day, int dayOfWeek, int hour, int minutes, int seconds, bool includeTime)
+    virtual QCString trServices()
     virtual QCString trFileIn(const char * name)
     virtual QCString trClassMethods()
     virtual QCString trProvidedByCategory()
+    virtual QCString trSingletonGeneratedFromFiles(bool single)
     virtual QCString trGlobalNamespace()
+    virtual QCString trServiceReference(const char * sName)
     virtual QCString trDesignOverview()
     virtual QCString trAndMore(const QCString & number)
+    virtual QCString trConstantGroups()
     virtual QCString trDirDepGraph(const char * name)
     virtual QCString trDirRelation(const char * name)
     virtual QCString trMethodDocumentation()
@@ -993,18 +1244,22 @@ TranslatorSerbianCyrilic   (TranslatorAdapter_1_6_0)  26 methods to implement (1
     virtual QCString trCiteReferences()
     virtual QCString trAdditionalInheritedMembers()
     virtual QCString trDirDependency(const char * name)
+    virtual QCString trInterfaces()
     virtual QCString trCopyright()
     virtual QCString trIncludesFileIn(const char * name)
+    virtual QCString trServiceGeneratedFromFiles(bool single)
     virtual QCString trEnumGeneratedFromFiles(bool single)
+    virtual QCString trConstantGroupReference(const char * namespaceName)
     virtual QCString trPanelSynchronisationTooltip(bool enable)
     virtual QCString trExtendsClass()
+    virtual QCString trSingletonReference(const char * sName)
     virtual QCString trInstanceMethods()
 
 
-TranslatorSlovene   (TranslatorAdapter_1_4_6)  50 methods to implement (20 %)
+TranslatorSlovene   (TranslatorAdapter_1_4_6)  58 methods to implement (23 %)
 -----------------
 
-  Implements 192 of the required methods (79 %).
+  Implements 192 of the required methods (76 %).
 
   Missing methods (should be implemented):
 
@@ -1017,18 +1272,22 @@ TranslatorSlovene   (TranslatorAdapter_1_4_6)  50 methods to implement (20 %)
     virtual QCString trLoading()
     virtual QCString trSubprograms()
     virtual QCString trDateTime(int year, int month, int day, int dayOfWeek, int hour, int minutes, int seconds, bool includeTime)
+    virtual QCString trServices()
     virtual QCString trModulesListDescription(bool extractAll)
     virtual QCString trModulesList()
     virtual QCString trTypeConstraints()
     virtual QCString trFileIn(const char * name)
     virtual QCString trClassMethods()
     virtual QCString trProvidedByCategory()
+    virtual QCString trSingletonGeneratedFromFiles(bool single)
     virtual QCString trGlobalNamespace()
     virtual QCString trMemberFunctionDocumentationFortran()
     virtual QCString trCompoundListDescriptionFortran()
+    virtual QCString trServiceReference(const char * sName)
     virtual QCString trDesignOverview()
     virtual QCString trTypeDocumentation()
     virtual QCString trAndMore(const QCString & number)
+    virtual QCString trConstantGroups()
     virtual QCString trModuleReference(const char * namespaceName)
     virtual QCString trModulesMemberDescription(bool extractAll)
     virtual QCString trModulesMembers()
@@ -1043,11 +1302,14 @@ TranslatorSlovene   (TranslatorAdapter_1_4_6)  50 methods to implement (20 %)
     virtual QCString trCiteReferences()
     virtual QCString trAdditionalInheritedMembers()
     virtual QCString trDirDependency(const char * name)
+    virtual QCString trInterfaces()
     virtual QCString trCopyright()
     virtual QCString trIncludesFileIn(const char * name)
+    virtual QCString trServiceGeneratedFromFiles(bool single)
     virtual QCString trEnumGeneratedFromFiles(bool single)
     virtual QCString trCompoundIndexFortran()
     virtual QCString trSubprogram(bool first_capital, bool singular)
+    virtual QCString trConstantGroupReference(const char * namespaceName)
     virtual QCString trPanelSynchronisationTooltip(bool enable)
     virtual QCString trCallerGraph()
     virtual QCString trExtendsClass()
@@ -1057,13 +1319,31 @@ TranslatorSlovene   (TranslatorAdapter_1_4_6)  50 methods to implement (20 %)
     virtual QCString trModule(bool first_capital, bool singular)
     virtual QCString trCompoundMembersFortran()
     virtual QCString trSubprogramDocumentation()
+    virtual QCString trSingletonReference(const char * sName)
     virtual QCString trInstanceMethods()
 
 
-TranslatorSwedish   (TranslatorAdapter_1_6_0)  26 methods to implement (10 %)
+TranslatorSpanish   (TranslatorAdapter_1_8_2)  8 methods to implement (3 %)
 -----------------
 
-  Implements 216 of the required methods (89 %).
+  Implements 242 of the required methods (96 %).
+
+  Missing methods (should be implemented):
+
+    virtual QCString trServices()
+    virtual QCString trSingletonGeneratedFromFiles(bool single)
+    virtual QCString trServiceReference(const char * sName)
+    virtual QCString trConstantGroups()
+    virtual QCString trInterfaces()
+    virtual QCString trServiceGeneratedFromFiles(bool single)
+    virtual QCString trConstantGroupReference(const char * namespaceName)
+    virtual QCString trSingletonReference(const char * sName)
+
+
+TranslatorSwedish   (TranslatorAdapter_1_6_0)  34 methods to implement (13 %)
+-----------------
+
+  Implements 216 of the required methods (86 %).
 
   Missing methods (should be implemented):
 
@@ -1073,12 +1353,16 @@ TranslatorSwedish   (TranslatorAdapter_1_6_0)  26 methods to implement (10 %)
     virtual QCString trNoMatches()
     virtual QCString trLoading()
     virtual QCString trDateTime(int year, int month, int day, int dayOfWeek, int hour, int minutes, int seconds, bool includeTime)
+    virtual QCString trServices()
     virtual QCString trFileIn(const char * name)
     virtual QCString trClassMethods()
     virtual QCString trProvidedByCategory()
+    virtual QCString trSingletonGeneratedFromFiles(bool single)
     virtual QCString trGlobalNamespace()
+    virtual QCString trServiceReference(const char * sName)
     virtual QCString trDesignOverview()
     virtual QCString trAndMore(const QCString & number)
+    virtual QCString trConstantGroups()
     virtual QCString trDirDepGraph(const char * name)
     virtual QCString trDirRelation(const char * name)
     virtual QCString trMethodDocumentation()
@@ -1087,115 +1371,73 @@ TranslatorSwedish   (TranslatorAdapter_1_6_0)  26 methods to implement (10 %)
     virtual QCString trCiteReferences()
     virtual QCString trAdditionalInheritedMembers()
     virtual QCString trDirDependency(const char * name)
+    virtual QCString trInterfaces()
     virtual QCString trCopyright()
     virtual QCString trIncludesFileIn(const char * name)
+    virtual QCString trServiceGeneratedFromFiles(bool single)
     virtual QCString trEnumGeneratedFromFiles(bool single)
+    virtual QCString trConstantGroupReference(const char * namespaceName)
     virtual QCString trPanelSynchronisationTooltip(bool enable)
     virtual QCString trExtendsClass()
+    virtual QCString trSingletonReference(const char * sName)
     virtual QCString trInstanceMethods()
 
 
-TranslatorTurkish   (TranslatorAdapter_1_7_5)  17 methods to implement (7 %)
+TranslatorTurkish   (TranslatorAdapter_1_7_5)  25 methods to implement (10 %)
 -----------------
 
-  Implements 225 of the required methods (92 %).
+  Implements 225 of the required methods (90 %).
 
   Missing methods (should be implemented):
 
     virtual QCString trDetailLevel()
     virtual QCString trTemplateParameters()
+    virtual QCString trServices()
     virtual QCString trClassMethods()
     virtual QCString trProvidedByCategory()
+    virtual QCString trSingletonGeneratedFromFiles(bool single)
+    virtual QCString trServiceReference(const char * sName)
     virtual QCString trDesignOverview()
     virtual QCString trAndMore(const QCString & number)
+    virtual QCString trConstantGroups()
     virtual QCString trDirDepGraph(const char * name)
     virtual QCString trMethodDocumentation()
     virtual QCString trEnumReference(const char * name)
     virtual QCString trInheritedFrom(const char * members, const char * what)
     virtual QCString trCiteReferences()
     virtual QCString trAdditionalInheritedMembers()
+    virtual QCString trInterfaces()
     virtual QCString trCopyright()
+    virtual QCString trServiceGeneratedFromFiles(bool single)
     virtual QCString trEnumGeneratedFromFiles(bool single)
+    virtual QCString trConstantGroupReference(const char * namespaceName)
     virtual QCString trPanelSynchronisationTooltip(bool enable)
     virtual QCString trExtendsClass()
+    virtual QCString trSingletonReference(const char * sName)
     virtual QCString trInstanceMethods()
 
 
-TranslatorUkrainian   (TranslatorAdapter_1_4_1)  50 methods to implement (20 %)
+TranslatorUkrainian   (TranslatorAdapter_1_8_2)  8 methods to implement (3 %)
 -------------------
 
-  Implements 192 of the required methods (79 %).
+  Implements 242 of the required methods (96 %).
 
   Missing methods (should be implemented):
 
-    virtual QCString trDetailLevel()
-    virtual QCString trCompoundMembersDescriptionFortran(bool extractAll)
-    virtual QCString trSearching()
-    virtual QCString trTemplateParameters()
-    virtual QCString trOverloadText()
-    virtual QCString trNoMatches()
-    virtual QCString trGeneratedFromFilesFortran(ClassDef::CompoundType compType, bool single)
-    virtual QCString trLoading()
-    virtual QCString trSubprograms()
-    virtual QCString trDateTime(int year, int month, int day, int dayOfWeek, int hour, int minutes, int seconds, bool includeTime)
-    virtual QCString trModulesListDescription(bool extractAll)
-    virtual QCString trModulesList()
-    virtual QCString trTypeConstraints()
-    virtual QCString trFileIn(const char * name)
-    virtual QCString trClassMethods()
-    virtual QCString trProvidedByCategory()
-    virtual QCString trGlobalNamespace()
-    virtual QCString trMemberFunctionDocumentationFortran()
-    virtual QCString trCompoundListDescriptionFortran()
-    virtual QCString trDesignOverview()
-    virtual QCString trTypeDocumentation()
-    virtual QCString trAndMore(const QCString & number)
-    virtual QCString trModuleReference(const char * namespaceName)
-    virtual QCString trModulesMemberDescription(bool extractAll)
-    virtual QCString trModulesMembers()
-    virtual QCString trDirDepGraph(const char * name)
-    virtual QCString trModulesIndex()
-    virtual QCString trDirRelation(const char * name)
-    virtual QCString trMethodDocumentation()
-    virtual QCString trCompoundListFortran()
-    virtual QCString trDataTypes()
-    virtual QCString trEnumReference(const char * name)
-    virtual QCString trInheritedFrom(const char * members, const char * what)
-    virtual QCString trCiteReferences()
-    virtual QCString trAdditionalInheritedMembers()
-    virtual QCString trDirDependency(const char * name)
-    virtual QCString trCopyright()
-    virtual QCString trIncludesFileIn(const char * name)
-    virtual QCString trEnumGeneratedFromFiles(bool single)
-    virtual QCString trCompoundIndexFortran()
-    virtual QCString trSubprogram(bool first_capital, bool singular)
-    virtual QCString trPanelSynchronisationTooltip(bool enable)
-    virtual QCString trCallerGraph()
-    virtual QCString trExtendsClass()
-    virtual QCString trCompoundReferenceFortran(const char * clName, ClassDef::CompoundType compType, bool isTemplate)
-    virtual QCString trType(bool first_capital, bool singular)
-    virtual QCString trModule(bool first_capital, bool singular)
-    virtual QCString trCompoundMembersFortran()
-    virtual QCString trSubprogramDocumentation()
-    virtual QCString trInstanceMethods()
-
-  Obsolete methods (should be removed, never used):
-
-    virtual QCString trHeaderFilesDescription()
-    virtual QCString trField(bool first_capital, bool singular)
-    virtual QCString trPackageDocumentation()
-    virtual QCString trSources()
-    virtual QCString trReimplementedForInternalReasons()
+    virtual QCString trServices()
+    virtual QCString trSingletonGeneratedFromFiles(bool single)
+    virtual QCString trServiceReference(const char * sName)
+    virtual QCString trConstantGroups()
     virtual QCString trInterfaces()
-    virtual QCString trHeaderFiles()
-    virtual QCString trBugsAndLimitations()
-    virtual QCString trNoDescriptionAvailable()
+    virtual QCString trServiceGeneratedFromFiles(bool single)
+    virtual QCString trConstantGroupReference(const char * namespaceName)
+    virtual QCString trSingletonReference(const char * sName)
 
 
-TranslatorVietnamese   (TranslatorAdapter_1_6_0)  26 methods to implement (10 %)
+TranslatorVietnamese   (TranslatorAdapter_1_6_0)  34 methods to implement (13 %)
 --------------------
 
-  Implements 216 of the required methods (89 %).
+  Implements 216 of the required methods (86 %).
 
   Missing methods (should be implemented):
 
@@ -1205,12 +1447,16 @@ TranslatorVietnamese   (TranslatorAdapter_1_6_0)  26 methods to implement (10 %)
     virtual QCString trNoMatches()
     virtual QCString trLoading()
     virtual QCString trDateTime(int year, int month, int day, int dayOfWeek, int hour, int minutes, int seconds, bool includeTime)
+    virtual QCString trServices()
     virtual QCString trFileIn(const char * name)
     virtual QCString trClassMethods()
     virtual QCString trProvidedByCategory()
+    virtual QCString trSingletonGeneratedFromFiles(bool single)
     virtual QCString trGlobalNamespace()
+    virtual QCString trServiceReference(const char * sName)
     virtual QCString trDesignOverview()
     virtual QCString trAndMore(const QCString & number)
+    virtual QCString trConstantGroups()
     virtual QCString trDirDepGraph(const char * name)
     virtual QCString trDirRelation(const char * name)
     virtual QCString trMethodDocumentation()
@@ -1219,9 +1465,13 @@ TranslatorVietnamese   (TranslatorAdapter_1_6_0)  26 methods to implement (10 %)
     virtual QCString trCiteReferences()
     virtual QCString trAdditionalInheritedMembers()
     virtual QCString trDirDependency(const char * name)
+    virtual QCString trInterfaces()
     virtual QCString trCopyright()
     virtual QCString trIncludesFileIn(const char * name)
+    virtual QCString trServiceGeneratedFromFiles(bool single)
     virtual QCString trEnumGeneratedFromFiles(bool single)
+    virtual QCString trConstantGroupReference(const char * namespaceName)
     virtual QCString trPanelSynchronisationTooltip(bool enable)
     virtual QCString trExtendsClass()
+    virtual QCString trSingletonReference(const char * sName)
     virtual QCString trInstanceMethods()
\ No newline at end of file
index c795b0f..3a89922 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -16,7 +16,7 @@
  */
 /*! \page trouble Troubleshooting
 
-<h2>Known problems:</h2>
+\section knowproblems Known Problems
 <ul>
 <li>If you have problems building doxygen from sources, please 
     read \ref unix_problems "this section" first.
@@ -31,7 +31,7 @@
     or unions with the same name in your code. It should not crash however,
     rather it should ignore all of the classes with the same name except one.
 <li>Some commands do not work inside the arguments of other commands.
-    Inside a HTML link (i.e. \<a href="..."\>...\<a\>) for instance 
+    Inside a HTML link (i.e. \<a&nbsp;href="..."\>...\<a\>) for instance 
     other commands (including other HTML commands) do not work!
     The sectioning commands are an important exception. 
 <li>Redundant braces can confuse doxygen in some cases. 
@@ -51,7 +51,7 @@
 \endverbatim
   then doxygen will remove the braces and correctly parse the result.
 <li>Not all names in code fragments that are included in the documentation
-    are replaced by links (for instance when using \c SOURCE_BROWSER = \c YES)
+    are replaced by links (for instance when using \ref cfg_source_browser "SOURCE_BROWSER" = `YES`)
     and links to overloaded members may point to the wrong member.
     This also holds for the "Referenced by" list that is generated for
     each function.
@@ -62,7 +62,8 @@
     documentation, because of possible ambiguities or lack of
     information about the context in which the code fragment is found.  
 <li>It is not possible to insert a non-member function f in a class A 
-    using the \\relates or \\relatesalso command, if class A already
+    using the \ref cmdrelates "\\relates" or \ref cmdrelatesalso "\\relatesalso" 
+    command, if class A already
     has a member with name f and the same argument list.
 <li>There is only very limited support for member specialization at the
     moment. It only works if there is a specialized template class as
 </ul>
 
 
-<h2>How to help</h2>
+\section howtohelp How to Help
 The development of Doxygen highly depends on your input! 
 
 If you are trying Doxygen let me know what you think of it (do you
 miss certain features?). Even if you decide not to use it, please let me
 know why. 
 
-\anchor bug_reports
-<h2>How to report a bug</h2>
+\section bug_reports How to report a bug
 
 Bugs are tracked in GNOME's <a href="http://bugzilla.gnome.org">bugzilla</a> database.
 Before submitting a 
@@ -135,8 +135,10 @@ one file please tar or zip everything, so I only have to save and download
 one file.
 
 \htmlonly
-Return to the <a href="index.html">index</a>.
+Go to the <a href="features.html">next</a> section or return to the
+ <a href="index.html">index</a>.
 \endhtmlonly
 
+
 */
 
index 2d6cbab..5df9b7b 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -28,7 +28,7 @@ Here is the list of tags supported by doxygen:
 <li><tt>\<c\></tt>     Identifies inline text that should be rendered as a 
                        piece of code. Similar to using <tt>\<tt\></tt>text<tt>\</tt\></tt>.
 <li><tt>\<code\></tt>  Set one or more lines of source code or program output.
-                       Note that this command behaves like <tt>\\code ... \\endcode</tt>
+                       Note that this command behaves like \ref cmdcode "\\code" ... \ref cmdendcode "\\endcode"
                        for C# code, but it behaves like the HTML equivalent
                        <tt>\<code\>...\</code\></tt> for other languages.
 <li><tt>\<description\></tt> Part of a <tt>\<list\></tt> command, describes an item.
@@ -99,5 +99,11 @@ class Engine
 }
 \endcode
 
+
+\htmlonly
+Go to the <a href="langhowto.html">next</a> section or return to the
+ <a href="index.html">index</a>.
+\endhtmlonly
+
 */
  
index 26b7c24..33b4cb3 100644 (file)
@@ -38,93 +38,91 @@ clean:
                memgrp docstring pyexample mux manual dbusxml tclexample
 
 class/html/index.html: class.h class.cfg
-       $(DOXYGEN)/bin/doxygen class.cfg
+       "$(DOXYGEN)/bin/doxygen" class.cfg
 
 define/html/index.html: define.h define.cfg
-       $(DOXYGEN)/bin/doxygen define.cfg
+       "$(DOXYGEN)/bin/doxygen" define.cfg
 
 enum/html/index.html: enum.h enum.cfg
-       $(DOXYGEN)/bin/doxygen enum.cfg
+       "$(DOXYGEN)/bin/doxygen" enum.cfg
 
 file/html/index.html: file.h file.cfg
-       $(DOXYGEN)/bin/doxygen file.cfg
+       "$(DOXYGEN)/bin/doxygen" file.cfg
 
 func/html/index.html: func.h func.cfg
-       $(DOXYGEN)/bin/doxygen func.cfg
+       "$(DOXYGEN)/bin/doxygen" func.cfg
 
 page/html/index.html: page.doc page.cfg
-       $(DOXYGEN)/bin/doxygen page.cfg
+       "$(DOXYGEN)/bin/doxygen" page.cfg
 
 relates/html/index.html: relates.cpp relates.cfg
-       $(DOXYGEN)/bin/doxygen relates.cfg
+       "$(DOXYGEN)/bin/doxygen" relates.cfg
 
 author/html/index.html: author.cpp author.cfg
-       $(DOXYGEN)/bin/doxygen author.cfg
+       "$(DOXYGEN)/bin/doxygen" author.cfg
 
 par/html/index.html: par.cpp par.cfg
-       $(DOXYGEN)/bin/doxygen par.cfg
+       "$(DOXYGEN)/bin/doxygen" par.cfg
 
 overload/html/index.html: overload.cpp overload.cfg
-       $(DOXYGEN)/bin/doxygen overload.cfg
+       "$(DOXYGEN)/bin/doxygen" overload.cfg
 
 example/html/index.html: example.cpp example_test.cpp example.cfg 
-       $(DOXYGEN)/bin/doxygen example.cfg
+       "$(DOXYGEN)/bin/doxygen" example.cfg
 
 include/html/index.html: include.cpp example_test.cpp include.cfg 
-       $(DOXYGEN)/bin/doxygen include.cfg
+       "$(DOXYGEN)/bin/doxygen" include.cfg
 
 qtstyle/html/index.html: qtstyle.cpp qtstyle.cfg 
-       $(DOXYGEN)/bin/doxygen qtstyle.cfg
+       "$(DOXYGEN)/bin/doxygen" qtstyle.cfg
 
 jdstyle/html/index.html: jdstyle.cpp jdstyle.cfg 
-       $(DOXYGEN)/bin/doxygen jdstyle.cfg
+       "$(DOXYGEN)/bin/doxygen" jdstyle.cfg
 
 structcmd/html/index.html: structcmd.h structcmd.cfg 
-       $(DOXYGEN)/bin/doxygen structcmd.cfg
+       "$(DOXYGEN)/bin/doxygen" structcmd.cfg
 
 autolink/html/index.html: autolink.cpp autolink.cfg 
-       $(DOXYGEN)/bin/doxygen autolink.cfg
+       "$(DOXYGEN)/bin/doxygen" autolink.cfg
 
 tag/html/index.html: tag.cpp tag.cfg example/html/index.html
-       $(DOXYGEN)/bin/doxygen tag.cfg
-#      sed -e "1,1s#perl#$(PERL)#g" tag/html/installdox >tag/html/installdox.perl
-#      cd tag/html ; $(PERL) installdox.perl -lexample.tag@../../example/html
+       "$(DOXYGEN)/bin/doxygen" tag.cfg
 
 restypedef/html/index.html: restypedef.cpp restypedef.cfg 
-       $(DOXYGEN)/bin/doxygen restypedef.cfg
+       "$(DOXYGEN)/bin/doxygen" restypedef.cfg
 
 afterdoc/html/index.html: afterdoc.h afterdoc.cfg
-       $(DOXYGEN)/bin/doxygen afterdoc.cfg
+       "$(DOXYGEN)/bin/doxygen" afterdoc.cfg
 
 template/html/index.html: templ.cpp templ.cfg
-       $(DOXYGEN)/bin/doxygen templ.cfg
+       "$(DOXYGEN)/bin/doxygen" templ.cfg
 
 group/html/index.html: group.cpp group.cfg
-       $(DOXYGEN)/bin/doxygen group.cfg
+       "$(DOXYGEN)/bin/doxygen" group.cfg
 
 memgrp/html/index.html: memgrp.cpp memgrp.cfg
-       $(DOXYGEN)/bin/doxygen memgrp.cfg
+       "$(DOXYGEN)/bin/doxygen" memgrp.cfg
 
 pyexample/html/index.html: pyexample.py pyexample.cfg
-       $(DOXYGEN)/bin/doxygen pyexample.cfg
+       "$(DOXYGEN)/bin/doxygen" pyexample.cfg
 
 tclexample/html/index.html: tclexample.tcl tclexample.cfg
-       $(DOXYGEN)/bin/doxygen tclexample.cfg
+       "$(DOXYGEN)/bin/doxygen" tclexample.cfg
 
 mux/html/index.html: mux.vhdl mux.cfg
-       $(DOXYGEN)/bin/doxygen mux.cfg
+       "$(DOXYGEN)/bin/doxygen" mux.cfg
 
 manual/html/index.html: manual.c manual.cfg
-       $(DOXYGEN)/bin/doxygen manual.cfg
+       "$(DOXYGEN)/bin/doxygen" manual.cfg
 
 docstring/html/index.html: docstring.py docstring.cfg
-       $(DOXYGEN)/bin/doxygen docstring.cfg
+       "$(DOXYGEN)/bin/doxygen" docstring.cfg
 
 #dbusxml/html/index.html: dbusxml.xml dbusxml.cfg
 #      $(DOXYGEN)/bin/doxygen dbusxml.cfg
 
 diagrams/html/index.html: diagrams_a.h diagrams_b.h diagrams_c.h diagrams_d.h diagrams_e.h diagrams.cfg
 ifneq ($(HAVE_DOT),)
-       $(DOXYGEN)/bin/doxygen diagrams.cfg
+       "$(DOXYGEN)/bin/doxygen" diagrams.cfg
 endif
 
diff --git a/jquery/Makefile b/jquery/Makefile
new file mode 100644 (file)
index 0000000..83a302b
--- /dev/null
@@ -0,0 +1,42 @@
+JQUERY_VERSION = 1.7.1
+JQUERY_UI_VERSION = 1.8.18
+HASHCHANGE_VERSION = 1.3
+SCROLL_VERSION = 1.4.2
+MINIFIER = /usr/local/bin/yuicompressor-2.4.7
+SCRIPTS = jquery-$(JQUERY_VERSION).js \
+          jquery.ui-$(JQUERY_UI_VERSION).core.js \
+          jquery.ui-$(JQUERY_UI_VERSION).widget.js \
+          jquery.ui-$(JQUERY_UI_VERSION).mouse.js \
+          jquery.ui-$(JQUERY_UI_VERSION).resizable.js \
+          jquery.ba-$(HASHCHANGE_VERSION)-hashchange.js \
+          jquery.scrollTo-$(SCROLL_VERSION).js
+RESULTS = jquery_p1.js jquery_p2.js jquery_p3.js jquery_ui.js jquery_fx.js
+
+SCRIPTS_MIN = $(SCRIPTS:%.js=%-min.js)
+
+all: $(RESULTS)
+
+install: $(RESULTS)
+       cp $(RESULTS) ../src/
+
+jquery_ui.js: scripts
+       cat jquery.ui-$(JQUERY_UI_VERSION).core-min.js \
+            jquery.ui-$(JQUERY_UI_VERSION).widget-min.js \
+            jquery.ui-$(JQUERY_UI_VERSION).mouse-min.js \
+            jquery.ui-$(JQUERY_UI_VERSION).resizable-min.js \
+            jquery.ba-$(HASHCHANGE_VERSION)-hashchange-min.js > jquery_ui.js
+
+jquery_fx.js: scripts
+       cat jquery.scrollTo-$(SCROLL_VERSION)-min.js > jquery_fx.js
+
+jquery_p1.js jquery_p2.js jquery_p3.js: scripts
+       perl split_jquery.pl jquery-$(JQUERY_VERSION)-min.js $@
+
+scripts: $(SCRIPTS_MIN)
+
+clean:
+       rm -f $(SCRIPTS_MIN) $(RESULTS)
+
+%-min.js: %.js
+       java -jar $(MINIFIER).jar --line-break 13000 $^ > $@
+
diff --git a/jquery/README b/jquery/README
new file mode 100644 (file)
index 0000000..314c838
--- /dev/null
@@ -0,0 +1,16 @@
+Doxygen's jquery.js script is composed of minified versions of the following
+packages:
+- jquery    1.7.1:  http://jquery.com/download/ 
+- jquery.ui 1.8.18: https://code.google.com/p/jquery-ui/downloads/list
+    modules required:
+    - jquery.ui.core
+    - jquery.ui.widget
+    - jquery.ui.mouse
+    - jquery.ui.resizable
+- jquery.hashchange: 1.3: http://benalman.com/projects/jquery-hashchange-plugin/
+- jquery.scrollTo: 1.4.2: https://github.com/flesler/jquery.scrollTo
+
+The Makefile will built the jquery_*.js files used by doxygen.
+Some files are split into smaller parts to make sure Visual Studio can compile them 
+as strings.
+
diff --git a/jquery/jquery-1.7.1.js b/jquery/jquery-1.7.1.js
new file mode 100644 (file)
index 0000000..8ccd0ea
--- /dev/null
@@ -0,0 +1,9266 @@
+/*!
+ * jQuery JavaScript Library v1.7.1
+ * http://jquery.com/
+ *
+ * Copyright 2011, John Resig
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ * Copyright 2011, The Dojo Foundation
+ * Released under the MIT, BSD, and GPL Licenses.
+ *
+ * Date: Mon Nov 21 21:11:03 2011 -0500
+ */
+(function( window, undefined ) {
+
+// Use the correct document accordingly with window argument (sandbox)
+var document = window.document,
+       navigator = window.navigator,
+       location = window.location;
+var jQuery = (function() {
+
+// Define a local copy of jQuery
+var jQuery = function( selector, context ) {
+               // The jQuery object is actually just the init constructor 'enhanced'
+               return new jQuery.fn.init( selector, context, rootjQuery );
+       },
+
+       // Map over jQuery in case of overwrite
+       _jQuery = window.jQuery,
+
+       // Map over the $ in case of overwrite
+       _$ = window.$,
+
+       // A central reference to the root jQuery(document)
+       rootjQuery,
+
+       // A simple way to check for HTML strings or ID strings
+       // Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
+       quickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,
+
+       // Check if a string has a non-whitespace character in it
+       rnotwhite = /\S/,
+
+       // Used for trimming whitespace
+       trimLeft = /^\s+/,
+       trimRight = /\s+$/,
+
+       // Match a standalone tag
+       rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/,
+
+       // JSON RegExp
+       rvalidchars = /^[\],:{}\s]*$/,
+       rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,
+       rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,
+       rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
+
+       // Useragent RegExp
+       rwebkit = /(webkit)[ \/]([\w.]+)/,
+       ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/,
+       rmsie = /(msie) ([\w.]+)/,
+       rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/,
+
+       // Matches dashed string for camelizing
+       rdashAlpha = /-([a-z]|[0-9])/ig,
+       rmsPrefix = /^-ms-/,
+
+       // Used by jQuery.camelCase as callback to replace()
+       fcamelCase = function( all, letter ) {
+               return ( letter + "" ).toUpperCase();
+       },
+
+       // Keep a UserAgent string for use with jQuery.browser
+       userAgent = navigator.userAgent,
+
+       // For matching the engine and version of the browser
+       browserMatch,
+
+       // The deferred used on DOM ready
+       readyList,
+
+       // The ready event handler
+       DOMContentLoaded,
+
+       // Save a reference to some core methods
+       toString = Object.prototype.toString,
+       hasOwn = Object.prototype.hasOwnProperty,
+       push = Array.prototype.push,
+       slice = Array.prototype.slice,
+       trim = String.prototype.trim,
+       indexOf = Array.prototype.indexOf,
+
+       // [[Class]] -> type pairs
+       class2type = {};
+
+jQuery.fn = jQuery.prototype = {
+       constructor: jQuery,
+       init: function( selector, context, rootjQuery ) {
+               var match, elem, ret, doc;
+
+               // Handle $(""), $(null), or $(undefined)
+               if ( !selector ) {
+                       return this;
+               }
+
+               // Handle $(DOMElement)
+               if ( selector.nodeType ) {
+                       this.context = this[0] = selector;
+                       this.length = 1;
+                       return this;
+               }
+
+               // The body element only exists once, optimize finding it
+               if ( selector === "body" && !context && document.body ) {
+                       this.context = document;
+                       this[0] = document.body;
+                       this.selector = selector;
+                       this.length = 1;
+                       return this;
+               }
+
+               // Handle HTML strings
+               if ( typeof selector === "string" ) {
+                       // Are we dealing with HTML string or an ID?
+                       if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {
+                               // Assume that strings that start and end with <> are HTML and skip the regex check
+                               match = [ null, selector, null ];
+
+                       } else {
+                               match = quickExpr.exec( selector );
+                       }
+
+                       // Verify a match, and that no context was specified for #id
+                       if ( match && (match[1] || !context) ) {
+
+                               // HANDLE: $(html) -> $(array)
+                               if ( match[1] ) {
+                                       context = context instanceof jQuery ? context[0] : context;
+                                       doc = ( context ? context.ownerDocument || context : document );
+
+                                       // If a single string is passed in and it's a single tag
+                                       // just do a createElement and skip the rest
+                                       ret = rsingleTag.exec( selector );
+
+                                       if ( ret ) {
+                                               if ( jQuery.isPlainObject( context ) ) {
+                                                       selector = [ document.createElement( ret[1] ) ];
+                                                       jQuery.fn.attr.call( selector, context, true );
+
+                                               } else {
+                                                       selector = [ doc.createElement( ret[1] ) ];
+                                               }
+
+                                       } else {
+                                               ret = jQuery.buildFragment( [ match[1] ], [ doc ] );
+                                               selector = ( ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment ).childNodes;
+                                       }
+
+                                       return jQuery.merge( this, selector );
+
+                               // HANDLE: $("#id")
+                               } else {
+                                       elem = document.getElementById( match[2] );
+
+                                       // Check parentNode to catch when Blackberry 4.6 returns
+                                       // nodes that are no longer in the document #6963
+                                       if ( elem && elem.parentNode ) {
+                                               // Handle the case where IE and Opera return items
+                                               // by name instead of ID
+                                               if ( elem.id !== match[2] ) {
+                                                       return rootjQuery.find( selector );
+                                               }
+
+                                               // Otherwise, we inject the element directly into the jQuery object
+                                               this.length = 1;
+                                               this[0] = elem;
+                                       }
+
+                                       this.context = document;
+                                       this.selector = selector;
+                                       return this;
+                               }
+
+                       // HANDLE: $(expr, $(...))
+                       } else if ( !context || context.jquery ) {
+                               return ( context || rootjQuery ).find( selector );
+
+                       // HANDLE: $(expr, context)
+                       // (which is just equivalent to: $(context).find(expr)
+                       } else {
+                               return this.constructor( context ).find( selector );
+                       }
+
+               // HANDLE: $(function)
+               // Shortcut for document ready
+               } else if ( jQuery.isFunction( selector ) ) {
+                       return rootjQuery.ready( selector );
+               }
+
+               if ( selector.selector !== undefined ) {
+                       this.selector = selector.selector;
+                       this.context = selector.context;
+               }
+
+               return jQuery.makeArray( selector, this );
+       },
+
+       // Start with an empty selector
+       selector: "",
+
+       // The current version of jQuery being used
+       jquery: "1.7.1",
+
+       // The default length of a jQuery object is 0
+       length: 0,
+
+       // The number of elements contained in the matched element set
+       size: function() {
+               return this.length;
+       },
+
+       toArray: function() {
+               return slice.call( this, 0 );
+       },
+
+       // Get the Nth element in the matched element set OR
+       // Get the whole matched element set as a clean array
+       get: function( num ) {
+               return num == null ?
+
+                       // Return a 'clean' array
+                       this.toArray() :
+
+                       // Return just the object
+                       ( num < 0 ? this[ this.length + num ] : this[ num ] );
+       },
+
+       // Take an array of elements and push it onto the stack
+       // (returning the new matched element set)
+       pushStack: function( elems, name, selector ) {
+               // Build a new jQuery matched element set
+               var ret = this.constructor();
+
+               if ( jQuery.isArray( elems ) ) {
+                       push.apply( ret, elems );
+
+               } else {
+                       jQuery.merge( ret, elems );
+               }
+
+               // Add the old object onto the stack (as a reference)
+               ret.prevObject = this;
+
+               ret.context = this.context;
+
+               if ( name === "find" ) {
+                       ret.selector = this.selector + ( this.selector ? " " : "" ) + selector;
+               } else if ( name ) {
+                       ret.selector = this.selector + "." + name + "(" + selector + ")";
+               }
+
+               // Return the newly-formed element set
+               return ret;
+       },
+
+       // Execute a callback for every element in the matched set.
+       // (You can seed the arguments with an array of args, but this is
+       // only used internally.)
+       each: function( callback, args ) {
+               return jQuery.each( this, callback, args );
+       },
+
+       ready: function( fn ) {
+               // Attach the listeners
+               jQuery.bindReady();
+
+               // Add the callback
+               readyList.add( fn );
+
+               return this;
+       },
+
+       eq: function( i ) {
+               i = +i;
+               return i === -1 ?
+                       this.slice( i ) :
+                       this.slice( i, i + 1 );
+       },
+
+       first: function() {
+               return this.eq( 0 );
+       },
+
+       last: function() {
+               return this.eq( -1 );
+       },
+
+       slice: function() {
+               return this.pushStack( slice.apply( this, arguments ),
+                       "slice", slice.call(arguments).join(",") );
+       },
+
+       map: function( callback ) {
+               return this.pushStack( jQuery.map(this, function( elem, i ) {
+                       return callback.call( elem, i, elem );
+               }));
+       },
+
+       end: function() {
+               return this.prevObject || this.constructor(null);
+       },
+
+       // For internal use only.
+       // Behaves like an Array's method, not like a jQuery method.
+       push: push,
+       sort: [].sort,
+       splice: [].splice
+};
+
+// Give the init function the jQuery prototype for later instantiation
+jQuery.fn.init.prototype = jQuery.fn;
+
+jQuery.extend = jQuery.fn.extend = function() {
+       var options, name, src, copy, copyIsArray, clone,
+               target = arguments[0] || {},
+               i = 1,
+               length = arguments.length,
+               deep = false;
+
+       // Handle a deep copy situation
+       if ( typeof target === "boolean" ) {
+               deep = target;
+               target = arguments[1] || {};
+               // skip the boolean and the target
+               i = 2;
+       }
+
+       // Handle case when target is a string or something (possible in deep copy)
+       if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
+               target = {};
+       }
+
+       // extend jQuery itself if only one argument is passed
+       if ( length === i ) {
+               target = this;
+               --i;
+       }
+
+       for ( ; i < length; i++ ) {
+               // Only deal with non-null/undefined values
+               if ( (options = arguments[ i ]) != null ) {
+                       // Extend the base object
+                       for ( name in options ) {
+                               src = target[ name ];
+                               copy = options[ name ];
+
+                               // Prevent never-ending loop
+                               if ( target === copy ) {
+                                       continue;
+                               }
+
+                               // Recurse if we're merging plain objects or arrays
+                               if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
+                                       if ( copyIsArray ) {
+                                               copyIsArray = false;
+                                               clone = src && jQuery.isArray(src) ? src : [];
+
+                                       } else {
+                                               clone = src && jQuery.isPlainObject(src) ? src : {};
+                                       }
+
+                                       // Never move original objects, clone them
+                                       target[ name ] = jQuery.extend( deep, clone, copy );
+
+                               // Don't bring in undefined values
+                               } else if ( copy !== undefined ) {
+                                       target[ name ] = copy;
+                               }
+                       }
+               }
+       }
+
+       // Return the modified object
+       return target;
+};
+
+jQuery.extend({
+       noConflict: function( deep ) {
+               if ( window.$ === jQuery ) {
+                       window.$ = _$;
+               }
+
+               if ( deep && window.jQuery === jQuery ) {
+                       window.jQuery = _jQuery;
+               }
+
+               return jQuery;
+       },
+
+       // Is the DOM ready to be used? Set to true once it occurs.
+       isReady: false,
+
+       // A counter to track how many items to wait for before
+       // the ready event fires. See #6781
+       readyWait: 1,
+
+       // Hold (or release) the ready event
+       holdReady: function( hold ) {
+               if ( hold ) {
+                       jQuery.readyWait++;
+               } else {
+                       jQuery.ready( true );
+               }
+       },
+
+       // Handle when the DOM is ready
+       ready: function( wait ) {
+               // Either a released hold or an DOMready/load event and not yet ready
+               if ( (wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady) ) {
+                       // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
+                       if ( !document.body ) {
+                               return setTimeout( jQuery.ready, 1 );
+                       }
+
+                       // Remember that the DOM is ready
+                       jQuery.isReady = true;
+
+                       // If a normal DOM Ready event fired, decrement, and wait if need be
+                       if ( wait !== true && --jQuery.readyWait > 0 ) {
+                               return;
+                       }
+
+                       // If there are functions bound, to execute
+                       readyList.fireWith( document, [ jQuery ] );
+
+                       // Trigger any bound ready events
+                       if ( jQuery.fn.trigger ) {
+                               jQuery( document ).trigger( "ready" ).off( "ready" );
+                       }
+               }
+       },
+
+       bindReady: function() {
+               if ( readyList ) {
+                       return;
+               }
+
+               readyList = jQuery.Callbacks( "once memory" );
+
+               // Catch cases where $(document).ready() is called after the
+               // browser event has already occurred.
+               if ( document.readyState === "complete" ) {
+                       // Handle it asynchronously to allow scripts the opportunity to delay ready
+                       return setTimeout( jQuery.ready, 1 );
+               }
+
+               // Mozilla, Opera and webkit nightlies currently support this event
+               if ( document.addEventListener ) {
+                       // Use the handy event callback
+                       document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
+
+                       // A fallback to window.onload, that will always work
+                       window.addEventListener( "load", jQuery.ready, false );
+
+               // If IE event model is used
+               } else if ( document.attachEvent ) {
+                       // ensure firing before onload,
+                       // maybe late but safe also for iframes
+                       document.attachEvent( "onreadystatechange", DOMContentLoaded );
+
+                       // A fallback to window.onload, that will always work
+                       window.attachEvent( "onload", jQuery.ready );
+
+                       // If IE and not a frame
+                       // continually check to see if the document is ready
+                       var toplevel = false;
+
+                       try {
+                               toplevel = window.frameElement == null;
+                       } catch(e) {}
+
+                       if ( document.documentElement.doScroll && toplevel ) {
+                               doScrollCheck();
+                       }
+               }
+       },
+
+       // See test/unit/core.js for details concerning isFunction.
+       // Since version 1.3, DOM methods and functions like alert
+       // aren't supported. They return false on IE (#2968).
+       isFunction: function( obj ) {
+               return jQuery.type(obj) === "function";
+       },
+
+       isArray: Array.isArray || function( obj ) {
+               return jQuery.type(obj) === "array";
+       },
+
+       // A crude way of determining if an object is a window
+       isWindow: function( obj ) {
+               return obj && typeof obj === "object" && "setInterval" in obj;
+       },
+
+       isNumeric: function( obj ) {
+               return !isNaN( parseFloat(obj) ) && isFinite( obj );
+       },
+
+       type: function( obj ) {
+               return obj == null ?
+                       String( obj ) :
+                       class2type[ toString.call(obj) ] || "object";
+       },
+
+       isPlainObject: function( obj ) {
+               // Must be an Object.
+               // Because of IE, we also have to check the presence of the constructor property.
+               // Make sure that DOM nodes and window objects don't pass through, as well
+               if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
+                       return false;
+               }
+
+               try {
+                       // Not own constructor property must be Object
+                       if ( obj.constructor &&
+                               !hasOwn.call(obj, "constructor") &&
+                               !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
+                               return false;
+                       }
+               } catch ( e ) {
+                       // IE8,9 Will throw exceptions on certain host objects #9897
+                       return false;
+               }
+
+               // Own properties are enumerated firstly, so to speed up,
+               // if last one is own, then all properties are own.
+
+               var key;
+               for ( key in obj ) {}
+
+               return key === undefined || hasOwn.call( obj, key );
+       },
+
+       isEmptyObject: function( obj ) {
+               for ( var name in obj ) {
+                       return false;
+               }
+               return true;
+       },
+
+       error: function( msg ) {
+               throw new Error( msg );
+       },
+
+       parseJSON: function( data ) {
+               if ( typeof data !== "string" || !data ) {
+                       return null;
+               }
+
+               // Make sure leading/trailing whitespace is removed (IE can't handle it)
+               data = jQuery.trim( data );
+
+               // Attempt to parse using the native JSON parser first
+               if ( window.JSON && window.JSON.parse ) {
+                       return window.JSON.parse( data );
+               }
+
+               // Make sure the incoming data is actual JSON
+               // Logic borrowed from http://json.org/json2.js
+               if ( rvalidchars.test( data.replace( rvalidescape, "@" )
+                       .replace( rvalidtokens, "]" )
+                       .replace( rvalidbraces, "")) ) {
+
+                       return ( new Function( "return " + data ) )();
+
+               }
+               jQuery.error( "Invalid JSON: " + data );
+       },
+
+       // Cross-browser xml parsing
+       parseXML: function( data ) {
+               var xml, tmp;
+               try {
+                       if ( window.DOMParser ) { // Standard
+                               tmp = new DOMParser();
+                               xml = tmp.parseFromString( data , "text/xml" );
+                       } else { // IE
+                               xml = new ActiveXObject( "Microsoft.XMLDOM" );
+                               xml.async = "false";
+                               xml.loadXML( data );
+                       }
+               } catch( e ) {
+                       xml = undefined;
+               }
+               if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) {
+                       jQuery.error( "Invalid XML: " + data );
+               }
+               return xml;
+       },
+
+       noop: function() {},
+
+       // Evaluates a script in a global context
+       // Workarounds based on findings by Jim Driscoll
+       // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
+       globalEval: function( data ) {
+               if ( data && rnotwhite.test( data ) ) {
+                       // We use execScript on Internet Explorer
+                       // We use an anonymous function so that context is window
+                       // rather than jQuery in Firefox
+                       ( window.execScript || function( data ) {
+                               window[ "eval" ].call( window, data );
+                       } )( data );
+               }
+       },
+
+       // Convert dashed to camelCase; used by the css and data modules
+       // Microsoft forgot to hump their vendor prefix (#9572)
+       camelCase: function( string ) {
+               return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
+       },
+
+       nodeName: function( elem, name ) {
+               return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase();
+       },
+
+       // args is for internal usage only
+       each: function( object, callback, args ) {
+               var name, i = 0,
+                       length = object.length,
+                       isObj = length === undefined || jQuery.isFunction( object );
+
+               if ( args ) {
+                       if ( isObj ) {
+                               for ( name in object ) {
+                                       if ( callback.apply( object[ name ], args ) === false ) {
+                                               break;
+                                       }
+                               }
+                       } else {
+                               for ( ; i < length; ) {
+                                       if ( callback.apply( object[ i++ ], args ) === false ) {
+                                               break;
+                                       }
+                               }
+                       }
+
+               // A special, fast, case for the most common use of each
+               } else {
+                       if ( isObj ) {
+                               for ( name in object ) {
+                                       if ( callback.call( object[ name ], name, object[ name ] ) === false ) {
+                                               break;
+                                       }
+                               }
+                       } else {
+                               for ( ; i < length; ) {
+                                       if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) {
+                                               break;
+                                       }
+                               }
+                       }
+               }
+
+               return object;
+       },
+
+       // Use native String.trim function wherever possible
+       trim: trim ?
+               function( text ) {
+                       return text == null ?
+                               "" :
+                               trim.call( text );
+               } :
+
+               // Otherwise use our own trimming functionality
+               function( text ) {
+                       return text == null ?
+                               "" :
+                               text.toString().replace( trimLeft, "" ).replace( trimRight, "" );
+               },
+
+       // results is for internal usage only
+       makeArray: function( array, results ) {
+               var ret = results || [];
+
+               if ( array != null ) {
+                       // The window, strings (and functions) also have 'length'
+                       // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930
+                       var type = jQuery.type( array );
+
+                       if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) {
+                               push.call( ret, array );
+                       } else {
+                               jQuery.merge( ret, array );
+                       }
+               }
+
+               return ret;
+       },
+
+       inArray: function( elem, array, i ) {
+               var len;
+
+               if ( array ) {
+                       if ( indexOf ) {
+                               return indexOf.call( array, elem, i );
+                       }
+
+                       len = array.length;
+                       i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;
+
+                       for ( ; i < len; i++ ) {
+                               // Skip accessing in sparse arrays
+                               if ( i in array && array[ i ] === elem ) {
+                                       return i;
+                               }
+                       }
+               }
+
+               return -1;
+       },
+
+       merge: function( first, second ) {
+               var i = first.length,
+                       j = 0;
+
+               if ( typeof second.length === "number" ) {
+                       for ( var l = second.length; j < l; j++ ) {
+                               first[ i++ ] = second[ j ];
+                       }
+
+               } else {
+                       while ( second[j] !== undefined ) {
+                               first[ i++ ] = second[ j++ ];
+                       }
+               }
+
+               first.length = i;
+
+               return first;
+       },
+
+       grep: function( elems, callback, inv ) {
+               var ret = [], retVal;
+               inv = !!inv;
+
+               // Go through the array, only saving the items
+               // that pass the validator function
+               for ( var i = 0, length = elems.length; i < length; i++ ) {
+                       retVal = !!callback( elems[ i ], i );
+                       if ( inv !== retVal ) {
+                               ret.push( elems[ i ] );
+                       }
+               }
+
+               return ret;
+       },
+
+       // arg is for internal usage only
+       map: function( elems, callback, arg ) {
+               var value, key, ret = [],
+                       i = 0,
+                       length = elems.length,
+                       // jquery objects are treated as arrays
+                       isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ;
+
+               // Go through the array, translating each of the items to their
+               if ( isArray ) {
+                       for ( ; i < length; i++ ) {
+                               value = callback( elems[ i ], i, arg );
+
+                               if ( value != null ) {
+                                       ret[ ret.length ] = value;
+                               }
+                       }
+
+               // Go through every key on the object,
+               } else {
+                       for ( key in elems ) {
+                               value = callback( elems[ key ], key, arg );
+
+                               if ( value != null ) {
+                                       ret[ ret.length ] = value;
+                               }
+                       }
+               }
+
+               // Flatten any nested arrays
+               return ret.concat.apply( [], ret );
+       },
+
+       // A global GUID counter for objects
+       guid: 1,
+
+       // Bind a function to a context, optionally partially applying any
+       // arguments.
+       proxy: function( fn, context ) {
+               if ( typeof context === "string" ) {
+                       var tmp = fn[ context ];
+                       context = fn;
+                       fn = tmp;
+               }
+
+               // Quick check to determine if target is callable, in the spec
+               // this throws a TypeError, but we will just return undefined.
+               if ( !jQuery.isFunction( fn ) ) {
+                       return undefined;
+               }
+
+               // Simulated bind
+               var args = slice.call( arguments, 2 ),
+                       proxy = function() {
+                               return fn.apply( context, args.concat( slice.call( arguments ) ) );
+                       };
+
+               // Set the guid of unique handler to the same of original handler, so it can be removed
+               proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;
+
+               return proxy;
+       },
+
+       // Mutifunctional method to get and set values to a collection
+       // The value/s can optionally be executed if it's a function
+       access: function( elems, key, value, exec, fn, pass ) {
+               var length = elems.length;
+
+               // Setting many attributes
+               if ( typeof key === "object" ) {
+                       for ( var k in key ) {
+                               jQuery.access( elems, k, key[k], exec, fn, value );
+                       }
+                       return elems;
+               }
+
+               // Setting one attribute
+               if ( value !== undefined ) {
+                       // Optionally, function values get executed if exec is true
+                       exec = !pass && exec && jQuery.isFunction(value);
+
+                       for ( var i = 0; i < length; i++ ) {
+                               fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
+                       }
+
+                       return elems;
+               }
+
+               // Getting an attribute
+               return length ? fn( elems[0], key ) : undefined;
+       },
+
+       now: function() {
+               return ( new Date() ).getTime();
+       },
+
+       // Use of jQuery.browser is frowned upon.
+       // More details: http://docs.jquery.com/Utilities/jQuery.browser
+       uaMatch: function( ua ) {
+               ua = ua.toLowerCase();
+
+               var match = rwebkit.exec( ua ) ||
+                       ropera.exec( ua ) ||
+                       rmsie.exec( ua ) ||
+                       ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) ||
+                       [];
+
+               return { browser: match[1] || "", version: match[2] || "0" };
+       },
+
+       sub: function() {
+               function jQuerySub( selector, context ) {
+                       return new jQuerySub.fn.init( selector, context );
+               }
+               jQuery.extend( true, jQuerySub, this );
+               jQuerySub.superclass = this;
+               jQuerySub.fn = jQuerySub.prototype = this();
+               jQuerySub.fn.constructor = jQuerySub;
+               jQuerySub.sub = this.sub;
+               jQuerySub.fn.init = function init( selector, context ) {
+                       if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) {
+                               context = jQuerySub( context );
+                       }
+
+                       return jQuery.fn.init.call( this, selector, context, rootjQuerySub );
+               };
+               jQuerySub.fn.init.prototype = jQuerySub.fn;
+               var rootjQuerySub = jQuerySub(document);
+               return jQuerySub;
+       },
+
+       browser: {}
+});
+
+// Populate the class2type map
+jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) {
+       class2type[ "[object " + name + "]" ] = name.toLowerCase();
+});
+
+browserMatch = jQuery.uaMatch( userAgent );
+if ( browserMatch.browser ) {
+       jQuery.browser[ browserMatch.browser ] = true;
+       jQuery.browser.version = browserMatch.version;
+}
+
+// Deprecated, use jQuery.browser.webkit instead
+if ( jQuery.browser.webkit ) {
+       jQuery.browser.safari = true;
+}
+
+// IE doesn't match non-breaking spaces with \s
+if ( rnotwhite.test( "\xA0" ) ) {
+       trimLeft = /^[\s\xA0]+/;
+       trimRight = /[\s\xA0]+$/;
+}
+
+// All jQuery objects should point back to these
+rootjQuery = jQuery(document);
+
+// Cleanup functions for the document ready method
+if ( document.addEventListener ) {
+       DOMContentLoaded = function() {
+               document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
+               jQuery.ready();
+       };
+
+} else if ( document.attachEvent ) {
+       DOMContentLoaded = function() {
+               // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
+               if ( document.readyState === "complete" ) {
+                       document.detachEvent( "onreadystatechange", DOMContentLoaded );
+                       jQuery.ready();
+               }
+       };
+}
+
+// The DOM ready check for Internet Explorer
+function doScrollCheck() {
+       if ( jQuery.isReady ) {
+               return;
+       }
+
+       try {
+               // If IE is used, use the trick by Diego Perini
+               // http://javascript.nwbox.com/IEContentLoaded/
+               document.documentElement.doScroll("left");
+       } catch(e) {
+               setTimeout( doScrollCheck, 1 );
+               return;
+       }
+
+       // and execute any waiting functions
+       jQuery.ready();
+}
+
+return jQuery;
+
+})();
+
+
+// String to Object flags format cache
+var flagsCache = {};
+
+// Convert String-formatted flags into Object-formatted ones and store in cache
+function createFlags( flags ) {
+       var object = flagsCache[ flags ] = {},
+               i, length;
+       flags = flags.split( /\s+/ );
+       for ( i = 0, length = flags.length; i < length; i++ ) {
+               object[ flags[i] ] = true;
+       }
+       return object;
+}
+
+/*
+ * Create a callback list using the following parameters:
+ *
+ *     flags:  an optional list of space-separated flags that will change how
+ *                     the callback list behaves
+ *
+ * By default a callback list will act like an event callback list and can be
+ * "fired" multiple times.
+ *
+ * Possible flags:
+ *
+ *     once:                   will ensure the callback list can only be fired once (like a Deferred)
+ *
+ *     memory:                 will keep track of previous values and will call any callback added
+ *                                     after the list has been fired right away with the latest "memorized"
+ *                                     values (like a Deferred)
+ *
+ *     unique:                 will ensure a callback can only be added once (no duplicate in the list)
+ *
+ *     stopOnFalse:    interrupt callings when a callback returns false
+ *
+ */
+jQuery.Callbacks = function( flags ) {
+
+       // Convert flags from String-formatted to Object-formatted
+       // (we check in cache first)
+       flags = flags ? ( flagsCache[ flags ] || createFlags( flags ) ) : {};
+
+       var // Actual callback list
+               list = [],
+               // Stack of fire calls for repeatable lists
+               stack = [],
+               // Last fire value (for non-forgettable lists)
+               memory,
+               // Flag to know if list is currently firing
+               firing,
+               // First callback to fire (used internally by add and fireWith)
+               firingStart,
+               // End of the loop when firing
+               firingLength,
+               // Index of currently firing callback (modified by remove if needed)
+               firingIndex,
+               // Add one or several callbacks to the list
+               add = function( args ) {
+                       var i,
+                               length,
+                               elem,
+                               type,
+                               actual;
+                       for ( i = 0, length = args.length; i < length; i++ ) {
+                               elem = args[ i ];
+                               type = jQuery.type( elem );
+                               if ( type === "array" ) {
+                                       // Inspect recursively
+                                       add( elem );
+                               } else if ( type === "function" ) {
+                                       // Add if not in unique mode and callback is not in
+                                       if ( !flags.unique || !self.has( elem ) ) {
+                                               list.push( elem );
+                                       }
+                               }
+                       }
+               },
+               // Fire callbacks
+               fire = function( context, args ) {
+                       args = args || [];
+                       memory = !flags.memory || [ context, args ];
+                       firing = true;
+                       firingIndex = firingStart || 0;
+                       firingStart = 0;
+                       firingLength = list.length;
+                       for ( ; list && firingIndex < firingLength; firingIndex++ ) {
+                               if ( list[ firingIndex ].apply( context, args ) === false && flags.stopOnFalse ) {
+                                       memory = true; // Mark as halted
+                                       break;
+                               }
+                       }
+                       firing = false;
+                       if ( list ) {
+                               if ( !flags.once ) {
+                                       if ( stack && stack.length ) {
+                                               memory = stack.shift();
+                                               self.fireWith( memory[ 0 ], memory[ 1 ] );
+                                       }
+                               } else if ( memory === true ) {
+                                       self.disable();
+                               } else {
+                                       list = [];
+                               }
+                       }
+               },
+               // Actual Callbacks object
+               self = {
+                       // Add a callback or a collection of callbacks to the list
+                       add: function() {
+                               if ( list ) {
+                                       var length = list.length;
+                                       add( arguments );
+                                       // Do we need to add the callbacks to the
+                                       // current firing batch?
+                                       if ( firing ) {
+                                               firingLength = list.length;
+                                       // With memory, if we're not firing then
+                                       // we should call right away, unless previous
+                                       // firing was halted (stopOnFalse)
+                                       } else if ( memory && memory !== true ) {
+                                               firingStart = length;
+                                               fire( memory[ 0 ], memory[ 1 ] );
+                                       }
+                               }
+                               return this;
+                       },
+                       // Remove a callback from the list
+                       remove: function() {
+                               if ( list ) {
+                                       var args = arguments,
+                                               argIndex = 0,
+                                               argLength = args.length;
+                                       for ( ; argIndex < argLength ; argIndex++ ) {
+                                               for ( var i = 0; i < list.length; i++ ) {
+                                                       if ( args[ argIndex ] === list[ i ] ) {
+                                                               // Handle firingIndex and firingLength
+                                                               if ( firing ) {
+                                                                       if ( i <= firingLength ) {
+                                                                               firingLength--;
+                                                                               if ( i <= firingIndex ) {
+                                                                                       firingIndex--;
+                                                                               }
+                                                                       }
+                                                               }
+                                                               // Remove the element
+                                                               list.splice( i--, 1 );
+                                                               // If we have some unicity property then
+                                                               // we only need to do this once
+                                                               if ( flags.unique ) {
+                                                                       break;
+                                                               }
+                                                       }
+                                               }
+                                       }
+                               }
+                               return this;
+                       },
+                       // Control if a given callback is in the list
+                       has: function( fn ) {
+                               if ( list ) {
+                                       var i = 0,
+                                               length = list.length;
+                                       for ( ; i < length; i++ ) {
+                                               if ( fn === list[ i ] ) {
+                                                       return true;
+                                               }
+                                       }
+                               }
+                               return false;
+                       },
+                       // Remove all callbacks from the list
+                       empty: function() {
+                               list = [];
+                               return this;
+                       },
+                       // Have the list do nothing anymore
+                       disable: function() {
+                               list = stack = memory = undefined;
+                               return this;
+                       },
+                       // Is it disabled?
+                       disabled: function() {
+                               return !list;
+                       },
+                       // Lock the list in its current state
+                       lock: function() {
+                               stack = undefined;
+                               if ( !memory || memory === true ) {
+                                       self.disable();
+                               }
+                               return this;
+                       },
+                       // Is it locked?
+                       locked: function() {
+                               return !stack;
+                       },
+                       // Call all callbacks with the given context and arguments
+                       fireWith: function( context, args ) {
+                               if ( stack ) {
+                                       if ( firing ) {
+                                               if ( !flags.once ) {
+                                                       stack.push( [ context, args ] );
+                                               }
+                                       } else if ( !( flags.once && memory ) ) {
+                                               fire( context, args );
+                                       }
+                               }
+                               return this;
+                       },
+                       // Call all the callbacks with the given arguments
+                       fire: function() {
+                               self.fireWith( this, arguments );
+                               return this;
+                       },
+                       // To know if the callbacks have already been called at least once
+                       fired: function() {
+                               return !!memory;
+                       }
+               };
+
+       return self;
+};
+
+
+
+
+var // Static reference to slice
+       sliceDeferred = [].slice;
+
+jQuery.extend({
+
+       Deferred: function( func ) {
+               var doneList = jQuery.Callbacks( "once memory" ),
+                       failList = jQuery.Callbacks( "once memory" ),
+                       progressList = jQuery.Callbacks( "memory" ),
+                       state = "pending",
+                       lists = {
+                               resolve: doneList,
+                               reject: failList,
+                               notify: progressList
+                       },
+                       promise = {
+                               done: doneList.add,
+                               fail: failList.add,
+                               progress: progressList.add,
+
+                               state: function() {
+                                       return state;
+                               },
+
+                               // Deprecated
+                               isResolved: doneList.fired,
+                               isRejected: failList.fired,
+
+                               then: function( doneCallbacks, failCallbacks, progressCallbacks ) {
+                                       deferred.done( doneCallbacks ).fail( failCallbacks ).progress( progressCallbacks );
+                                       return this;
+                               },
+                               always: function() {
+                                       deferred.done.apply( deferred, arguments ).fail.apply( deferred, arguments );
+                                       return this;
+                               },
+                               pipe: function( fnDone, fnFail, fnProgress ) {
+                                       return jQuery.Deferred(function( newDefer ) {
+                                               jQuery.each( {
+                                                       done: [ fnDone, "resolve" ],
+                                                       fail: [ fnFail, "reject" ],
+                                                       progress: [ fnProgress, "notify" ]
+                                               }, function( handler, data ) {
+                                                       var fn = data[ 0 ],
+                                                               action = data[ 1 ],
+                                                               returned;
+                                                       if ( jQuery.isFunction( fn ) ) {
+                                                               deferred[ handler ](function() {
+                                                                       returned = fn.apply( this, arguments );
+                                                                       if ( returned && jQuery.isFunction( returned.promise ) ) {
+                                                                               returned.promise().then( newDefer.resolve, newDefer.reject, newDefer.notify );
+                                                                       } else {
+                                                                               newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] );
+                                                                       }
+                                                               });
+                                                       } else {
+                                                               deferred[ handler ]( newDefer[ action ] );
+                                                       }
+                                               });
+                                       }).promise();
+                               },
+                               // Get a promise for this deferred
+                               // If obj is provided, the promise aspect is added to the object
+                               promise: function( obj ) {
+                                       if ( obj == null ) {
+                                               obj = promise;
+                                       } else {
+                                               for ( var key in promise ) {
+                                                       obj[ key ] = promise[ key ];
+                                               }
+                                       }
+                                       return obj;
+                               }
+                       },
+                       deferred = promise.promise({}),
+                       key;
+
+               for ( key in lists ) {
+                       deferred[ key ] = lists[ key ].fire;
+                       deferred[ key + "With" ] = lists[ key ].fireWith;
+               }
+
+               // Handle state
+               deferred.done( function() {
+                       state = "resolved";
+               }, failList.disable, progressList.lock ).fail( function() {
+                       state = "rejected";
+               }, doneList.disable, progressList.lock );
+
+               // Call given func if any
+               if ( func ) {
+                       func.call( deferred, deferred );
+               }
+
+               // All done!
+               return deferred;
+       },
+
+       // Deferred helper
+       when: function( firstParam ) {
+               var args = sliceDeferred.call( arguments, 0 ),
+                       i = 0,
+                       length = args.length,
+                       pValues = new Array( length ),
+                       count = length,
+                       pCount = length,
+                       deferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ?
+                               firstParam :
+                               jQuery.Deferred(),
+                       promise = deferred.promise();
+               function resolveFunc( i ) {
+                       return function( value ) {
+                               args[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value;
+                               if ( !( --count ) ) {
+                                       deferred.resolveWith( deferred, args );
+                               }
+                       };
+               }
+               function progressFunc( i ) {
+                       return function( value ) {
+                               pValues[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value;
+                               deferred.notifyWith( promise, pValues );
+                       };
+               }
+               if ( length > 1 ) {
+                       for ( ; i < length; i++ ) {
+                               if ( args[ i ] && args[ i ].promise && jQuery.isFunction( args[ i ].promise ) ) {
+                                       args[ i ].promise().then( resolveFunc(i), deferred.reject, progressFunc(i) );
+                               } else {
+                                       --count;
+                               }
+                       }
+                       if ( !count ) {
+                               deferred.resolveWith( deferred, args );
+                       }
+               } else if ( deferred !== firstParam ) {
+                       deferred.resolveWith( deferred, length ? [ firstParam ] : [] );
+               }
+               return promise;
+       }
+});
+
+
+
+
+jQuery.support = (function() {
+
+       var support,
+               all,
+               a,
+               select,
+               opt,
+               input,
+               marginDiv,
+               fragment,
+               tds,
+               events,
+               eventName,
+               i,
+               isSupported,
+               div = document.createElement( "div" ),
+               documentElement = document.documentElement;
+
+       // Preliminary tests
+       div.setAttribute("className", "t");
+       div.innerHTML = "   <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>";
+
+       all = div.getElementsByTagName( "*" );
+       a = div.getElementsByTagName( "a" )[ 0 ];
+
+       // Can't get basic test support
+       if ( !all || !all.length || !a ) {
+               return {};
+       }
+
+       // First batch of supports tests
+       select = document.createElement( "select" );
+       opt = select.appendChild( document.createElement("option") );
+       input = div.getElementsByTagName( "input" )[ 0 ];
+
+       support = {
+               // IE strips leading whitespace when .innerHTML is used
+               leadingWhitespace: ( div.firstChild.nodeType === 3 ),
+
+               // Make sure that tbody elements aren't automatically inserted
+               // IE will insert them into empty tables
+               tbody: !div.getElementsByTagName("tbody").length,
+
+               // Make sure that link elements get serialized correctly by innerHTML
+               // This requires a wrapper element in IE
+               htmlSerialize: !!div.getElementsByTagName("link").length,
+
+               // Get the style information from getAttribute
+               // (IE uses .cssText instead)
+               style: /top/.test( a.getAttribute("style") ),
+
+               // Make sure that URLs aren't manipulated
+               // (IE normalizes it by default)
+               hrefNormalized: ( a.getAttribute("href") === "/a" ),
+
+               // Make sure that element opacity exists
+               // (IE uses filter instead)
+               // Use a regex to work around a WebKit issue. See #5145
+               opacity: /^0.55/.test( a.style.opacity ),
+
+               // Verify style float existence
+               // (IE uses styleFloat instead of cssFloat)
+               cssFloat: !!a.style.cssFloat,
+
+               // Make sure that if no value is specified for a checkbox
+               // that it defaults to "on".
+               // (WebKit defaults to "" instead)
+               checkOn: ( input.value === "on" ),
+
+               // Make sure that a selected-by-default option has a working selected property.
+               // (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
+               optSelected: opt.selected,
+
+               // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
+               getSetAttribute: div.className !== "t",
+
+               // Tests for enctype support on a form(#6743)
+               enctype: !!document.createElement("form").enctype,
+
+               // Makes sure cloning an html5 element does not cause problems
+               // Where outerHTML is undefined, this still works
+               html5Clone: document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav></:nav>",
+
+               // Will be defined later
+               submitBubbles: true,
+               changeBubbles: true,
+               focusinBubbles: false,
+               deleteExpando: true,
+               noCloneEvent: true,
+               inlineBlockNeedsLayout: false,
+               shrinkWrapBlocks: false,
+               reliableMarginRight: true
+       };
+
+       // Make sure checked status is properly cloned
+       input.checked = true;
+       support.noCloneChecked = input.cloneNode( true ).checked;
+
+       // Make sure that the options inside disabled selects aren't marked as disabled
+       // (WebKit marks them as disabled)
+       select.disabled = true;
+       support.optDisabled = !opt.disabled;
+
+       // Test to see if it's possible to delete an expando from an element
+       // Fails in Internet Explorer
+       try {
+               delete div.test;
+       } catch( e ) {
+               support.deleteExpando = false;
+       }
+
+       if ( !div.addEventListener && div.attachEvent && div.fireEvent ) {
+               div.attachEvent( "onclick", function() {
+                       // Cloning a node shouldn't copy over any
+                       // bound event handlers (IE does this)
+                       support.noCloneEvent = false;
+               });
+               div.cloneNode( true ).fireEvent( "onclick" );
+       }
+
+       // Check if a radio maintains its value
+       // after being appended to the DOM
+       input = document.createElement("input");
+       input.value = "t";
+       input.setAttribute("type", "radio");
+       support.radioValue = input.value === "t";
+
+       input.setAttribute("checked", "checked");
+       div.appendChild( input );
+       fragment = document.createDocumentFragment();
+       fragment.appendChild( div.lastChild );
+
+       // WebKit doesn't clone checked state correctly in fragments
+       support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
+
+       // Check if a disconnected checkbox will retain its checked
+       // value of true after appended to the DOM (IE6/7)
+       support.appendChecked = input.checked;
+
+       fragment.removeChild( input );
+       fragment.appendChild( div );
+
+       div.innerHTML = "";
+
+       // Check if div with explicit width and no margin-right incorrectly
+       // gets computed margin-right based on width of container. For more
+       // info see bug #3333
+       // Fails in WebKit before Feb 2011 nightlies
+       // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+       if ( window.getComputedStyle ) {
+               marginDiv = document.createElement( "div" );
+               marginDiv.style.width = "0";
+               marginDiv.style.marginRight = "0";
+               div.style.width = "2px";
+               div.appendChild( marginDiv );
+               support.reliableMarginRight =
+                       ( parseInt( ( window.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0;
+       }
+
+       // Technique from Juriy Zaytsev
+       // http://perfectionkills.com/detecting-event-support-without-browser-sniffing/
+       // We only care about the case where non-standard event systems
+       // are used, namely in IE. Short-circuiting here helps us to
+       // avoid an eval call (in setAttribute) which can cause CSP
+       // to go haywire. See: https://developer.mozilla.org/en/Security/CSP
+       if ( div.attachEvent ) {
+               for( i in {
+                       submit: 1,
+                       change: 1,
+                       focusin: 1
+               }) {
+                       eventName = "on" + i;
+                       isSupported = ( eventName in div );
+                       if ( !isSupported ) {
+                               div.setAttribute( eventName, "return;" );
+                               isSupported = ( typeof div[ eventName ] === "function" );
+                       }
+                       support[ i + "Bubbles" ] = isSupported;
+               }
+       }
+
+       fragment.removeChild( div );
+
+       // Null elements to avoid leaks in IE
+       fragment = select = opt = marginDiv = div = input = null;
+
+       // Run tests that need a body at doc ready
+       jQuery(function() {
+               var container, outer, inner, table, td, offsetSupport,
+                       conMarginTop, ptlm, vb, style, html,
+                       body = document.getElementsByTagName("body")[0];
+
+               if ( !body ) {
+                       // Return for frameset docs that don't have a body
+                       return;
+               }
+
+               conMarginTop = 1;
+               ptlm = "position:absolute;top:0;left:0;width:1px;height:1px;margin:0;";
+               vb = "visibility:hidden;border:0;";
+               style = "style='" + ptlm + "border:5px solid #000;padding:0;'";
+               html = "<div " + style + "><div></div></div>" +
+                       "<table " + style + " cellpadding='0' cellspacing='0'>" +
+                       "<tr><td></td></tr></table>";
+
+               container = document.createElement("div");
+               container.style.cssText = vb + "width:0;height:0;position:static;top:0;margin-top:" + conMarginTop + "px";
+               body.insertBefore( container, body.firstChild );
+
+               // Construct the test element
+               div = document.createElement("div");
+               container.appendChild( div );
+
+               // Check if table cells still have offsetWidth/Height when they are set
+               // to display:none and there are still other visible table cells in a
+               // table row; if so, offsetWidth/Height are not reliable for use when
+               // determining if an element has been hidden directly using
+               // display:none (it is still safe to use offsets if a parent element is
+               // hidden; don safety goggles and see bug #4512 for more information).
+               // (only IE 8 fails this test)
+               div.innerHTML = "<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>";
+               tds = div.getElementsByTagName( "td" );
+               isSupported = ( tds[ 0 ].offsetHeight === 0 );
+
+               tds[ 0 ].style.display = "";
+               tds[ 1 ].style.display = "none";
+
+               // Check if empty table cells still have offsetWidth/Height
+               // (IE <= 8 fail this test)
+               support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );
+
+               // Figure out if the W3C box model works as expected
+               div.innerHTML = "";
+               div.style.width = div.style.paddingLeft = "1px";
+               jQuery.boxModel = support.boxModel = div.offsetWidth === 2;
+
+               if ( typeof div.style.zoom !== "undefined" ) {
+                       // Check if natively block-level elements act like inline-block
+                       // elements when setting their display to 'inline' and giving
+                       // them layout
+                       // (IE < 8 does this)
+                       div.style.display = "inline";
+                       div.style.zoom = 1;
+                       support.inlineBlockNeedsLayout = ( div.offsetWidth === 2 );
+
+                       // Check if elements with layout shrink-wrap their children
+                       // (IE 6 does this)
+                       div.style.display = "";
+                       div.innerHTML = "<div style='width:4px;'></div>";
+                       support.shrinkWrapBlocks = ( div.offsetWidth !== 2 );
+               }
+
+               div.style.cssText = ptlm + vb;
+               div.innerHTML = html;
+
+               outer = div.firstChild;
+               inner = outer.firstChild;
+               td = outer.nextSibling.firstChild.firstChild;
+
+               offsetSupport = {
+                       doesNotAddBorder: ( inner.offsetTop !== 5 ),
+                       doesAddBorderForTableAndCells: ( td.offsetTop === 5 )
+               };
+
+               inner.style.position = "fixed";
+               inner.style.top = "20px";
+
+               // safari subtracts parent border width here which is 5px
+               offsetSupport.fixedPosition = ( inner.offsetTop === 20 || inner.offsetTop === 15 );
+               inner.style.position = inner.style.top = "";
+
+               outer.style.overflow = "hidden";
+               outer.style.position = "relative";
+
+               offsetSupport.subtractsBorderForOverflowNotVisible = ( inner.offsetTop === -5 );
+               offsetSupport.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== conMarginTop );
+
+               body.removeChild( container );
+               div  = container = null;
+
+               jQuery.extend( support, offsetSupport );
+       });
+
+       return support;
+})();
+
+
+
+
+var rbrace = /^(?:\{.*\}|\[.*\])$/,
+       rmultiDash = /([A-Z])/g;
+
+jQuery.extend({
+       cache: {},
+
+       // Please use with caution
+       uuid: 0,
+
+       // Unique for each copy of jQuery on the page
+       // Non-digits removed to match rinlinejQuery
+       expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ),
+
+       // The following elements throw uncatchable exceptions if you
+       // attempt to add expando properties to them.
+       noData: {
+               "embed": true,
+               // Ban all objects except for Flash (which handle expandos)
+               "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",
+               "applet": true
+       },
+
+       hasData: function( elem ) {
+               elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
+               return !!elem && !isEmptyDataObject( elem );
+       },
+
+       data: function( elem, name, data, pvt /* Internal Use Only */ ) {
+               if ( !jQuery.acceptData( elem ) ) {
+                       return;
+               }
+
+               var privateCache, thisCache, ret,
+                       internalKey = jQuery.expando,
+                       getByName = typeof name === "string",
+
+                       // We have to handle DOM nodes and JS objects differently because IE6-7
+                       // can't GC object references properly across the DOM-JS boundary
+                       isNode = elem.nodeType,
+
+                       // Only DOM nodes need the global jQuery cache; JS object data is
+                       // attached directly to the object so GC can occur automatically
+                       cache = isNode ? jQuery.cache : elem,
+
+                       // Only defining an ID for JS objects if its cache already exists allows
+                       // the code to shortcut on the same path as a DOM node with no cache
+                       id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey,
+                       isEvents = name === "events";
+
+               // Avoid doing any more work than we need to when trying to get data on an
+               // object that has no data at all
+               if ( (!id || !cache[id] || (!isEvents && !pvt && !cache[id].data)) && getByName && data === undefined ) {
+                       return;
+               }
+
+               if ( !id ) {
+                       // Only DOM nodes need a new unique ID for each element since their data
+                       // ends up in the global cache
+                       if ( isNode ) {
+                               elem[ internalKey ] = id = ++jQuery.uuid;
+                       } else {
+                               id = internalKey;
+                       }
+               }
+
+               if ( !cache[ id ] ) {
+                       cache[ id ] = {};
+
+                       // Avoids exposing jQuery metadata on plain JS objects when the object
+                       // is serialized using JSON.stringify
+                       if ( !isNode ) {
+                               cache[ id ].toJSON = jQuery.noop;
+                       }
+               }
+
+               // An object can be passed to jQuery.data instead of a key/value pair; this gets
+               // shallow copied over onto the existing cache
+               if ( typeof name === "object" || typeof name === "function" ) {
+                       if ( pvt ) {
+                               cache[ id ] = jQuery.extend( cache[ id ], name );
+                       } else {
+                               cache[ id ].data = jQuery.extend( cache[ id ].data, name );
+                       }
+               }
+
+               privateCache = thisCache = cache[ id ];
+
+               // jQuery data() is stored in a separate object inside the object's internal data
+               // cache in order to avoid key collisions between internal data and user-defined
+               // data.
+               if ( !pvt ) {
+                       if ( !thisCache.data ) {
+                               thisCache.data = {};
+                       }
+
+                       thisCache = thisCache.data;
+               }
+
+               if ( data !== undefined ) {
+                       thisCache[ jQuery.camelCase( name ) ] = data;
+               }
+
+               // Users should not attempt to inspect the internal events object using jQuery.data,
+               // it is undocumented and subject to change. But does anyone listen? No.
+               if ( isEvents && !thisCache[ name ] ) {
+                       return privateCache.events;
+               }
+
+               // Check for both converted-to-camel and non-converted data property names
+               // If a data property was specified
+               if ( getByName ) {
+
+                       // First Try to find as-is property data
+                       ret = thisCache[ name ];
+
+                       // Test for null|undefined property data
+                       if ( ret == null ) {
+
+                               // Try to find the camelCased property
+                               ret = thisCache[ jQuery.camelCase( name ) ];
+                       }
+               } else {
+                       ret = thisCache;
+               }
+
+               return ret;
+       },
+
+       removeData: function( elem, name, pvt /* Internal Use Only */ ) {
+               if ( !jQuery.acceptData( elem ) ) {
+                       return;
+               }
+
+               var thisCache, i, l,
+
+                       // Reference to internal data cache key
+                       internalKey = jQuery.expando,
+
+                       isNode = elem.nodeType,
+
+                       // See jQuery.data for more information
+                       cache = isNode ? jQuery.cache : elem,
+
+                       // See jQuery.data for more information
+                       id = isNode ? elem[ internalKey ] : internalKey;
+
+               // If there is already no cache entry for this object, there is no
+               // purpose in continuing
+               if ( !cache[ id ] ) {
+                       return;
+               }
+
+               if ( name ) {
+
+                       thisCache = pvt ? cache[ id ] : cache[ id ].data;
+
+                       if ( thisCache ) {
+
+                               // Support array or space separated string names for data keys
+                               if ( !jQuery.isArray( name ) ) {
+
+                                       // try the string as a key before any manipulation
+                                       if ( name in thisCache ) {
+                                               name = [ name ];
+                                       } else {
+
+                                               // split the camel cased version by spaces unless a key with the spaces exists
+                                               name = jQuery.camelCase( name );
+                                               if ( name in thisCache ) {
+                                                       name = [ name ];
+                                               } else {
+                                                       name = name.split( " " );
+                                               }
+                                       }
+                               }
+
+                               for ( i = 0, l = name.length; i < l; i++ ) {
+                                       delete thisCache[ name[i] ];
+                               }
+
+                               // If there is no data left in the cache, we want to continue
+                               // and let the cache object itself get destroyed
+                               if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) {
+                                       return;
+                               }
+                       }
+               }
+
+               // See jQuery.data for more information
+               if ( !pvt ) {
+                       delete cache[ id ].data;
+
+                       // Don't destroy the parent cache unless the internal data object
+                       // had been the only thing left in it
+                       if ( !isEmptyDataObject(cache[ id ]) ) {
+                               return;
+                       }
+               }
+
+               // Browsers that fail expando deletion also refuse to delete expandos on
+               // the window, but it will allow it on all other JS objects; other browsers
+               // don't care
+               // Ensure that `cache` is not a window object #10080
+               if ( jQuery.support.deleteExpando || !cache.setInterval ) {
+                       delete cache[ id ];
+               } else {
+                       cache[ id ] = null;
+               }
+
+               // We destroyed the cache and need to eliminate the expando on the node to avoid
+               // false lookups in the cache for entries that no longer exist
+               if ( isNode ) {
+                       // IE does not allow us to delete expando properties from nodes,
+                       // nor does it have a removeAttribute function on Document nodes;
+                       // we must handle all of these cases
+                       if ( jQuery.support.deleteExpando ) {
+                               delete elem[ internalKey ];
+                       } else if ( elem.removeAttribute ) {
+                               elem.removeAttribute( internalKey );
+                       } else {
+                               elem[ internalKey ] = null;
+                       }
+               }
+       },
+
+       // For internal use only.
+       _data: function( elem, name, data ) {
+               return jQuery.data( elem, name, data, true );
+       },
+
+       // A method for determining if a DOM node can handle the data expando
+       acceptData: function( elem ) {
+               if ( elem.nodeName ) {
+                       var match = jQuery.noData[ elem.nodeName.toLowerCase() ];
+
+                       if ( match ) {
+                               return !(match === true || elem.getAttribute("classid") !== match);
+                       }
+               }
+
+               return true;
+       }
+});
+
+jQuery.fn.extend({
+       data: function( key, value ) {
+               var parts, attr, name,
+                       data = null;
+
+               if ( typeof key === "undefined" ) {
+                       if ( this.length ) {
+                               data = jQuery.data( this[0] );
+
+                               if ( this[0].nodeType === 1 && !jQuery._data( this[0], "parsedAttrs" ) ) {
+                                       attr = this[0].attributes;
+                                       for ( var i = 0, l = attr.length; i < l; i++ ) {
+                                               name = attr[i].name;
+
+                                               if ( name.indexOf( "data-" ) === 0 ) {
+                                                       name = jQuery.camelCase( name.substring(5) );
+
+                                                       dataAttr( this[0], name, data[ name ] );
+                                               }
+                                       }
+                                       jQuery._data( this[0], "parsedAttrs", true );
+                               }
+                       }
+
+                       return data;
+
+               } else if ( typeof key === "object" ) {
+                       return this.each(function() {
+                               jQuery.data( this, key );
+                       });
+               }
+
+               parts = key.split(".");
+               parts[1] = parts[1] ? "." + parts[1] : "";
+
+               if ( value === undefined ) {
+                       data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]);
+
+                       // Try to fetch any internally stored data first
+                       if ( data === undefined && this.length ) {
+                               data = jQuery.data( this[0], key );
+                               data = dataAttr( this[0], key, data );
+                       }
+
+                       return data === undefined && parts[1] ?
+                               this.data( parts[0] ) :
+                               data;
+
+               } else {
+                       return this.each(function() {
+                               var self = jQuery( this ),
+                                       args = [ parts[0], value ];
+
+                               self.triggerHandler( "setData" + parts[1] + "!", args );
+                               jQuery.data( this, key, value );
+                               self.triggerHandler( "changeData" + parts[1] + "!", args );
+                       });
+               }
+       },
+
+       removeData: function( key ) {
+               return this.each(function() {
+                       jQuery.removeData( this, key );
+               });
+       }
+});
+
+function dataAttr( elem, key, data ) {
+       // If nothing was found internally, try to fetch any
+       // data from the HTML5 data-* attribute
+       if ( data === undefined && elem.nodeType === 1 ) {
+
+               var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
+
+               data = elem.getAttribute( name );
+
+               if ( typeof data === "string" ) {
+                       try {
+                               data = data === "true" ? true :
+                               data === "false" ? false :
+                               data === "null" ? null :
+                               jQuery.isNumeric( data ) ? parseFloat( data ) :
+                                       rbrace.test( data ) ? jQuery.parseJSON( data ) :
+                                       data;
+                       } catch( e ) {}
+
+                       // Make sure we set the data so it isn't changed later
+                       jQuery.data( elem, key, data );
+
+               } else {
+                       data = undefined;
+               }
+       }
+
+       return data;
+}
+
+// checks a cache object for emptiness
+function isEmptyDataObject( obj ) {
+       for ( var name in obj ) {
+
+               // if the public data object is empty, the private is still empty
+               if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) {
+                       continue;
+               }
+               if ( name !== "toJSON" ) {
+                       return false;
+               }
+       }
+
+       return true;
+}
+
+
+
+
+function handleQueueMarkDefer( elem, type, src ) {
+       var deferDataKey = type + "defer",
+               queueDataKey = type + "queue",
+               markDataKey = type + "mark",
+               defer = jQuery._data( elem, deferDataKey );
+       if ( defer &&
+               ( src === "queue" || !jQuery._data(elem, queueDataKey) ) &&
+               ( src === "mark" || !jQuery._data(elem, markDataKey) ) ) {
+               // Give room for hard-coded callbacks to fire first
+               // and eventually mark/queue something else on the element
+               setTimeout( function() {
+                       if ( !jQuery._data( elem, queueDataKey ) &&
+                               !jQuery._data( elem, markDataKey ) ) {
+                               jQuery.removeData( elem, deferDataKey, true );
+                               defer.fire();
+                       }
+               }, 0 );
+       }
+}
+
+jQuery.extend({
+
+       _mark: function( elem, type ) {
+               if ( elem ) {
+                       type = ( type || "fx" ) + "mark";
+                       jQuery._data( elem, type, (jQuery._data( elem, type ) || 0) + 1 );
+               }
+       },
+
+       _unmark: function( force, elem, type ) {
+               if ( force !== true ) {
+                       type = elem;
+                       elem = force;
+                       force = false;
+               }
+               if ( elem ) {
+                       type = type || "fx";
+                       var key = type + "mark",
+                               count = force ? 0 : ( (jQuery._data( elem, key ) || 1) - 1 );
+                       if ( count ) {
+                               jQuery._data( elem, key, count );
+                       } else {
+                               jQuery.removeData( elem, key, true );
+                               handleQueueMarkDefer( elem, type, "mark" );
+                       }
+               }
+       },
+
+       queue: function( elem, type, data ) {
+               var q;
+               if ( elem ) {
+                       type = ( type || "fx" ) + "queue";
+                       q = jQuery._data( elem, type );
+
+                       // Speed up dequeue by getting out quickly if this is just a lookup
+                       if ( data ) {
+                               if ( !q || jQuery.isArray(data) ) {
+                                       q = jQuery._data( elem, type, jQuery.makeArray(data) );
+                               } else {
+                                       q.push( data );
+                               }
+                       }
+                       return q || [];
+               }
+       },
+
+       dequeue: function( elem, type ) {
+               type = type || "fx";
+
+               var queue = jQuery.queue( elem, type ),
+                       fn = queue.shift(),
+                       hooks = {};
+
+               // If the fx queue is dequeued, always remove the progress sentinel
+               if ( fn === "inprogress" ) {
+                       fn = queue.shift();
+               }
+
+               if ( fn ) {
+                       // Add a progress sentinel to prevent the fx queue from being
+                       // automatically dequeued
+                       if ( type === "fx" ) {
+                               queue.unshift( "inprogress" );
+                       }
+
+                       jQuery._data( elem, type + ".run", hooks );
+                       fn.call( elem, function() {
+                               jQuery.dequeue( elem, type );
+                       }, hooks );
+               }
+
+               if ( !queue.length ) {
+                       jQuery.removeData( elem, type + "queue " + type + ".run", true );
+                       handleQueueMarkDefer( elem, type, "queue" );
+               }
+       }
+});
+
+jQuery.fn.extend({
+       queue: function( type, data ) {
+               if ( typeof type !== "string" ) {
+                       data = type;
+                       type = "fx";
+               }
+
+               if ( data === undefined ) {
+                       return jQuery.queue( this[0], type );
+               }
+               return this.each(function() {
+                       var queue = jQuery.queue( this, type, data );
+
+                       if ( type === "fx" && queue[0] !== "inprogress" ) {
+                               jQuery.dequeue( this, type );
+                       }
+               });
+       },
+       dequeue: function( type ) {
+               return this.each(function() {
+                       jQuery.dequeue( this, type );
+               });
+       },
+       // Based off of the plugin by Clint Helfers, with permission.
+       // http://blindsignals.com/index.php/2009/07/jquery-delay/
+       delay: function( time, type ) {
+               time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
+               type = type || "fx";
+
+               return this.queue( type, function( next, hooks ) {
+                       var timeout = setTimeout( next, time );
+                       hooks.stop = function() {
+                               clearTimeout( timeout );
+                       };
+               });
+       },
+       clearQueue: function( type ) {
+               return this.queue( type || "fx", [] );
+       },
+       // Get a promise resolved when queues of a certain type
+       // are emptied (fx is the type by default)
+       promise: function( type, object ) {
+               if ( typeof type !== "string" ) {
+                       object = type;
+                       type = undefined;
+               }
+               type = type || "fx";
+               var defer = jQuery.Deferred(),
+                       elements = this,
+                       i = elements.length,
+                       count = 1,
+                       deferDataKey = type + "defer",
+                       queueDataKey = type + "queue",
+                       markDataKey = type + "mark",
+                       tmp;
+               function resolve() {
+                       if ( !( --count ) ) {
+                               defer.resolveWith( elements, [ elements ] );
+                       }
+               }
+               while( i-- ) {
+                       if (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) ||
+                                       ( jQuery.data( elements[ i ], queueDataKey, undefined, true ) ||
+                                               jQuery.data( elements[ i ], markDataKey, undefined, true ) ) &&
+                                       jQuery.data( elements[ i ], deferDataKey, jQuery.Callbacks( "once memory" ), true ) )) {
+                               count++;
+                               tmp.add( resolve );
+                       }
+               }
+               resolve();
+               return defer.promise();
+       }
+});
+
+
+
+
+var rclass = /[\n\t\r]/g,
+       rspace = /\s+/,
+       rreturn = /\r/g,
+       rtype = /^(?:button|input)$/i,
+       rfocusable = /^(?:button|input|object|select|textarea)$/i,
+       rclickable = /^a(?:rea)?$/i,
+       rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,
+       getSetAttribute = jQuery.support.getSetAttribute,
+       nodeHook, boolHook, fixSpecified;
+
+jQuery.fn.extend({
+       attr: function( name, value ) {
+               return jQuery.access( this, name, value, true, jQuery.attr );
+       },
+
+       removeAttr: function( name ) {
+               return this.each(function() {
+                       jQuery.removeAttr( this, name );
+               });
+       },
+
+       prop: function( name, value ) {
+               return jQuery.access( this, name, value, true, jQuery.prop );
+       },
+
+       removeProp: function( name ) {
+               name = jQuery.propFix[ name ] || name;
+               return this.each(function() {
+                       // try/catch handles cases where IE balks (such as removing a property on window)
+                       try {
+                               this[ name ] = undefined;
+                               delete this[ name ];
+                       } catch( e ) {}
+               });
+       },
+
+       addClass: function( value ) {
+               var classNames, i, l, elem,
+                       setClass, c, cl;
+
+               if ( jQuery.isFunction( value ) ) {
+                       return this.each(function( j ) {
+                               jQuery( this ).addClass( value.call(this, j, this.className) );
+                       });
+               }
+
+               if ( value && typeof value === "string" ) {
+                       classNames = value.split( rspace );
+
+                       for ( i = 0, l = this.length; i < l; i++ ) {
+                               elem = this[ i ];
+
+                               if ( elem.nodeType === 1 ) {
+                                       if ( !elem.className && classNames.length === 1 ) {
+                                               elem.className = value;
+
+                                       } else {
+                                               setClass = " " + elem.className + " ";
+
+                                               for ( c = 0, cl = classNames.length; c < cl; c++ ) {
+                                                       if ( !~setClass.indexOf( " " + classNames[ c ] + " " ) ) {
+                                                               setClass += classNames[ c ] + " ";
+                                                       }
+                                               }
+                                               elem.className = jQuery.trim( setClass );
+                                       }
+                               }
+                       }
+               }
+
+               return this;
+       },
+
+       removeClass: function( value ) {
+               var classNames, i, l, elem, className, c, cl;
+
+               if ( jQuery.isFunction( value ) ) {
+                       return this.each(function( j ) {
+                               jQuery( this ).removeClass( value.call(this, j, this.className) );
+                       });
+               }
+
+               if ( (value && typeof value === "string") || value === undefined ) {
+                       classNames = ( value || "" ).split( rspace );
+
+                       for ( i = 0, l = this.length; i < l; i++ ) {
+                               elem = this[ i ];
+
+                               if ( elem.nodeType === 1 && elem.className ) {
+                                       if ( value ) {
+                                               className = (" " + elem.className + " ").replace( rclass, " " );
+                                               for ( c = 0, cl = classNames.length; c < cl; c++ ) {
+                                                       className = className.replace(" " + classNames[ c ] + " ", " ");
+                                               }
+                                               elem.className = jQuery.trim( className );
+
+                                       } else {
+                                               elem.className = "";
+                                       }
+                               }
+                       }
+               }
+
+               return this;
+       },
+
+       toggleClass: function( value, stateVal ) {
+               var type = typeof value,
+                       isBool = typeof stateVal === "boolean";
+
+               if ( jQuery.isFunction( value ) ) {
+                       return this.each(function( i ) {
+                               jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
+                       });
+               }
+
+               return this.each(function() {
+                       if ( type === "string" ) {
+                               // toggle individual class names
+                               var className,
+                                       i = 0,
+                                       self = jQuery( this ),
+                                       state = stateVal,
+                                       classNames = value.split( rspace );
+
+                               while ( (className = classNames[ i++ ]) ) {
+                                       // check each className given, space seperated list
+                                       state = isBool ? state : !self.hasClass( className );
+                                       self[ state ? "addClass" : "removeClass" ]( className );
+                               }
+
+                       } else if ( type === "undefined" || type === "boolean" ) {
+                               if ( this.className ) {
+                                       // store className if set
+                                       jQuery._data( this, "__className__", this.className );
+                               }
+
+                               // toggle whole className
+                               this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
+                       }
+               });
+       },
+
+       hasClass: function( selector ) {
+               var className = " " + selector + " ",
+                       i = 0,
+                       l = this.length;
+               for ( ; i < l; i++ ) {
+                       if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) {
+                               return true;
+                       }
+               }
+
+               return false;
+       },
+
+       val: function( value ) {
+               var hooks, ret, isFunction,
+                       elem = this[0];
+
+               if ( !arguments.length ) {
+                       if ( elem ) {
+                               hooks = jQuery.valHooks[ elem.nodeName.toLowerCase() ] || jQuery.valHooks[ elem.type ];
+
+                               if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
+                                       return ret;
+                               }
+
+                               ret = elem.value;
+
+                               return typeof ret === "string" ?
+                                       // handle most common string cases
+                                       ret.replace(rreturn, "") :
+                                       // handle cases where value is null/undef or number
+                                       ret == null ? "" : ret;
+                       }
+
+                       return;
+               }
+
+               isFunction = jQuery.isFunction( value );
+
+               return this.each(function( i ) {
+                       var self = jQuery(this), val;
+
+                       if ( this.nodeType !== 1 ) {
+                               return;
+                       }
+
+                       if ( isFunction ) {
+                               val = value.call( this, i, self.val() );
+                       } else {
+                               val = value;
+                       }
+
+                       // Treat null/undefined as ""; convert numbers to string
+                       if ( val == null ) {
+                               val = "";
+                       } else if ( typeof val === "number" ) {
+                               val += "";
+                       } else if ( jQuery.isArray( val ) ) {
+                               val = jQuery.map(val, function ( value ) {
+                                       return value == null ? "" : value + "";
+                               });
+                       }
+
+                       hooks = jQuery.valHooks[ this.nodeName.toLowerCase() ] || jQuery.valHooks[ this.type ];
+
+                       // If set returns undefined, fall back to normal setting
+                       if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
+                               this.value = val;
+                       }
+               });
+       }
+});
+
+jQuery.extend({
+       valHooks: {
+               option: {
+                       get: function( elem ) {
+                               // attributes.value is undefined in Blackberry 4.7 but
+                               // uses .value. See #6932
+                               var val = elem.attributes.value;
+                               return !val || val.specified ? elem.value : elem.text;
+                       }
+               },
+               select: {
+                       get: function( elem ) {
+                               var value, i, max, option,
+                                       index = elem.selectedIndex,
+                                       values = [],
+                                       options = elem.options,
+                                       one = elem.type === "select-one";
+
+                               // Nothing was selected
+                               if ( index < 0 ) {
+                                       return null;
+                               }
+
+                               // Loop through all the selected options
+                               i = one ? index : 0;
+                               max = one ? index + 1 : options.length;
+                               for ( ; i < max; i++ ) {
+                                       option = options[ i ];
+
+                                       // Don't return options that are disabled or in a disabled optgroup
+                                       if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) &&
+                                                       (!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) {
+
+                                               // Get the specific value for the option
+                                               value = jQuery( option ).val();
+
+                                               // We don't need an array for one selects
+                                               if ( one ) {
+                                                       return value;
+                                               }
+
+                                               // Multi-Selects return an array
+                                               values.push( value );
+                                       }
+                               }
+
+                               // Fixes Bug #2551 -- select.val() broken in IE after form.reset()
+                               if ( one && !values.length && options.length ) {
+                                       return jQuery( options[ index ] ).val();
+                               }
+
+                               return values;
+                       },
+
+                       set: function( elem, value ) {
+                               var values = jQuery.makeArray( value );
+
+                               jQuery(elem).find("option").each(function() {
+                                       this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
+                               });
+
+                               if ( !values.length ) {
+                                       elem.selectedIndex = -1;
+                               }
+                               return values;
+                       }
+               }
+       },
+
+       attrFn: {
+               val: true,
+               css: true,
+               html: true,
+               text: true,
+               data: true,
+               width: true,
+               height: true,
+               offset: true
+       },
+
+       attr: function( elem, name, value, pass ) {
+               var ret, hooks, notxml,
+                       nType = elem.nodeType;
+
+               // don't get/set attributes on text, comment and attribute nodes
+               if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+                       return;
+               }
+
+               if ( pass && name in jQuery.attrFn ) {
+                       return jQuery( elem )[ name ]( value );
+               }
+
+               // Fallback to prop when attributes are not supported
+               if ( typeof elem.getAttribute === "undefined" ) {
+                       return jQuery.prop( elem, name, value );
+               }
+
+               notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
+
+               // All attributes are lowercase
+               // Grab necessary hook if one is defined
+               if ( notxml ) {
+                       name = name.toLowerCase();
+                       hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook );
+               }
+
+               if ( value !== undefined ) {
+
+                       if ( value === null ) {
+                               jQuery.removeAttr( elem, name );
+                               return;
+
+                       } else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) {
+                               return ret;
+
+                       } else {
+                               elem.setAttribute( name, "" + value );
+                               return value;
+                       }
+
+               } else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) {
+                       return ret;
+
+               } else {
+
+                       ret = elem.getAttribute( name );
+
+                       // Non-existent attributes return null, we normalize to undefined
+                       return ret === null ?
+                               undefined :
+                               ret;
+               }
+       },
+
+       removeAttr: function( elem, value ) {
+               var propName, attrNames, name, l,
+                       i = 0;
+
+               if ( value && elem.nodeType === 1 ) {
+                       attrNames = value.toLowerCase().split( rspace );
+                       l = attrNames.length;
+
+                       for ( ; i < l; i++ ) {
+                               name = attrNames[ i ];
+
+                               if ( name ) {
+                                       propName = jQuery.propFix[ name ] || name;
+
+                                       // See #9699 for explanation of this approach (setting first, then removal)
+                                       jQuery.attr( elem, name, "" );
+                                       elem.removeAttribute( getSetAttribute ? name : propName );
+
+                                       // Set corresponding property to false for boolean attributes
+                                       if ( rboolean.test( name ) && propName in elem ) {
+                                               elem[ propName ] = false;
+                                       }
+                               }
+                       }
+               }
+       },
+
+       attrHooks: {
+               type: {
+                       set: function( elem, value ) {
+                               // We can't allow the type property to be changed (since it causes problems in IE)
+                               if ( rtype.test( elem.nodeName ) && elem.parentNode ) {
+                                       jQuery.error( "type property can't be changed" );
+                               } else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) {
+                                       // Setting the type on a radio button after the value resets the value in IE6-9
+                                       // Reset value to it's default in case type is set after value
+                                       // This is for element creation
+                                       var val = elem.value;
+                                       elem.setAttribute( "type", value );
+                                       if ( val ) {
+                                               elem.value = val;
+                                       }
+                                       return value;
+                               }
+                       }
+               },
+               // Use the value property for back compat
+               // Use the nodeHook for button elements in IE6/7 (#1954)
+               value: {
+                       get: function( elem, name ) {
+                               if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
+                                       return nodeHook.get( elem, name );
+                               }
+                               return name in elem ?
+                                       elem.value :
+                                       null;
+                       },
+                       set: function( elem, value, name ) {
+                               if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
+                                       return nodeHook.set( elem, value, name );
+                               }
+                               // Does not return so that setAttribute is also used
+                               elem.value = value;
+                       }
+               }
+       },
+
+       propFix: {
+               tabindex: "tabIndex",
+               readonly: "readOnly",
+               "for": "htmlFor",
+               "class": "className",
+               maxlength: "maxLength",
+               cellspacing: "cellSpacing",
+               cellpadding: "cellPadding",
+               rowspan: "rowSpan",
+               colspan: "colSpan",
+               usemap: "useMap",
+               frameborder: "frameBorder",
+               contenteditable: "contentEditable"
+       },
+
+       prop: function( elem, name, value ) {
+               var ret, hooks, notxml,
+                       nType = elem.nodeType;
+
+               // don't get/set properties on text, comment and attribute nodes
+               if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+                       return;
+               }
+
+               notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
+
+               if ( notxml ) {
+                       // Fix name and attach hooks
+                       name = jQuery.propFix[ name ] || name;
+                       hooks = jQuery.propHooks[ name ];
+               }
+
+               if ( value !== undefined ) {
+                       if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
+                               return ret;
+
+                       } else {
+                               return ( elem[ name ] = value );
+                       }
+
+               } else {
+                       if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
+                               return ret;
+
+                       } else {
+                               return elem[ name ];
+                       }
+               }
+       },
+
+       propHooks: {
+               tabIndex: {
+                       get: function( elem ) {
+                               // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
+                               // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
+                               var attributeNode = elem.getAttributeNode("tabindex");
+
+                               return attributeNode && attributeNode.specified ?
+                                       parseInt( attributeNode.value, 10 ) :
+                                       rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
+                                               0 :
+                                               undefined;
+                       }
+               }
+       }
+});
+
+// Add the tabIndex propHook to attrHooks for back-compat (different case is intentional)
+jQuery.attrHooks.tabindex = jQuery.propHooks.tabIndex;
+
+// Hook for boolean attributes
+boolHook = {
+       get: function( elem, name ) {
+               // Align boolean attributes with corresponding properties
+               // Fall back to attribute presence where some booleans are not supported
+               var attrNode,
+                       property = jQuery.prop( elem, name );
+               return property === true || typeof property !== "boolean" && ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ?
+                       name.toLowerCase() :
+                       undefined;
+       },
+       set: function( elem, value, name ) {
+               var propName;
+               if ( value === false ) {
+                       // Remove boolean attributes when set to false
+                       jQuery.removeAttr( elem, name );
+               } else {
+                       // value is true since we know at this point it's type boolean and not false
+                       // Set boolean attributes to the same name and set the DOM property
+                       propName = jQuery.propFix[ name ] || name;
+                       if ( propName in elem ) {
+                               // Only set the IDL specifically if it already exists on the element
+                               elem[ propName ] = true;
+                       }
+
+                       elem.setAttribute( name, name.toLowerCase() );
+               }
+               return name;
+       }
+};
+
+// IE6/7 do not support getting/setting some attributes with get/setAttribute
+if ( !getSetAttribute ) {
+
+       fixSpecified = {
+               name: true,
+               id: true
+       };
+
+       // Use this for any attribute in IE6/7
+       // This fixes almost every IE6/7 issue
+       nodeHook = jQuery.valHooks.button = {
+               get: function( elem, name ) {
+                       var ret;
+                       ret = elem.getAttributeNode( name );
+                       return ret && ( fixSpecified[ name ] ? ret.nodeValue !== "" : ret.specified ) ?
+                               ret.nodeValue :
+                               undefined;
+               },
+               set: function( elem, value, name ) {
+                       // Set the existing or create a new attribute node
+                       var ret = elem.getAttributeNode( name );
+                       if ( !ret ) {
+                               ret = document.createAttribute( name );
+                               elem.setAttributeNode( ret );
+                       }
+                       return ( ret.nodeValue = value + "" );
+               }
+       };
+
+       // Apply the nodeHook to tabindex
+       jQuery.attrHooks.tabindex.set = nodeHook.set;
+
+       // Set width and height to auto instead of 0 on empty string( Bug #8150 )
+       // This is for removals
+       jQuery.each([ "width", "height" ], function( i, name ) {
+               jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
+                       set: function( elem, value ) {
+                               if ( value === "" ) {
+                                       elem.setAttribute( name, "auto" );
+                                       return value;
+                               }
+                       }
+               });
+       });
+
+       // Set contenteditable to false on removals(#10429)
+       // Setting to empty string throws an error as an invalid value
+       jQuery.attrHooks.contenteditable = {
+               get: nodeHook.get,
+               set: function( elem, value, name ) {
+                       if ( value === "" ) {
+                               value = "false";
+                       }
+                       nodeHook.set( elem, value, name );
+               }
+       };
+}
+
+
+// Some attributes require a special call on IE
+if ( !jQuery.support.hrefNormalized ) {
+       jQuery.each([ "href", "src", "width", "height" ], function( i, name ) {
+               jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
+                       get: function( elem ) {
+                               var ret = elem.getAttribute( name, 2 );
+                               return ret === null ? undefined : ret;
+                       }
+               });
+       });
+}
+
+if ( !jQuery.support.style ) {
+       jQuery.attrHooks.style = {
+               get: function( elem ) {
+                       // Return undefined in the case of empty string
+                       // Normalize to lowercase since IE uppercases css property names
+                       return elem.style.cssText.toLowerCase() || undefined;
+               },
+               set: function( elem, value ) {
+                       return ( elem.style.cssText = "" + value );
+               }
+       };
+}
+
+// Safari mis-reports the default selected property of an option
+// Accessing the parent's selectedIndex property fixes it
+if ( !jQuery.support.optSelected ) {
+       jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, {
+               get: function( elem ) {
+                       var parent = elem.parentNode;
+
+                       if ( parent ) {
+                               parent.selectedIndex;
+
+                               // Make sure that it also works with optgroups, see #5701
+                               if ( parent.parentNode ) {
+                                       parent.parentNode.selectedIndex;
+                               }
+                       }
+                       return null;
+               }
+       });
+}
+
+// IE6/7 call enctype encoding
+if ( !jQuery.support.enctype ) {
+       jQuery.propFix.enctype = "encoding";
+}
+
+// Radios and checkboxes getter/setter
+if ( !jQuery.support.checkOn ) {
+       jQuery.each([ "radio", "checkbox" ], function() {
+               jQuery.valHooks[ this ] = {
+                       get: function( elem ) {
+                               // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
+                               return elem.getAttribute("value") === null ? "on" : elem.value;
+                       }
+               };
+       });
+}
+jQuery.each([ "radio", "checkbox" ], function() {
+       jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], {
+               set: function( elem, value ) {
+                       if ( jQuery.isArray( value ) ) {
+                               return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
+                       }
+               }
+       });
+});
+
+
+
+
+var rformElems = /^(?:textarea|input|select)$/i,
+       rtypenamespace = /^([^\.]*)?(?:\.(.+))?$/,
+       rhoverHack = /\bhover(\.\S+)?\b/,
+       rkeyEvent = /^key/,
+       rmouseEvent = /^(?:mouse|contextmenu)|click/,
+       rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
+       rquickIs = /^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,
+       quickParse = function( selector ) {
+               var quick = rquickIs.exec( selector );
+               if ( quick ) {
+                       //   0  1    2   3
+                       // [ _, tag, id, class ]
+                       quick[1] = ( quick[1] || "" ).toLowerCase();
+                       quick[3] = quick[3] && new RegExp( "(?:^|\\s)" + quick[3] + "(?:\\s|$)" );
+               }
+               return quick;
+       },
+       quickIs = function( elem, m ) {
+               var attrs = elem.attributes || {};
+               return (
+                       (!m[1] || elem.nodeName.toLowerCase() === m[1]) &&
+                       (!m[2] || (attrs.id || {}).value === m[2]) &&
+                       (!m[3] || m[3].test( (attrs[ "class" ] || {}).value ))
+               );
+       },
+       hoverHack = function( events ) {
+               return jQuery.event.special.hover ? events : events.replace( rhoverHack, "mouseenter$1 mouseleave$1" );
+       };
+
+/*
+ * Helper functions for managing events -- not part of the public interface.
+ * Props to Dean Edwards' addEvent library for many of the ideas.
+ */
+jQuery.event = {
+
+       add: function( elem, types, handler, data, selector ) {
+
+               var elemData, eventHandle, events,
+                       t, tns, type, namespaces, handleObj,
+                       handleObjIn, quick, handlers, special;
+
+               // Don't attach events to noData or text/comment nodes (allow plain objects tho)
+               if ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) {
+                       return;
+               }
+
+               // Caller can pass in an object of custom data in lieu of the handler
+               if ( handler.handler ) {
+                       handleObjIn = handler;
+                       handler = handleObjIn.handler;
+               }
+
+               // Make sure that the handler has a unique ID, used to find/remove it later
+               if ( !handler.guid ) {
+                       handler.guid = jQuery.guid++;
+               }
+
+               // Init the element's event structure and main handler, if this is the first
+               events = elemData.events;
+               if ( !events ) {
+                       elemData.events = events = {};
+               }
+               eventHandle = elemData.handle;
+               if ( !eventHandle ) {
+                       elemData.handle = eventHandle = function( e ) {
+                               // Discard the second event of a jQuery.event.trigger() and
+                               // when an event is called after a page has unloaded
+                               return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ?
+                                       jQuery.event.dispatch.apply( eventHandle.elem, arguments ) :
+                                       undefined;
+                       };
+                       // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events
+                       eventHandle.elem = elem;
+               }
+
+               // Handle multiple events separated by a space
+               // jQuery(...).bind("mouseover mouseout", fn);
+               types = jQuery.trim( hoverHack(types) ).split( " " );
+               for ( t = 0; t < types.length; t++ ) {
+
+                       tns = rtypenamespace.exec( types[t] ) || [];
+                       type = tns[1];
+                       namespaces = ( tns[2] || "" ).split( "." ).sort();
+
+                       // If event changes its type, use the special event handlers for the changed type
+                       special = jQuery.event.special[ type ] || {};
+
+                       // If selector defined, determine special event api type, otherwise given type
+                       type = ( selector ? special.delegateType : special.bindType ) || type;
+
+                       // Update special based on newly reset type
+                       special = jQuery.event.special[ type ] || {};
+
+                       // handleObj is passed to all event handlers
+                       handleObj = jQuery.extend({
+                               type: type,
+                               origType: tns[1],
+                               data: data,
+                               handler: handler,
+                               guid: handler.guid,
+                               selector: selector,
+                               quick: quickParse( selector ),
+                               namespace: namespaces.join(".")
+                       }, handleObjIn );
+
+                       // Init the event handler queue if we're the first
+                       handlers = events[ type ];
+                       if ( !handlers ) {
+                               handlers = events[ type ] = [];
+                               handlers.delegateCount = 0;
+
+                               // Only use addEventListener/attachEvent if the special events handler returns false
+                               if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
+                                       // Bind the global event handler to the element
+                                       if ( elem.addEventListener ) {
+                                               elem.addEventListener( type, eventHandle, false );
+
+                                       } else if ( elem.attachEvent ) {
+                                               elem.attachEvent( "on" + type, eventHandle );
+                                       }
+                               }
+                       }
+
+                       if ( special.add ) {
+                               special.add.call( elem, handleObj );
+
+                               if ( !handleObj.handler.guid ) {
+                                       handleObj.handler.guid = handler.guid;
+                               }
+                       }
+
+                       // Add to the element's handler list, delegates in front
+                       if ( selector ) {
+                               handlers.splice( handlers.delegateCount++, 0, handleObj );
+                       } else {
+                               handlers.push( handleObj );
+                       }
+
+                       // Keep track of which events have ever been used, for event optimization
+                       jQuery.event.global[ type ] = true;
+               }
+
+               // Nullify elem to prevent memory leaks in IE
+               elem = null;
+       },
+
+       global: {},
+
+       // Detach an event or set of events from an element
+       remove: function( elem, types, handler, selector, mappedTypes ) {
+
+               var elemData = jQuery.hasData( elem ) && jQuery._data( elem ),
+                       t, tns, type, origType, namespaces, origCount,
+                       j, events, special, handle, eventType, handleObj;
+
+               if ( !elemData || !(events = elemData.events) ) {
+                       return;
+               }
+
+               // Once for each type.namespace in types; type may be omitted
+               types = jQuery.trim( hoverHack( types || "" ) ).split(" ");
+               for ( t = 0; t < types.length; t++ ) {
+                       tns = rtypenamespace.exec( types[t] ) || [];
+                       type = origType = tns[1];
+                       namespaces = tns[2];
+
+                       // Unbind all events (on this namespace, if provided) for the element
+                       if ( !type ) {
+                               for ( type in events ) {
+                                       jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
+                               }
+                               continue;
+                       }
+
+                       special = jQuery.event.special[ type ] || {};
+                       type = ( selector? special.delegateType : special.bindType ) || type;
+                       eventType = events[ type ] || [];
+                       origCount = eventType.length;
+                       namespaces = namespaces ? new RegExp("(^|\\.)" + namespaces.split(".").sort().join("\\.(?:.*\\.)?") + "(\\.|$)") : null;
+
+                       // Remove matching events
+                       for ( j = 0; j < eventType.length; j++ ) {
+                               handleObj = eventType[ j ];
+
+                               if ( ( mappedTypes || origType === handleObj.origType ) &&
+                                        ( !handler || handler.guid === handleObj.guid ) &&
+                                        ( !namespaces || namespaces.test( handleObj.namespace ) ) &&
+                                        ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) {
+                                       eventType.splice( j--, 1 );
+
+                                       if ( handleObj.selector ) {
+                                               eventType.delegateCount--;
+                                       }
+                                       if ( special.remove ) {
+                                               special.remove.call( elem, handleObj );
+                                       }
+                               }
+                       }
+
+                       // Remove generic event handler if we removed something and no more handlers exist
+                       // (avoids potential for endless recursion during removal of special event handlers)
+                       if ( eventType.length === 0 && origCount !== eventType.length ) {
+                               if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) {
+                                       jQuery.removeEvent( elem, type, elemData.handle );
+                               }
+
+                               delete events[ type ];
+                       }
+               }
+
+               // Remove the expando if it's no longer used
+               if ( jQuery.isEmptyObject( events ) ) {
+                       handle = elemData.handle;
+                       if ( handle ) {
+                               handle.elem = null;
+                       }
+
+                       // removeData also checks for emptiness and clears the expando if empty
+                       // so use it instead of delete
+                       jQuery.removeData( elem, [ "events", "handle" ], true );
+               }
+       },
+
+       // Events that are safe to short-circuit if no handlers are attached.
+       // Native DOM events should not be added, they may have inline handlers.
+       customEvent: {
+               "getData": true,
+               "setData": true,
+               "changeData": true
+       },
+
+       trigger: function( event, data, elem, onlyHandlers ) {
+               // Don't do events on text and comment nodes
+               if ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) {
+                       return;
+               }
+
+               // Event object or event type
+               var type = event.type || event,
+                       namespaces = [],
+                       cache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType;
+
+               // focus/blur morphs to focusin/out; ensure we're not firing them right now
+               if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
+                       return;
+               }
+
+               if ( type.indexOf( "!" ) >= 0 ) {
+                       // Exclusive events trigger only for the exact event (no namespaces)
+                       type = type.slice(0, -1);
+                       exclusive = true;
+               }
+
+               if ( type.indexOf( "." ) >= 0 ) {
+                       // Namespaced trigger; create a regexp to match event type in handle()
+                       namespaces = type.split(".");
+                       type = namespaces.shift();
+                       namespaces.sort();
+               }
+
+               if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) {
+                       // No jQuery handlers for this event type, and it can't have inline handlers
+                       return;
+               }
+
+               // Caller can pass in an Event, Object, or just an event type string
+               event = typeof event === "object" ?
+                       // jQuery.Event object
+                       event[ jQuery.expando ] ? event :
+                       // Object literal
+                       new jQuery.Event( type, event ) :
+                       // Just the event type (string)
+                       new jQuery.Event( type );
+
+               event.type = type;
+               event.isTrigger = true;
+               event.exclusive = exclusive;
+               event.namespace = namespaces.join( "." );
+               event.namespace_re = event.namespace? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.)?") + "(\\.|$)") : null;
+               ontype = type.indexOf( ":" ) < 0 ? "on" + type : "";
+
+               // Handle a global trigger
+               if ( !elem ) {
+
+                       // TODO: Stop taunting the data cache; remove global events and always attach to document
+                       cache = jQuery.cache;
+                       for ( i in cache ) {
+                               if ( cache[ i ].events && cache[ i ].events[ type ] ) {
+                                       jQuery.event.trigger( event, data, cache[ i ].handle.elem, true );
+                               }
+                       }
+                       return;
+               }
+
+               // Clean up the event in case it is being reused
+               event.result = undefined;
+               if ( !event.target ) {
+                       event.target = elem;
+               }
+
+               // Clone any incoming data and prepend the event, creating the handler arg list
+               data = data != null ? jQuery.makeArray( data ) : [];
+               data.unshift( event );
+
+               // Allow special events to draw outside the lines
+               special = jQuery.event.special[ type ] || {};
+               if ( special.trigger && special.trigger.apply( elem, data ) === false ) {
+                       return;
+               }
+
+               // Determine event propagation path in advance, per W3C events spec (#9951)
+               // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
+               eventPath = [[ elem, special.bindType || type ]];
+               if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
+
+                       bubbleType = special.delegateType || type;
+                       cur = rfocusMorph.test( bubbleType + type ) ? elem : elem.parentNode;
+                       old = null;
+                       for ( ; cur; cur = cur.parentNode ) {
+                               eventPath.push([ cur, bubbleType ]);
+                               old = cur;
+                       }
+
+                       // Only add window if we got to document (e.g., not plain obj or detached DOM)
+                       if ( old && old === elem.ownerDocument ) {
+                               eventPath.push([ old.defaultView || old.parentWindow || window, bubbleType ]);
+                       }
+               }
+
+               // Fire handlers on the event path
+               for ( i = 0; i < eventPath.length && !event.isPropagationStopped(); i++ ) {
+
+                       cur = eventPath[i][0];
+                       event.type = eventPath[i][1];
+
+                       handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" );
+                       if ( handle ) {
+                               handle.apply( cur, data );
+                       }
+                       // Note that this is a bare JS function and not a jQuery handler
+                       handle = ontype && cur[ ontype ];
+                       if ( handle && jQuery.acceptData( cur ) && handle.apply( cur, data ) === false ) {
+                               event.preventDefault();
+                       }
+               }
+               event.type = type;
+
+               // If nobody prevented the default action, do it now
+               if ( !onlyHandlers && !event.isDefaultPrevented() ) {
+
+                       if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) &&
+                               !(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) {
+
+                               // Call a native DOM method on the target with the same name name as the event.
+                               // Can't use an .isFunction() check here because IE6/7 fails that test.
+                               // Don't do default actions on window, that's where global variables be (#6170)
+                               // IE<9 dies on focus/blur to hidden element (#1486)
+                               if ( ontype && elem[ type ] && ((type !== "focus" && type !== "blur") || event.target.offsetWidth !== 0) && !jQuery.isWindow( elem ) ) {
+
+                                       // Don't re-trigger an onFOO event when we call its FOO() method
+                                       old = elem[ ontype ];
+
+                                       if ( old ) {
+                                               elem[ ontype ] = null;
+                                       }
+
+                                       // Prevent re-triggering of the same event, since we already bubbled it above
+                                       jQuery.event.triggered = type;
+                                       elem[ type ]();
+                                       jQuery.event.triggered = undefined;
+
+                                       if ( old ) {
+                                               elem[ ontype ] = old;
+                                       }
+                               }
+                       }
+               }
+
+               return event.result;
+       },
+
+       dispatch: function( event ) {
+
+               // Make a writable jQuery.Event from the native event object
+               event = jQuery.event.fix( event || window.event );
+
+               var handlers = ( (jQuery._data( this, "events" ) || {} )[ event.type ] || []),
+                       delegateCount = handlers.delegateCount,
+                       args = [].slice.call( arguments, 0 ),
+                       run_all = !event.exclusive && !event.namespace,
+                       handlerQueue = [],
+                       i, j, cur, jqcur, ret, selMatch, matched, matches, handleObj, sel, related;
+
+               // Use the fix-ed jQuery.Event rather than the (read-only) native event
+               args[0] = event;
+               event.delegateTarget = this;
+
+               // Determine handlers that should run if there are delegated events
+               // Avoid disabled elements in IE (#6911) and non-left-click bubbling in Firefox (#3861)
+               if ( delegateCount && !event.target.disabled && !(event.button && event.type === "click") ) {
+
+                       // Pregenerate a single jQuery object for reuse with .is()
+                       jqcur = jQuery(this);
+                       jqcur.context = this.ownerDocument || this;
+
+                       for ( cur = event.target; cur != this; cur = cur.parentNode || this ) {
+                               selMatch = {};
+                               matches = [];
+                               jqcur[0] = cur;
+                               for ( i = 0; i < delegateCount; i++ ) {
+                                       handleObj = handlers[ i ];
+                                       sel = handleObj.selector;
+
+                                       if ( selMatch[ sel ] === undefined ) {
+                                               selMatch[ sel ] = (
+                                                       handleObj.quick ? quickIs( cur, handleObj.quick ) : jqcur.is( sel )
+                                               );
+                                       }
+                                       if ( selMatch[ sel ] ) {
+                                               matches.push( handleObj );
+                                       }
+                               }
+                               if ( matches.length ) {
+                                       handlerQueue.push({ elem: cur, matches: matches });
+                               }
+                       }
+               }
+
+               // Add the remaining (directly-bound) handlers
+               if ( handlers.length > delegateCount ) {
+                       handlerQueue.push({ elem: this, matches: handlers.slice( delegateCount ) });
+               }
+
+               // Run delegates first; they may want to stop propagation beneath us
+               for ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) {
+                       matched = handlerQueue[ i ];
+                       event.currentTarget = matched.elem;
+
+                       for ( j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++ ) {
+                               handleObj = matched.matches[ j ];
+
+                               // Triggered event must either 1) be non-exclusive and have no namespace, or
+                               // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
+                               if ( run_all || (!event.namespace && !handleObj.namespace) || event.namespace_re && event.namespace_re.test( handleObj.namespace ) ) {
+
+                                       event.data = handleObj.data;
+                                       event.handleObj = handleObj;
+
+                                       ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
+                                                       .apply( matched.elem, args );
+
+                                       if ( ret !== undefined ) {
+                                               event.result = ret;
+                                               if ( ret === false ) {
+                                                       event.preventDefault();
+                                                       event.stopPropagation();
+                                               }
+                                       }
+                               }
+                       }
+               }
+
+               return event.result;
+       },
+
+       // Includes some event props shared by KeyEvent and MouseEvent
+       // *** attrChange attrName relatedNode srcElement  are not normalized, non-W3C, deprecated, will be removed in 1.8 ***
+       props: "attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
+
+       fixHooks: {},
+
+       keyHooks: {
+               props: "char charCode key keyCode".split(" "),
+               filter: function( event, original ) {
+
+                       // Add which for key events
+                       if ( event.which == null ) {
+                               event.which = original.charCode != null ? original.charCode : original.keyCode;
+                       }
+
+                       return event;
+               }
+       },
+
+       mouseHooks: {
+               props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
+               filter: function( event, original ) {
+                       var eventDoc, doc, body,
+                               button = original.button,
+                               fromElement = original.fromElement;
+
+                       // Calculate pageX/Y if missing and clientX/Y available
+                       if ( event.pageX == null && original.clientX != null ) {
+                               eventDoc = event.target.ownerDocument || document;
+                               doc = eventDoc.documentElement;
+                               body = eventDoc.body;
+
+                               event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );
+                               event.pageY = original.clientY + ( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) - ( doc && doc.clientTop  || body && body.clientTop  || 0 );
+                       }
+
+                       // Add relatedTarget, if necessary
+                       if ( !event.relatedTarget && fromElement ) {
+                               event.relatedTarget = fromElement === event.target ? original.toElement : fromElement;
+                       }
+
+                       // Add which for click: 1 === left; 2 === middle; 3 === right
+                       // Note: button is not normalized, so don't use it
+                       if ( !event.which && button !== undefined ) {
+                               event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
+                       }
+
+                       return event;
+               }
+       },
+
+       fix: function( event ) {
+               if ( event[ jQuery.expando ] ) {
+                       return event;
+               }
+
+               // Create a writable copy of the event object and normalize some properties
+               var i, prop,
+                       originalEvent = event,
+                       fixHook = jQuery.event.fixHooks[ event.type ] || {},
+                       copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
+
+               event = jQuery.Event( originalEvent );
+
+               for ( i = copy.length; i; ) {
+                       prop = copy[ --i ];
+                       event[ prop ] = originalEvent[ prop ];
+               }
+
+               // Fix target property, if necessary (#1925, IE 6/7/8 & Safari2)
+               if ( !event.target ) {
+                       event.target = originalEvent.srcElement || document;
+               }
+
+               // Target should not be a text node (#504, Safari)
+               if ( event.target.nodeType === 3 ) {
+                       event.target = event.target.parentNode;
+               }
+
+               // For mouse/key events; add metaKey if it's not there (#3368, IE6/7/8)
+               if ( event.metaKey === undefined ) {
+                       event.metaKey = event.ctrlKey;
+               }
+
+               return fixHook.filter? fixHook.filter( event, originalEvent ) : event;
+       },
+
+       special: {
+               ready: {
+                       // Make sure the ready event is setup
+                       setup: jQuery.bindReady
+               },
+
+               load: {
+                       // Prevent triggered image.load events from bubbling to window.load
+                       noBubble: true
+               },
+
+               focus: {
+                       delegateType: "focusin"
+               },
+               blur: {
+                       delegateType: "focusout"
+               },
+
+               beforeunload: {
+                       setup: function( data, namespaces, eventHandle ) {
+                               // We only want to do this special case on windows
+                               if ( jQuery.isWindow( this ) ) {
+                                       this.onbeforeunload = eventHandle;
+                               }
+                       },
+
+                       teardown: function( namespaces, eventHandle ) {
+                               if ( this.onbeforeunload === eventHandle ) {
+                                       this.onbeforeunload = null;
+                               }
+                       }
+               }
+       },
+
+       simulate: function( type, elem, event, bubble ) {
+               // Piggyback on a donor event to simulate a different one.
+               // Fake originalEvent to avoid donor's stopPropagation, but if the
+               // simulated event prevents default then we do the same on the donor.
+               var e = jQuery.extend(
+                       new jQuery.Event(),
+                       event,
+                       { type: type,
+                               isSimulated: true,
+                               originalEvent: {}
+                       }
+               );
+               if ( bubble ) {
+                       jQuery.event.trigger( e, null, elem );
+               } else {
+                       jQuery.event.dispatch.call( elem, e );
+               }
+               if ( e.isDefaultPrevented() ) {
+                       event.preventDefault();
+               }
+       }
+};
+
+// Some plugins are using, but it's undocumented/deprecated and will be removed.
+// The 1.7 special event interface should provide all the hooks needed now.
+jQuery.event.handle = jQuery.event.dispatch;
+
+jQuery.removeEvent = document.removeEventListener ?
+       function( elem, type, handle ) {
+               if ( elem.removeEventListener ) {
+                       elem.removeEventListener( type, handle, false );
+               }
+       } :
+       function( elem, type, handle ) {
+               if ( elem.detachEvent ) {
+                       elem.detachEvent( "on" + type, handle );
+               }
+       };
+
+jQuery.Event = function( src, props ) {
+       // Allow instantiation without the 'new' keyword
+       if ( !(this instanceof jQuery.Event) ) {
+               return new jQuery.Event( src, props );
+       }
+
+       // Event object
+       if ( src && src.type ) {
+               this.originalEvent = src;
+               this.type = src.type;
+
+               // Events bubbling up the document may have been marked as prevented
+               // by a handler lower down the tree; reflect the correct value.
+               this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false ||
+                       src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse;
+
+       // Event type
+       } else {
+               this.type = src;
+       }
+
+       // Put explicitly provided properties onto the event object
+       if ( props ) {
+               jQuery.extend( this, props );
+       }
+
+       // Create a timestamp if incoming event doesn't have one
+       this.timeStamp = src && src.timeStamp || jQuery.now();
+
+       // Mark it as fixed
+       this[ jQuery.expando ] = true;
+};
+
+function returnFalse() {
+       return false;
+}
+function returnTrue() {
+       return true;
+}
+
+// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
+// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
+jQuery.Event.prototype = {
+       preventDefault: function() {
+               this.isDefaultPrevented = returnTrue;
+
+               var e = this.originalEvent;
+               if ( !e ) {
+                       return;
+               }
+
+               // if preventDefault exists run it on the original event
+               if ( e.preventDefault ) {
+                       e.preventDefault();
+
+               // otherwise set the returnValue property of the original event to false (IE)
+               } else {
+                       e.returnValue = false;
+               }
+       },
+       stopPropagation: function() {
+               this.isPropagationStopped = returnTrue;
+
+               var e = this.originalEvent;
+               if ( !e ) {
+                       return;
+               }
+               // if stopPropagation exists run it on the original event
+               if ( e.stopPropagation ) {
+                       e.stopPropagation();
+               }
+               // otherwise set the cancelBubble property of the original event to true (IE)
+               e.cancelBubble = true;
+       },
+       stopImmediatePropagation: function() {
+               this.isImmediatePropagationStopped = returnTrue;
+               this.stopPropagation();
+       },
+       isDefaultPrevented: returnFalse,
+       isPropagationStopped: returnFalse,
+       isImmediatePropagationStopped: returnFalse
+};
+
+// Create mouseenter/leave events using mouseover/out and event-time checks
+jQuery.each({
+       mouseenter: "mouseover",
+       mouseleave: "mouseout"
+}, function( orig, fix ) {
+       jQuery.event.special[ orig ] = {
+               delegateType: fix,
+               bindType: fix,
+
+               handle: function( event ) {
+                       var target = this,
+                               related = event.relatedTarget,
+                               handleObj = event.handleObj,
+                               selector = handleObj.selector,
+                               ret;
+
+                       // For mousenter/leave call the handler if related is outside the target.
+                       // NB: No relatedTarget if the mouse left/entered the browser window
+                       if ( !related || (related !== target && !jQuery.contains( target, related )) ) {
+                               event.type = handleObj.origType;
+                               ret = handleObj.handler.apply( this, arguments );
+                               event.type = fix;
+                       }
+                       return ret;
+               }
+       };
+});
+
+// IE submit delegation
+if ( !jQuery.support.submitBubbles ) {
+
+       jQuery.event.special.submit = {
+               setup: function() {
+                       // Only need this for delegated form submit events
+                       if ( jQuery.nodeName( this, "form" ) ) {
+                               return false;
+                       }
+
+                       // Lazy-add a submit handler when a descendant form may potentially be submitted
+                       jQuery.event.add( this, "click._submit keypress._submit", function( e ) {
+                               // Node name check avoids a VML-related crash in IE (#9807)
+                               var elem = e.target,
+                                       form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined;
+                               if ( form && !form._submit_attached ) {
+                                       jQuery.event.add( form, "submit._submit", function( event ) {
+                                               // If form was submitted by the user, bubble the event up the tree
+                                               if ( this.parentNode && !event.isTrigger ) {
+                                                       jQuery.event.simulate( "submit", this.parentNode, event, true );
+                                               }
+                                       });
+                                       form._submit_attached = true;
+                               }
+                       });
+                       // return undefined since we don't need an event listener
+               },
+
+               teardown: function() {
+                       // Only need this for delegated form submit events
+                       if ( jQuery.nodeName( this, "form" ) ) {
+                               return false;
+                       }
+
+                       // Remove delegated handlers; cleanData eventually reaps submit handlers attached above
+                       jQuery.event.remove( this, "._submit" );
+               }
+       };
+}
+
+// IE change delegation and checkbox/radio fix
+if ( !jQuery.support.changeBubbles ) {
+
+       jQuery.event.special.change = {
+
+               setup: function() {
+
+                       if ( rformElems.test( this.nodeName ) ) {
+                               // IE doesn't fire change on a check/radio until blur; trigger it on click
+                               // after a propertychange. Eat the blur-change in special.change.handle.
+                               // This still fires onchange a second time for check/radio after blur.
+                               if ( this.type === "checkbox" || this.type === "radio" ) {
+                                       jQuery.event.add( this, "propertychange._change", function( event ) {
+                                               if ( event.originalEvent.propertyName === "checked" ) {
+                                                       this._just_changed = true;
+                                               }
+                                       });
+                                       jQuery.event.add( this, "click._change", function( event ) {
+                                               if ( this._just_changed && !event.isTrigger ) {
+                                                       this._just_changed = false;
+                                                       jQuery.event.simulate( "change", this, event, true );
+                                               }
+                                       });
+                               }
+                               return false;
+                       }
+                       // Delegated event; lazy-add a change handler on descendant inputs
+                       jQuery.event.add( this, "beforeactivate._change", function( e ) {
+                               var elem = e.target;
+
+                               if ( rformElems.test( elem.nodeName ) && !elem._change_attached ) {
+                                       jQuery.event.add( elem, "change._change", function( event ) {
+                                               if ( this.parentNode && !event.isSimulated && !event.isTrigger ) {
+                                                       jQuery.event.simulate( "change", this.parentNode, event, true );
+                                               }
+                                       });
+                                       elem._change_attached = true;
+                               }
+                       });
+               },
+
+               handle: function( event ) {
+                       var elem = event.target;
+
+                       // Swallow native change events from checkbox/radio, we already triggered them above
+                       if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) {
+                               return event.handleObj.handler.apply( this, arguments );
+                       }
+               },
+
+               teardown: function() {
+                       jQuery.event.remove( this, "._change" );
+
+                       return rformElems.test( this.nodeName );
+               }
+       };
+}
+
+// Create "bubbling" focus and blur events
+if ( !jQuery.support.focusinBubbles ) {
+       jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
+
+               // Attach a single capturing handler while someone wants focusin/focusout
+               var attaches = 0,
+                       handler = function( event ) {
+                               jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );
+                       };
+
+               jQuery.event.special[ fix ] = {
+                       setup: function() {
+                               if ( attaches++ === 0 ) {
+                                       document.addEventListener( orig, handler, true );
+                               }
+                       },
+                       teardown: function() {
+                               if ( --attaches === 0 ) {
+                                       document.removeEventListener( orig, handler, true );
+                               }
+                       }
+               };
+       });
+}
+
+jQuery.fn.extend({
+
+       on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
+               var origFn, type;
+
+               // Types can be a map of types/handlers
+               if ( typeof types === "object" ) {
+                       // ( types-Object, selector, data )
+                       if ( typeof selector !== "string" ) {
+                               // ( types-Object, data )
+                               data = selector;
+                               selector = undefined;
+                       }
+                       for ( type in types ) {
+                               this.on( type, selector, data, types[ type ], one );
+                       }
+                       return this;
+               }
+
+               if ( data == null && fn == null ) {
+                       // ( types, fn )
+                       fn = selector;
+                       data = selector = undefined;
+               } else if ( fn == null ) {
+                       if ( typeof selector === "string" ) {
+                               // ( types, selector, fn )
+                               fn = data;
+                               data = undefined;
+                       } else {
+                               // ( types, data, fn )
+                               fn = data;
+                               data = selector;
+                               selector = undefined;
+                       }
+               }
+               if ( fn === false ) {
+                       fn = returnFalse;
+               } else if ( !fn ) {
+                       return this;
+               }
+
+               if ( one === 1 ) {
+                       origFn = fn;
+                       fn = function( event ) {
+                               // Can use an empty set, since event contains the info
+                               jQuery().off( event );
+                               return origFn.apply( this, arguments );
+                       };
+                       // Use same guid so caller can remove using origFn
+                       fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
+               }
+               return this.each( function() {
+                       jQuery.event.add( this, types, fn, data, selector );
+               });
+       },
+       one: function( types, selector, data, fn ) {
+               return this.on.call( this, types, selector, data, fn, 1 );
+       },
+       off: function( types, selector, fn ) {
+               if ( types && types.preventDefault && types.handleObj ) {
+                       // ( event )  dispatched jQuery.Event
+                       var handleObj = types.handleObj;
+                       jQuery( types.delegateTarget ).off(
+                               handleObj.namespace? handleObj.type + "." + handleObj.namespace : handleObj.type,
+                               handleObj.selector,
+                               handleObj.handler
+                       );
+                       return this;
+               }
+               if ( typeof types === "object" ) {
+                       // ( types-object [, selector] )
+                       for ( var type in types ) {
+                               this.off( type, selector, types[ type ] );
+                       }
+                       return this;
+               }
+               if ( selector === false || typeof selector === "function" ) {
+                       // ( types [, fn] )
+                       fn = selector;
+                       selector = undefined;
+               }
+               if ( fn === false ) {
+                       fn = returnFalse;
+               }
+               return this.each(function() {
+                       jQuery.event.remove( this, types, fn, selector );
+               });
+       },
+
+       bind: function( types, data, fn ) {
+               return this.on( types, null, data, fn );
+       },
+       unbind: function( types, fn ) {
+               return this.off( types, null, fn );
+       },
+
+       live: function( types, data, fn ) {
+               jQuery( this.context ).on( types, this.selector, data, fn );
+               return this;
+       },
+       die: function( types, fn ) {
+               jQuery( this.context ).off( types, this.selector || "**", fn );
+               return this;
+       },
+
+       delegate: function( selector, types, data, fn ) {
+               return this.on( types, selector, data, fn );
+       },
+       undelegate: function( selector, types, fn ) {
+               // ( namespace ) or ( selector, types [, fn] )
+               return arguments.length == 1? this.off( selector, "**" ) : this.off( types, selector, fn );
+       },
+
+       trigger: function( type, data ) {
+               return this.each(function() {
+                       jQuery.event.trigger( type, data, this );
+               });
+       },
+       triggerHandler: function( type, data ) {
+               if ( this[0] ) {
+                       return jQuery.event.trigger( type, data, this[0], true );
+               }
+       },
+
+       toggle: function( fn ) {
+               // Save reference to arguments for access in closure
+               var args = arguments,
+                       guid = fn.guid || jQuery.guid++,
+                       i = 0,
+                       toggler = function( event ) {
+                               // Figure out which function to execute
+                               var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i;
+                               jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 );
+
+                               // Make sure that clicks stop
+                               event.preventDefault();
+
+                               // and execute the function
+                               return args[ lastToggle ].apply( this, arguments ) || false;
+                       };
+
+               // link all the functions, so any of them can unbind this click handler
+               toggler.guid = guid;
+               while ( i < args.length ) {
+                       args[ i++ ].guid = guid;
+               }
+
+               return this.click( toggler );
+       },
+
+       hover: function( fnOver, fnOut ) {
+               return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
+       }
+});
+
+jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
+       "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
+       "change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) {
+
+       // Handle event binding
+       jQuery.fn[ name ] = function( data, fn ) {
+               if ( fn == null ) {
+                       fn = data;
+                       data = null;
+               }
+
+               return arguments.length > 0 ?
+                       this.on( name, null, data, fn ) :
+                       this.trigger( name );
+       };
+
+       if ( jQuery.attrFn ) {
+               jQuery.attrFn[ name ] = true;
+       }
+
+       if ( rkeyEvent.test( name ) ) {
+               jQuery.event.fixHooks[ name ] = jQuery.event.keyHooks;
+       }
+
+       if ( rmouseEvent.test( name ) ) {
+               jQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks;
+       }
+});
+
+
+
+/*!
+ * Sizzle CSS Selector Engine
+ *  Copyright 2011, The Dojo Foundation
+ *  Released under the MIT, BSD, and GPL Licenses.
+ *  More information: http://sizzlejs.com/
+ */
+(function(){
+
+var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
+       expando = "sizcache" + (Math.random() + '').replace('.', ''),
+       done = 0,
+       toString = Object.prototype.toString,
+       hasDuplicate = false,
+       baseHasDuplicate = true,
+       rBackslash = /\\/g,
+       rReturn = /\r\n/g,
+       rNonWord = /\W/;
+
+// Here we check if the JavaScript engine is using some sort of
+// optimization where it does not always call our comparision
+// function. If that is the case, discard the hasDuplicate value.
+//   Thus far that includes Google Chrome.
+[0, 0].sort(function() {
+       baseHasDuplicate = false;
+       return 0;
+});
+
+var Sizzle = function( selector, context, results, seed ) {
+       results = results || [];
+       context = context || document;
+
+       var origContext = context;
+
+       if ( context.nodeType !== 1 && context.nodeType !== 9 ) {
+               return [];
+       }
+       
+       if ( !selector || typeof selector !== "string" ) {
+               return results;
+       }
+
+       var m, set, checkSet, extra, ret, cur, pop, i,
+               prune = true,
+               contextXML = Sizzle.isXML( context ),
+               parts = [],
+               soFar = selector;
+       
+       // Reset the position of the chunker regexp (start from head)
+       do {
+               chunker.exec( "" );
+               m = chunker.exec( soFar );
+
+               if ( m ) {
+                       soFar = m[3];
+               
+                       parts.push( m[1] );
+               
+                       if ( m[2] ) {
+                               extra = m[3];
+                               break;
+                       }
+               }
+       } while ( m );
+
+       if ( parts.length > 1 && origPOS.exec( selector ) ) {
+
+               if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
+                       set = posProcess( parts[0] + parts[1], context, seed );
+
+               } else {
+                       set = Expr.relative[ parts[0] ] ?
+                               [ context ] :
+                               Sizzle( parts.shift(), context );
+
+                       while ( parts.length ) {
+                               selector = parts.shift();
+
+                               if ( Expr.relative[ selector ] ) {
+                                       selector += parts.shift();
+                               }
+                               
+                               set = posProcess( selector, set, seed );
+                       }
+               }
+
+       } else {
+               // Take a shortcut and set the context if the root selector is an ID
+               // (but not if it'll be faster if the inner selector is an ID)
+               if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML &&
+                               Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) {
+
+                       ret = Sizzle.find( parts.shift(), context, contextXML );
+                       context = ret.expr ?
+                               Sizzle.filter( ret.expr, ret.set )[0] :
+                               ret.set[0];
+               }
+
+               if ( context ) {
+                       ret = seed ?
+                               { expr: parts.pop(), set: makeArray(seed) } :
+                               Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML );
+
+                       set = ret.expr ?
+                               Sizzle.filter( ret.expr, ret.set ) :
+                               ret.set;
+
+                       if ( parts.length > 0 ) {
+                               checkSet = makeArray( set );
+
+                       } else {
+                               prune = false;
+                       }
+
+                       while ( parts.length ) {
+                               cur = parts.pop();
+                               pop = cur;
+
+                               if ( !Expr.relative[ cur ] ) {
+                                       cur = "";
+                               } else {
+                                       pop = parts.pop();
+                               }
+
+                               if ( pop == null ) {
+                                       pop = context;
+                               }
+
+                               Expr.relative[ cur ]( checkSet, pop, contextXML );
+                       }
+
+               } else {
+                       checkSet = parts = [];
+               }
+       }
+
+       if ( !checkSet ) {
+               checkSet = set;
+       }
+
+       if ( !checkSet ) {
+               Sizzle.error( cur || selector );
+       }
+
+       if ( toString.call(checkSet) === "[object Array]" ) {
+               if ( !prune ) {
+                       results.push.apply( results, checkSet );
+
+               } else if ( context && context.nodeType === 1 ) {
+                       for ( i = 0; checkSet[i] != null; i++ ) {
+                               if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) {
+                                       results.push( set[i] );
+                               }
+                       }
+
+               } else {
+                       for ( i = 0; checkSet[i] != null; i++ ) {
+                               if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
+                                       results.push( set[i] );
+                               }
+                       }
+               }
+
+       } else {
+               makeArray( checkSet, results );
+       }
+
+       if ( extra ) {
+               Sizzle( extra, origContext, results, seed );
+               Sizzle.uniqueSort( results );
+       }
+
+       return results;
+};
+
+Sizzle.uniqueSort = function( results ) {
+       if ( sortOrder ) {
+               hasDuplicate = baseHasDuplicate;
+               results.sort( sortOrder );
+
+               if ( hasDuplicate ) {
+                       for ( var i = 1; i < results.length; i++ ) {
+                               if ( results[i] === results[ i - 1 ] ) {
+                                       results.splice( i--, 1 );
+                               }
+                       }
+               }
+       }
+
+       return results;
+};
+
+Sizzle.matches = function( expr, set ) {
+       return Sizzle( expr, null, null, set );
+};
+
+Sizzle.matchesSelector = function( node, expr ) {
+       return Sizzle( expr, null, null, [node] ).length > 0;
+};
+
+Sizzle.find = function( expr, context, isXML ) {
+       var set, i, len, match, type, left;
+
+       if ( !expr ) {
+               return [];
+       }
+
+       for ( i = 0, len = Expr.order.length; i < len; i++ ) {
+               type = Expr.order[i];
+               
+               if ( (match = Expr.leftMatch[ type ].exec( expr )) ) {
+                       left = match[1];
+                       match.splice( 1, 1 );
+
+                       if ( left.substr( left.length - 1 ) !== "\\" ) {
+                               match[1] = (match[1] || "").replace( rBackslash, "" );
+                               set = Expr.find[ type ]( match, context, isXML );
+
+                               if ( set != null ) {
+                                       expr = expr.replace( Expr.match[ type ], "" );
+                                       break;
+                               }
+                       }
+               }
+       }
+
+       if ( !set ) {
+               set = typeof context.getElementsByTagName !== "undefined" ?
+                       context.getElementsByTagName( "*" ) :
+                       [];
+       }
+
+       return { set: set, expr: expr };
+};
+
+Sizzle.filter = function( expr, set, inplace, not ) {
+       var match, anyFound,
+               type, found, item, filter, left,
+               i, pass,
+               old = expr,
+               result = [],
+               curLoop = set,
+               isXMLFilter = set && set[0] && Sizzle.isXML( set[0] );
+
+       while ( expr && set.length ) {
+               for ( type in Expr.filter ) {
+                       if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) {
+                               filter = Expr.filter[ type ];
+                               left = match[1];
+
+                               anyFound = false;
+
+                               match.splice(1,1);
+
+                               if ( left.substr( left.length - 1 ) === "\\" ) {
+                                       continue;
+                               }
+
+                               if ( curLoop === result ) {
+                                       result = [];
+                               }
+
+                               if ( Expr.preFilter[ type ] ) {
+                                       match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );
+
+                                       if ( !match ) {
+                                               anyFound = found = true;
+
+                                       } else if ( match === true ) {
+                                               continue;
+                                       }
+                               }
+
+                               if ( match ) {
+                                       for ( i = 0; (item = curLoop[i]) != null; i++ ) {
+                                               if ( item ) {
+                                                       found = filter( item, match, i, curLoop );
+                                                       pass = not ^ found;
+
+                                                       if ( inplace && found != null ) {
+                                                               if ( pass ) {
+                                                                       anyFound = true;
+
+                                                               } else {
+                                                                       curLoop[i] = false;
+                                                               }
+
+                                                       } else if ( pass ) {
+                                                               result.push( item );
+                                                               anyFound = true;
+                                                       }
+                                               }
+                                       }
+                               }
+
+                               if ( found !== undefined ) {
+                                       if ( !inplace ) {
+                                               curLoop = result;
+                                       }
+
+                                       expr = expr.replace( Expr.match[ type ], "" );
+
+                                       if ( !anyFound ) {
+                                               return [];
+                                       }
+
+                                       break;
+                               }
+                       }
+               }
+
+               // Improper expression
+               if ( expr === old ) {
+                       if ( anyFound == null ) {
+                               Sizzle.error( expr );
+
+                       } else {
+                               break;
+                       }
+               }
+
+               old = expr;
+       }
+
+       return curLoop;
+};
+
+Sizzle.error = function( msg ) {
+       throw new Error( "Syntax error, unrecognized expression: " + msg );
+};
+
+/**
+ * Utility function for retreiving the text value of an array of DOM nodes
+ * @param {Array|Element} elem
+ */
+var getText = Sizzle.getText = function( elem ) {
+    var i, node,
+               nodeType = elem.nodeType,
+               ret = "";
+
+       if ( nodeType ) {
+               if ( nodeType === 1 || nodeType === 9 ) {
+                       // Use textContent || innerText for elements
+                       if ( typeof elem.textContent === 'string' ) {
+                               return elem.textContent;
+                       } else if ( typeof elem.innerText === 'string' ) {
+                               // Replace IE's carriage returns
+                               return elem.innerText.replace( rReturn, '' );
+                       } else {
+                               // Traverse it's children
+                               for ( elem = elem.firstChild; elem; elem = elem.nextSibling) {
+                                       ret += getText( elem );
+                               }
+                       }
+               } else if ( nodeType === 3 || nodeType === 4 ) {
+                       return elem.nodeValue;
+               }
+       } else {
+
+               // If no nodeType, this is expected to be an array
+               for ( i = 0; (node = elem[i]); i++ ) {
+                       // Do not traverse comment nodes
+                       if ( node.nodeType !== 8 ) {
+                               ret += getText( node );
+                       }
+               }
+       }
+       return ret;
+};
+
+var Expr = Sizzle.selectors = {
+       order: [ "ID", "NAME", "TAG" ],
+
+       match: {
+               ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
+               CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
+               NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,
+               ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,
+               TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,
+               CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,
+               POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,
+               PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/
+       },
+
+       leftMatch: {},
+
+       attrMap: {
+               "class": "className",
+               "for": "htmlFor"
+       },
+
+       attrHandle: {
+               href: function( elem ) {
+                       return elem.getAttribute( "href" );
+               },
+               type: function( elem ) {
+                       return elem.getAttribute( "type" );
+               }
+       },
+
+       relative: {
+               "+": function(checkSet, part){
+                       var isPartStr = typeof part === "string",
+                               isTag = isPartStr && !rNonWord.test( part ),
+                               isPartStrNotTag = isPartStr && !isTag;
+
+                       if ( isTag ) {
+                               part = part.toLowerCase();
+                       }
+
+                       for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {
+                               if ( (elem = checkSet[i]) ) {
+                                       while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}
+
+                                       checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ?
+                                               elem || false :
+                                               elem === part;
+                               }
+                       }
+
+                       if ( isPartStrNotTag ) {
+                               Sizzle.filter( part, checkSet, true );
+                       }
+               },
+
+               ">": function( checkSet, part ) {
+                       var elem,
+                               isPartStr = typeof part === "string",
+                               i = 0,
+                               l = checkSet.length;
+
+                       if ( isPartStr && !rNonWord.test( part ) ) {
+                               part = part.toLowerCase();
+
+                               for ( ; i < l; i++ ) {
+                                       elem = checkSet[i];
+
+                                       if ( elem ) {
+                                               var parent = elem.parentNode;
+                                               checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false;
+                                       }
+                               }
+
+                       } else {
+                               for ( ; i < l; i++ ) {
+                                       elem = checkSet[i];
+
+                                       if ( elem ) {
+                                               checkSet[i] = isPartStr ?
+                                                       elem.parentNode :
+                                                       elem.parentNode === part;
+                                       }
+                               }
+
+                               if ( isPartStr ) {
+                                       Sizzle.filter( part, checkSet, true );
+                               }
+                       }
+               },
+
+               "": function(checkSet, part, isXML){
+                       var nodeCheck,
+                               doneName = done++,
+                               checkFn = dirCheck;
+
+                       if ( typeof part === "string" && !rNonWord.test( part ) ) {
+                               part = part.toLowerCase();
+                               nodeCheck = part;
+                               checkFn = dirNodeCheck;
+                       }
+
+                       checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML );
+               },
+
+               "~": function( checkSet, part, isXML ) {
+                       var nodeCheck,
+                               doneName = done++,
+                               checkFn = dirCheck;
+
+                       if ( typeof part === "string" && !rNonWord.test( part ) ) {
+                               part = part.toLowerCase();
+                               nodeCheck = part;
+                               checkFn = dirNodeCheck;
+                       }
+
+                       checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML );
+               }
+       },
+
+       find: {
+               ID: function( match, context, isXML ) {
+                       if ( typeof context.getElementById !== "undefined" && !isXML ) {
+                               var m = context.getElementById(match[1]);
+                               // Check parentNode to catch when Blackberry 4.6 returns
+                               // nodes that are no longer in the document #6963
+                               return m && m.parentNode ? [m] : [];
+                       }
+               },
+
+               NAME: function( match, context ) {
+                       if ( typeof context.getElementsByName !== "undefined" ) {
+                               var ret = [],
+                                       results = context.getElementsByName( match[1] );
+
+                               for ( var i = 0, l = results.length; i < l; i++ ) {
+                                       if ( results[i].getAttribute("name") === match[1] ) {
+                                               ret.push( results[i] );
+                                       }
+                               }
+
+                               return ret.length === 0 ? null : ret;
+                       }
+               },
+
+               TAG: function( match, context ) {
+                       if ( typeof context.getElementsByTagName !== "undefined" ) {
+                               return context.getElementsByTagName( match[1] );
+                       }
+               }
+       },
+       preFilter: {
+               CLASS: function( match, curLoop, inplace, result, not, isXML ) {
+                       match = " " + match[1].replace( rBackslash, "" ) + " ";
+
+                       if ( isXML ) {
+                               return match;
+                       }
+
+                       for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {
+                               if ( elem ) {
+                                       if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) {
+                                               if ( !inplace ) {
+                                                       result.push( elem );
+                                               }
+
+                                       } else if ( inplace ) {
+                                               curLoop[i] = false;
+                                       }
+                               }
+                       }
+
+                       return false;
+               },
+
+               ID: function( match ) {
+                       return match[1].replace( rBackslash, "" );
+               },
+
+               TAG: function( match, curLoop ) {
+                       return match[1].replace( rBackslash, "" ).toLowerCase();
+               },
+
+               CHILD: function( match ) {
+                       if ( match[1] === "nth" ) {
+                               if ( !match[2] ) {
+                                       Sizzle.error( match[0] );
+                               }
+
+                               match[2] = match[2].replace(/^\+|\s*/g, '');
+
+                               // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
+                               var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec(
+                                       match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" ||
+                                       !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);
+
+                               // calculate the numbers (first)n+(last) including if they are negative
+                               match[2] = (test[1] + (test[2] || 1)) - 0;
+                               match[3] = test[3] - 0;
+                       }
+                       else if ( match[2] ) {
+                               Sizzle.error( match[0] );
+                       }
+
+                       // TODO: Move to normal caching system
+                       match[0] = done++;
+
+                       return match;
+               },
+
+               ATTR: function( match, curLoop, inplace, result, not, isXML ) {
+                       var name = match[1] = match[1].replace( rBackslash, "" );
+                       
+                       if ( !isXML && Expr.attrMap[name] ) {
+                               match[1] = Expr.attrMap[name];
+                       }
+
+                       // Handle if an un-quoted value was used
+                       match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" );
+
+                       if ( match[2] === "~=" ) {
+                               match[4] = " " + match[4] + " ";
+                       }
+
+                       return match;
+               },
+
+               PSEUDO: function( match, curLoop, inplace, result, not ) {
+                       if ( match[1] === "not" ) {
+                               // If we're dealing with a complex expression, or a simple one
+                               if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) {
+                                       match[3] = Sizzle(match[3], null, null, curLoop);
+
+                               } else {
+                                       var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
+
+                                       if ( !inplace ) {
+                                               result.push.apply( result, ret );
+                                       }
+
+                                       return false;
+                               }
+
+                       } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {
+                               return true;
+                       }
+                       
+                       return match;
+               },
+
+               POS: function( match ) {
+                       match.unshift( true );
+
+                       return match;
+               }
+       },
+       
+       filters: {
+               enabled: function( elem ) {
+                       return elem.disabled === false && elem.type !== "hidden";
+               },
+
+               disabled: function( elem ) {
+                       return elem.disabled === true;
+               },
+
+               checked: function( elem ) {
+                       return elem.checked === true;
+               },
+               
+               selected: function( elem ) {
+                       // Accessing this property makes selected-by-default
+                       // options in Safari work properly
+                       if ( elem.parentNode ) {
+                               elem.parentNode.selectedIndex;
+                       }
+                       
+                       return elem.selected === true;
+               },
+
+               parent: function( elem ) {
+                       return !!elem.firstChild;
+               },
+
+               empty: function( elem ) {
+                       return !elem.firstChild;
+               },
+
+               has: function( elem, i, match ) {
+                       return !!Sizzle( match[3], elem ).length;
+               },
+
+               header: function( elem ) {
+                       return (/h\d/i).test( elem.nodeName );
+               },
+
+               text: function( elem ) {
+                       var attr = elem.getAttribute( "type" ), type = elem.type;
+                       // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc) 
+                       // use getAttribute instead to test this case
+                       return elem.nodeName.toLowerCase() === "input" && "text" === type && ( attr === type || attr === null );
+               },
+
+               radio: function( elem ) {
+                       return elem.nodeName.toLowerCase() === "input" && "radio" === elem.type;
+               },
+
+               checkbox: function( elem ) {
+                       return elem.nodeName.toLowerCase() === "input" && "checkbox" === elem.type;
+               },
+
+               file: function( elem ) {
+                       return elem.nodeName.toLowerCase() === "input" && "file" === elem.type;
+               },
+
+               password: function( elem ) {
+                       return elem.nodeName.toLowerCase() === "input" && "password" === elem.type;
+               },
+
+               submit: function( elem ) {
+                       var name = elem.nodeName.toLowerCase();
+                       return (name === "input" || name === "button") && "submit" === elem.type;
+               },
+
+               image: function( elem ) {
+                       return elem.nodeName.toLowerCase() === "input" && "image" === elem.type;
+               },
+
+               reset: function( elem ) {
+                       var name = elem.nodeName.toLowerCase();
+                       return (name === "input" || name === "button") && "reset" === elem.type;
+               },
+
+               button: function( elem ) {
+                       var name = elem.nodeName.toLowerCase();
+                       return name === "input" && "button" === elem.type || name === "button";
+               },
+
+               input: function( elem ) {
+                       return (/input|select|textarea|button/i).test( elem.nodeName );
+               },
+
+               focus: function( elem ) {
+                       return elem === elem.ownerDocument.activeElement;
+               }
+       },
+       setFilters: {
+               first: function( elem, i ) {
+                       return i === 0;
+               },
+
+               last: function( elem, i, match, array ) {
+                       return i === array.length - 1;
+               },
+
+               even: function( elem, i ) {
+                       return i % 2 === 0;
+               },
+
+               odd: function( elem, i ) {
+                       return i % 2 === 1;
+               },
+
+               lt: function( elem, i, match ) {
+                       return i < match[3] - 0;
+               },
+
+               gt: function( elem, i, match ) {
+                       return i > match[3] - 0;
+               },
+
+               nth: function( elem, i, match ) {
+                       return match[3] - 0 === i;
+               },
+
+               eq: function( elem, i, match ) {
+                       return match[3] - 0 === i;
+               }
+       },
+       filter: {
+               PSEUDO: function( elem, match, i, array ) {
+                       var name = match[1],
+                               filter = Expr.filters[ name ];
+
+                       if ( filter ) {
+                               return filter( elem, i, match, array );
+
+                       } else if ( name === "contains" ) {
+                               return (elem.textContent || elem.innerText || getText([ elem ]) || "").indexOf(match[3]) >= 0;
+
+                       } else if ( name === "not" ) {
+                               var not = match[3];
+
+                               for ( var j = 0, l = not.length; j < l; j++ ) {
+                                       if ( not[j] === elem ) {
+                                               return false;
+                                       }
+                               }
+
+                               return true;
+
+                       } else {
+                               Sizzle.error( name );
+                       }
+               },
+
+               CHILD: function( elem, match ) {
+                       var first, last,
+                               doneName, parent, cache,
+                               count, diff,
+                               type = match[1],
+                               node = elem;
+
+                       switch ( type ) {
+                               case "only":
+                               case "first":
+                                       while ( (node = node.previousSibling) )  {
+                                               if ( node.nodeType === 1 ) { 
+                                                       return false; 
+                                               }
+                                       }
+
+                                       if ( type === "first" ) { 
+                                               return true; 
+                                       }
+
+                                       node = elem;
+
+                               case "last":
+                                       while ( (node = node.nextSibling) )      {
+                                               if ( node.nodeType === 1 ) { 
+                                                       return false; 
+                                               }
+                                       }
+
+                                       return true;
+
+                               case "nth":
+                                       first = match[2];
+                                       last = match[3];
+
+                                       if ( first === 1 && last === 0 ) {
+                                               return true;
+                                       }
+                                       
+                                       doneName = match[0];
+                                       parent = elem.parentNode;
+       
+                                       if ( parent && (parent[ expando ] !== doneName || !elem.nodeIndex) ) {
+                                               count = 0;
+                                               
+                                               for ( node = parent.firstChild; node; node = node.nextSibling ) {
+                                                       if ( node.nodeType === 1 ) {
+                                                               node.nodeIndex = ++count;
+                                                       }
+                                               } 
+
+                                               parent[ expando ] = doneName;
+                                       }
+                                       
+                                       diff = elem.nodeIndex - last;
+
+                                       if ( first === 0 ) {
+                                               return diff === 0;
+
+                                       } else {
+                                               return ( diff % first === 0 && diff / first >= 0 );
+                                       }
+                       }
+               },
+
+               ID: function( elem, match ) {
+                       return elem.nodeType === 1 && elem.getAttribute("id") === match;
+               },
+
+               TAG: function( elem, match ) {
+                       return (match === "*" && elem.nodeType === 1) || !!elem.nodeName && elem.nodeName.toLowerCase() === match;
+               },
+               
+               CLASS: function( elem, match ) {
+                       return (" " + (elem.className || elem.getAttribute("class")) + " ")
+                               .indexOf( match ) > -1;
+               },
+
+               ATTR: function( elem, match ) {
+                       var name = match[1],
+                               result = Sizzle.attr ?
+                                       Sizzle.attr( elem, name ) :
+                                       Expr.attrHandle[ name ] ?
+                                       Expr.attrHandle[ name ]( elem ) :
+                                       elem[ name ] != null ?
+                                               elem[ name ] :
+                                               elem.getAttribute( name ),
+                               value = result + "",
+                               type = match[2],
+                               check = match[4];
+
+                       return result == null ?
+                               type === "!=" :
+                               !type && Sizzle.attr ?
+                               result != null :
+                               type === "=" ?
+                               value === check :
+                               type === "*=" ?
+                               value.indexOf(check) >= 0 :
+                               type === "~=" ?
+                               (" " + value + " ").indexOf(check) >= 0 :
+                               !check ?
+                               value && result !== false :
+                               type === "!=" ?
+                               value !== check :
+                               type === "^=" ?
+                               value.indexOf(check) === 0 :
+                               type === "$=" ?
+                               value.substr(value.length - check.length) === check :
+                               type === "|=" ?
+                               value === check || value.substr(0, check.length + 1) === check + "-" :
+                               false;
+               },
+
+               POS: function( elem, match, i, array ) {
+                       var name = match[2],
+                               filter = Expr.setFilters[ name ];
+
+                       if ( filter ) {
+                               return filter( elem, i, match, array );
+                       }
+               }
+       }
+};
+
+var origPOS = Expr.match.POS,
+       fescape = function(all, num){
+               return "\\" + (num - 0 + 1);
+       };
+
+for ( var type in Expr.match ) {
+       Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) );
+       Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) );
+}
+
+var makeArray = function( array, results ) {
+       array = Array.prototype.slice.call( array, 0 );
+
+       if ( results ) {
+               results.push.apply( results, array );
+               return results;
+       }
+       
+       return array;
+};
+
+// Perform a simple check to determine if the browser is capable of
+// converting a NodeList to an array using builtin methods.
+// Also verifies that the returned array holds DOM nodes
+// (which is not the case in the Blackberry browser)
+try {
+       Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType;
+
+// Provide a fallback method if it does not work
+} catch( e ) {
+       makeArray = function( array, results ) {
+               var i = 0,
+                       ret = results || [];
+
+               if ( toString.call(array) === "[object Array]" ) {
+                       Array.prototype.push.apply( ret, array );
+
+               } else {
+                       if ( typeof array.length === "number" ) {
+                               for ( var l = array.length; i < l; i++ ) {
+                                       ret.push( array[i] );
+                               }
+
+                       } else {
+                               for ( ; array[i]; i++ ) {
+                                       ret.push( array[i] );
+                               }
+                       }
+               }
+
+               return ret;
+       };
+}
+
+var sortOrder, siblingCheck;
+
+if ( document.documentElement.compareDocumentPosition ) {
+       sortOrder = function( a, b ) {
+               if ( a === b ) {
+                       hasDuplicate = true;
+                       return 0;
+               }
+
+               if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) {
+                       return a.compareDocumentPosition ? -1 : 1;
+               }
+
+               return a.compareDocumentPosition(b) & 4 ? -1 : 1;
+       };
+
+} else {
+       sortOrder = function( a, b ) {
+               // The nodes are identical, we can exit early
+               if ( a === b ) {
+                       hasDuplicate = true;
+                       return 0;
+
+               // Fallback to using sourceIndex (in IE) if it's available on both nodes
+               } else if ( a.sourceIndex && b.sourceIndex ) {
+                       return a.sourceIndex - b.sourceIndex;
+               }
+
+               var al, bl,
+                       ap = [],
+                       bp = [],
+                       aup = a.parentNode,
+                       bup = b.parentNode,
+                       cur = aup;
+
+               // If the nodes are siblings (or identical) we can do a quick check
+               if ( aup === bup ) {
+                       return siblingCheck( a, b );
+
+               // If no parents were found then the nodes are disconnected
+               } else if ( !aup ) {
+                       return -1;
+
+               } else if ( !bup ) {
+                       return 1;
+               }
+
+               // Otherwise they're somewhere else in the tree so we need
+               // to build up a full list of the parentNodes for comparison
+               while ( cur ) {
+                       ap.unshift( cur );
+                       cur = cur.parentNode;
+               }
+
+               cur = bup;
+
+               while ( cur ) {
+                       bp.unshift( cur );
+                       cur = cur.parentNode;
+               }
+
+               al = ap.length;
+               bl = bp.length;
+
+               // Start walking down the tree looking for a discrepancy
+               for ( var i = 0; i < al && i < bl; i++ ) {
+                       if ( ap[i] !== bp[i] ) {
+                               return siblingCheck( ap[i], bp[i] );
+                       }
+               }
+
+               // We ended someplace up the tree so do a sibling check
+               return i === al ?
+                       siblingCheck( a, bp[i], -1 ) :
+                       siblingCheck( ap[i], b, 1 );
+       };
+
+       siblingCheck = function( a, b, ret ) {
+               if ( a === b ) {
+                       return ret;
+               }
+
+               var cur = a.nextSibling;
+
+               while ( cur ) {
+                       if ( cur === b ) {
+                               return -1;
+                       }
+
+                       cur = cur.nextSibling;
+               }
+
+               return 1;
+       };
+}
+
+// Check to see if the browser returns elements by name when
+// querying by getElementById (and provide a workaround)
+(function(){
+       // We're going to inject a fake input element with a specified name
+       var form = document.createElement("div"),
+               id = "script" + (new Date()).getTime(),
+               root = document.documentElement;
+
+       form.innerHTML = "<a name='" + id + "'/>";
+
+       // Inject it into the root element, check its status, and remove it quickly
+       root.insertBefore( form, root.firstChild );
+
+       // The workaround has to do additional checks after a getElementById
+       // Which slows things down for other browsers (hence the branching)
+       if ( document.getElementById( id ) ) {
+               Expr.find.ID = function( match, context, isXML ) {
+                       if ( typeof context.getElementById !== "undefined" && !isXML ) {
+                               var m = context.getElementById(match[1]);
+
+                               return m ?
+                                       m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ?
+                                               [m] :
+                                               undefined :
+                                       [];
+                       }
+               };
+
+               Expr.filter.ID = function( elem, match ) {
+                       var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
+
+                       return elem.nodeType === 1 && node && node.nodeValue === match;
+               };
+       }
+
+       root.removeChild( form );
+
+       // release memory in IE
+       root = form = null;
+})();
+
+(function(){
+       // Check to see if the browser returns only elements
+       // when doing getElementsByTagName("*")
+
+       // Create a fake element
+       var div = document.createElement("div");
+       div.appendChild( document.createComment("") );
+
+       // Make sure no comments are found
+       if ( div.getElementsByTagName("*").length > 0 ) {
+               Expr.find.TAG = function( match, context ) {
+                       var results = context.getElementsByTagName( match[1] );
+
+                       // Filter out possible comments
+                       if ( match[1] === "*" ) {
+                               var tmp = [];
+
+                               for ( var i = 0; results[i]; i++ ) {
+                                       if ( results[i].nodeType === 1 ) {
+                                               tmp.push( results[i] );
+                                       }
+                               }
+
+                               results = tmp;
+                       }
+
+                       return results;
+               };
+       }
+
+       // Check to see if an attribute returns normalized href attributes
+       div.innerHTML = "<a href='#'></a>";
+
+       if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" &&
+                       div.firstChild.getAttribute("href") !== "#" ) {
+
+               Expr.attrHandle.href = function( elem ) {
+                       return elem.getAttribute( "href", 2 );
+               };
+       }
+
+       // release memory in IE
+       div = null;
+})();
+
+if ( document.querySelectorAll ) {
+       (function(){
+               var oldSizzle = Sizzle,
+                       div = document.createElement("div"),
+                       id = "__sizzle__";
+
+               div.innerHTML = "<p class='TEST'></p>";
+
+               // Safari can't handle uppercase or unicode characters when
+               // in quirks mode.
+               if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) {
+                       return;
+               }
+       
+               Sizzle = function( query, context, extra, seed ) {
+                       context = context || document;
+
+                       // Only use querySelectorAll on non-XML documents
+                       // (ID selectors don't work in non-HTML documents)
+                       if ( !seed && !Sizzle.isXML(context) ) {
+                               // See if we find a selector to speed up
+                               var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query );
+                               
+                               if ( match && (context.nodeType === 1 || context.nodeType === 9) ) {
+                                       // Speed-up: Sizzle("TAG")
+                                       if ( match[1] ) {
+                                               return makeArray( context.getElementsByTagName( query ), extra );
+                                       
+                                       // Speed-up: Sizzle(".CLASS")
+                                       } else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) {
+                                               return makeArray( context.getElementsByClassName( match[2] ), extra );
+                                       }
+                               }
+                               
+                               if ( context.nodeType === 9 ) {
+                                       // Speed-up: Sizzle("body")
+                                       // The body element only exists once, optimize finding it
+                                       if ( query === "body" && context.body ) {
+                                               return makeArray( [ context.body ], extra );
+                                               
+                                       // Speed-up: Sizzle("#ID")
+                                       } else if ( match && match[3] ) {
+                                               var elem = context.getElementById( match[3] );
+
+                                               // Check parentNode to catch when Blackberry 4.6 returns
+                                               // nodes that are no longer in the document #6963
+                                               if ( elem && elem.parentNode ) {
+                                                       // Handle the case where IE and Opera return items
+                                                       // by name instead of ID
+                                                       if ( elem.id === match[3] ) {
+                                                               return makeArray( [ elem ], extra );
+                                                       }
+                                                       
+                                               } else {
+                                                       return makeArray( [], extra );
+                                               }
+                                       }
+                                       
+                                       try {
+                                               return makeArray( context.querySelectorAll(query), extra );
+                                       } catch(qsaError) {}
+
+                               // qSA works strangely on Element-rooted queries
+                               // We can work around this by specifying an extra ID on the root
+                               // and working up from there (Thanks to Andrew Dupont for the technique)
+                               // IE 8 doesn't work on object elements
+                               } else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
+                                       var oldContext = context,
+                                               old = context.getAttribute( "id" ),
+                                               nid = old || id,
+                                               hasParent = context.parentNode,
+                                               relativeHierarchySelector = /^\s*[+~]/.test( query );
+
+                                       if ( !old ) {
+                                               context.setAttribute( "id", nid );
+                                       } else {
+                                               nid = nid.replace( /'/g, "\\$&" );
+                                       }
+                                       if ( relativeHierarchySelector && hasParent ) {
+                                               context = context.parentNode;
+                                       }
+
+                                       try {
+                                               if ( !relativeHierarchySelector || hasParent ) {
+                                                       return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra );
+                                               }
+
+                                       } catch(pseudoError) {
+                                       } finally {
+                                               if ( !old ) {
+                                                       oldContext.removeAttribute( "id" );
+                                               }
+                                       }
+                               }
+                       }
+               
+                       return oldSizzle(query, context, extra, seed);
+               };
+
+               for ( var prop in oldSizzle ) {
+                       Sizzle[ prop ] = oldSizzle[ prop ];
+               }
+
+               // release memory in IE
+               div = null;
+       })();
+}
+
+(function(){
+       var html = document.documentElement,
+               matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector;
+
+       if ( matches ) {
+               // Check to see if it's possible to do matchesSelector
+               // on a disconnected node (IE 9 fails this)
+               var disconnectedMatch = !matches.call( document.createElement( "div" ), "div" ),
+                       pseudoWorks = false;
+
+               try {
+                       // This should fail with an exception
+                       // Gecko does not error, returns false instead
+                       matches.call( document.documentElement, "[test!='']:sizzle" );
+       
+               } catch( pseudoError ) {
+                       pseudoWorks = true;
+               }
+
+               Sizzle.matchesSelector = function( node, expr ) {
+                       // Make sure that attribute selectors are quoted
+                       expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']");
+
+                       if ( !Sizzle.isXML( node ) ) {
+                               try { 
+                                       if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) {
+                                               var ret = matches.call( node, expr );
+
+                                               // IE 9's matchesSelector returns false on disconnected nodes
+                                               if ( ret || !disconnectedMatch ||
+                                                               // As well, disconnected nodes are said to be in a document
+                                                               // fragment in IE 9, so check for that
+                                                               node.document && node.document.nodeType !== 11 ) {
+                                                       return ret;
+                                               }
+                                       }
+                               } catch(e) {}
+                       }
+
+                       return Sizzle(expr, null, null, [node]).length > 0;
+               };
+       }
+})();
+
+(function(){
+       var div = document.createElement("div");
+
+       div.innerHTML = "<div class='test e'></div><div class='test'></div>";
+
+       // Opera can't find a second classname (in 9.6)
+       // Also, make sure that getElementsByClassName actually exists
+       if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) {
+               return;
+       }
+
+       // Safari caches class attributes, doesn't catch changes (in 3.2)
+       div.lastChild.className = "e";
+
+       if ( div.getElementsByClassName("e").length === 1 ) {
+               return;
+       }
+       
+       Expr.order.splice(1, 0, "CLASS");
+       Expr.find.CLASS = function( match, context, isXML ) {
+               if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) {
+                       return context.getElementsByClassName(match[1]);
+               }
+       };
+
+       // release memory in IE
+       div = null;
+})();
+
+function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
+       for ( var i = 0, l = checkSet.length; i < l; i++ ) {
+               var elem = checkSet[i];
+
+               if ( elem ) {
+                       var match = false;
+
+                       elem = elem[dir];
+
+                       while ( elem ) {
+                               if ( elem[ expando ] === doneName ) {
+                                       match = checkSet[elem.sizset];
+                                       break;
+                               }
+
+                               if ( elem.nodeType === 1 && !isXML ){
+                                       elem[ expando ] = doneName;
+                                       elem.sizset = i;
+                               }
+
+                               if ( elem.nodeName.toLowerCase() === cur ) {
+                                       match = elem;
+                                       break;
+                               }
+
+                               elem = elem[dir];
+                       }
+
+                       checkSet[i] = match;
+               }
+       }
+}
+
+function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
+       for ( var i = 0, l = checkSet.length; i < l; i++ ) {
+               var elem = checkSet[i];
+
+               if ( elem ) {
+                       var match = false;
+                       
+                       elem = elem[dir];
+
+                       while ( elem ) {
+                               if ( elem[ expando ] === doneName ) {
+                                       match = checkSet[elem.sizset];
+                                       break;
+                               }
+
+                               if ( elem.nodeType === 1 ) {
+                                       if ( !isXML ) {
+                                               elem[ expando ] = doneName;
+                                               elem.sizset = i;
+                                       }
+
+                                       if ( typeof cur !== "string" ) {
+                                               if ( elem === cur ) {
+                                                       match = true;
+                                                       break;
+                                               }
+
+                                       } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {
+                                               match = elem;
+                                               break;
+                                       }
+                               }
+
+                               elem = elem[dir];
+                       }
+
+                       checkSet[i] = match;
+               }
+       }
+}
+
+if ( document.documentElement.contains ) {
+       Sizzle.contains = function( a, b ) {
+               return a !== b && (a.contains ? a.contains(b) : true);
+       };
+
+} else if ( document.documentElement.compareDocumentPosition ) {
+       Sizzle.contains = function( a, b ) {
+               return !!(a.compareDocumentPosition(b) & 16);
+       };
+
+} else {
+       Sizzle.contains = function() {
+               return false;
+       };
+}
+
+Sizzle.isXML = function( elem ) {
+       // documentElement is verified for cases where it doesn't yet exist
+       // (such as loading iframes in IE - #4833) 
+       var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement;
+
+       return documentElement ? documentElement.nodeName !== "HTML" : false;
+};
+
+var posProcess = function( selector, context, seed ) {
+       var match,
+               tmpSet = [],
+               later = "",
+               root = context.nodeType ? [context] : context;
+
+       // Position selectors must be done after the filter
+       // And so must :not(positional) so we move all PSEUDOs to the end
+       while ( (match = Expr.match.PSEUDO.exec( selector )) ) {
+               later += match[0];
+               selector = selector.replace( Expr.match.PSEUDO, "" );
+       }
+
+       selector = Expr.relative[selector] ? selector + "*" : selector;
+
+       for ( var i = 0, l = root.length; i < l; i++ ) {
+               Sizzle( selector, root[i], tmpSet, seed );
+       }
+
+       return Sizzle.filter( later, tmpSet );
+};
+
+// EXPOSE
+// Override sizzle attribute retrieval
+Sizzle.attr = jQuery.attr;
+Sizzle.selectors.attrMap = {};
+jQuery.find = Sizzle;
+jQuery.expr = Sizzle.selectors;
+jQuery.expr[":"] = jQuery.expr.filters;
+jQuery.unique = Sizzle.uniqueSort;
+jQuery.text = Sizzle.getText;
+jQuery.isXMLDoc = Sizzle.isXML;
+jQuery.contains = Sizzle.contains;
+
+
+})();
+
+
+var runtil = /Until$/,
+       rparentsprev = /^(?:parents|prevUntil|prevAll)/,
+       // Note: This RegExp should be improved, or likely pulled from Sizzle
+       rmultiselector = /,/,
+       isSimple = /^.[^:#\[\.,]*$/,
+       slice = Array.prototype.slice,
+       POS = jQuery.expr.match.POS,
+       // methods guaranteed to produce a unique set when starting from a unique set
+       guaranteedUnique = {
+               children: true,
+               contents: true,
+               next: true,
+               prev: true
+       };
+
+jQuery.fn.extend({
+       find: function( selector ) {
+               var self = this,
+                       i, l;
+
+               if ( typeof selector !== "string" ) {
+                       return jQuery( selector ).filter(function() {
+                               for ( i = 0, l = self.length; i < l; i++ ) {
+                                       if ( jQuery.contains( self[ i ], this ) ) {
+                                               return true;
+                                       }
+                               }
+                       });
+               }
+
+               var ret = this.pushStack( "", "find", selector ),
+                       length, n, r;
+
+               for ( i = 0, l = this.length; i < l; i++ ) {
+                       length = ret.length;
+                       jQuery.find( selector, this[i], ret );
+
+                       if ( i > 0 ) {
+                               // Make sure that the results are unique
+                               for ( n = length; n < ret.length; n++ ) {
+                                       for ( r = 0; r < length; r++ ) {
+                                               if ( ret[r] === ret[n] ) {
+                                                       ret.splice(n--, 1);
+                                                       break;
+                                               }
+                                       }
+                               }
+                       }
+               }
+
+               return ret;
+       },
+
+       has: function( target ) {
+               var targets = jQuery( target );
+               return this.filter(function() {
+                       for ( var i = 0, l = targets.length; i < l; i++ ) {
+                               if ( jQuery.contains( this, targets[i] ) ) {
+                                       return true;
+                               }
+                       }
+               });
+       },
+
+       not: function( selector ) {
+               return this.pushStack( winnow(this, selector, false), "not", selector);
+       },
+
+       filter: function( selector ) {
+               return this.pushStack( winnow(this, selector, true), "filter", selector );
+       },
+
+       is: function( selector ) {
+               return !!selector && ( 
+                       typeof selector === "string" ?
+                               // If this is a positional selector, check membership in the returned set
+                               // so $("p:first").is("p:last") won't return true for a doc with two "p".
+                               POS.test( selector ) ? 
+                                       jQuery( selector, this.context ).index( this[0] ) >= 0 :
+                                       jQuery.filter( selector, this ).length > 0 :
+                               this.filter( selector ).length > 0 );
+       },
+
+       closest: function( selectors, context ) {
+               var ret = [], i, l, cur = this[0];
+               
+               // Array (deprecated as of jQuery 1.7)
+               if ( jQuery.isArray( selectors ) ) {
+                       var level = 1;
+
+                       while ( cur && cur.ownerDocument && cur !== context ) {
+                               for ( i = 0; i < selectors.length; i++ ) {
+
+                                       if ( jQuery( cur ).is( selectors[ i ] ) ) {
+                                               ret.push({ selector: selectors[ i ], elem: cur, level: level });
+                                       }
+                               }
+
+                               cur = cur.parentNode;
+                               level++;
+                       }
+
+                       return ret;
+               }
+
+               // String
+               var pos = POS.test( selectors ) || typeof selectors !== "string" ?
+                               jQuery( selectors, context || this.context ) :
+                               0;
+
+               for ( i = 0, l = this.length; i < l; i++ ) {
+                       cur = this[i];
+
+                       while ( cur ) {
+                               if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {
+                                       ret.push( cur );
+                                       break;
+
+                               } else {
+                                       cur = cur.parentNode;
+                                       if ( !cur || !cur.ownerDocument || cur === context || cur.nodeType === 11 ) {
+                                               break;
+                                       }
+                               }
+                       }
+               }
+
+               ret = ret.length > 1 ? jQuery.unique( ret ) : ret;
+
+               return this.pushStack( ret, "closest", selectors );
+       },
+
+       // Determine the position of an element within
+       // the matched set of elements
+       index: function( elem ) {
+
+               // No argument, return index in parent
+               if ( !elem ) {
+                       return ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1;
+               }
+
+               // index in selector
+               if ( typeof elem === "string" ) {
+                       return jQuery.inArray( this[0], jQuery( elem ) );
+               }
+
+               // Locate the position of the desired element
+               return jQuery.inArray(
+                       // If it receives a jQuery object, the first element is used
+                       elem.jquery ? elem[0] : elem, this );
+       },
+
+       add: function( selector, context ) {
+               var set = typeof selector === "string" ?
+                               jQuery( selector, context ) :
+                               jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),
+                       all = jQuery.merge( this.get(), set );
+
+               return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?
+                       all :
+                       jQuery.unique( all ) );
+       },
+
+       andSelf: function() {
+               return this.add( this.prevObject );
+       }
+});
+
+// A painfully simple check to see if an element is disconnected
+// from a document (should be improved, where feasible).
+function isDisconnected( node ) {
+       return !node || !node.parentNode || node.parentNode.nodeType === 11;
+}
+
+jQuery.each({
+       parent: function( elem ) {
+               var parent = elem.parentNode;
+               return parent && parent.nodeType !== 11 ? parent : null;
+       },
+       parents: function( elem ) {
+               return jQuery.dir( elem, "parentNode" );
+       },
+       parentsUntil: function( elem, i, until ) {
+               return jQuery.dir( elem, "parentNode", until );
+       },
+       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" );
+       },
+       nextUntil: function( elem, i, until ) {
+               return jQuery.dir( elem, "nextSibling", until );
+       },
+       prevUntil: function( elem, i, until ) {
+               return jQuery.dir( elem, "previousSibling", until );
+       },
+       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( until, selector ) {
+               var ret = jQuery.map( this, fn, until );
+
+               if ( !runtil.test( name ) ) {
+                       selector = until;
+               }
+
+               if ( selector && typeof selector === "string" ) {
+                       ret = jQuery.filter( selector, ret );
+               }
+
+               ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret;
+
+               if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) {
+                       ret = ret.reverse();
+               }
+
+               return this.pushStack( ret, name, slice.call( arguments ).join(",") );
+       };
+});
+
+jQuery.extend({
+       filter: function( expr, elems, not ) {
+               if ( not ) {
+                       expr = ":not(" + expr + ")";
+               }
+
+               return elems.length === 1 ?
+                       jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] :
+                       jQuery.find.matches(expr, elems);
+       },
+
+       dir: function( elem, dir, until ) {
+               var matched = [],
+                       cur = elem[ dir ];
+
+               while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
+                       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;
+       }
+});
+
+// Implement the identical functionality for filter and not
+function winnow( elements, qualifier, keep ) {
+
+       // Can't pass null or undefined to indexOf in Firefox 4
+       // Set to 0 to skip string check
+       qualifier = qualifier || 0;
+
+       if ( jQuery.isFunction( qualifier ) ) {
+               return jQuery.grep(elements, function( elem, i ) {
+                       var retVal = !!qualifier.call( elem, i, elem );
+                       return retVal === keep;
+               });
+
+       } else if ( qualifier.nodeType ) {
+               return jQuery.grep(elements, function( elem, i ) {
+                       return ( elem === qualifier ) === keep;
+               });
+
+       } else if ( typeof qualifier === "string" ) {
+               var filtered = jQuery.grep(elements, function( elem ) {
+                       return elem.nodeType === 1;
+               });
+
+               if ( isSimple.test( qualifier ) ) {
+                       return jQuery.filter(qualifier, filtered, !keep);
+               } else {
+                       qualifier = jQuery.filter( qualifier, filtered );
+               }
+       }
+
+       return jQuery.grep(elements, function( elem, i ) {
+               return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep;
+       });
+}
+
+
+
+
+function createSafeFragment( document ) {
+       var list = nodeNames.split( "|" ),
+       safeFrag = document.createDocumentFragment();
+
+       if ( safeFrag.createElement ) {
+               while ( list.length ) {
+                       safeFrag.createElement(
+                               list.pop()
+                       );
+               }
+       }
+       return safeFrag;
+}
+
+var nodeNames = "abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|" +
+               "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",
+       rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g,
+       rleadingWhitespace = /^\s+/,
+       rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,
+       rtagName = /<([\w:]+)/,
+       rtbody = /<tbody/i,
+       rhtml = /<|&#?\w+;/,
+       rnoInnerhtml = /<(?:script|style)/i,
+       rnocache = /<(?:script|object|embed|option|style)/i,
+       rnoshimcache = new RegExp("<(?:" + nodeNames + ")", "i"),
+       // checked="checked" or checked
+       rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
+       rscriptType = /\/(java|ecma)script/i,
+       rcleanScript = /^\s*<!(?:\[CDATA\[|\-\-)/,
+       wrapMap = {
+               option: [ 1, "<select multiple='multiple'>", "</select>" ],
+               legend: [ 1, "<fieldset>", "</fieldset>" ],
+               thead: [ 1, "<table>", "</table>" ],
+               tr: [ 2, "<table><tbody>", "</tbody></table>" ],
+               td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
+               col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
+               area: [ 1, "<map>", "</map>" ],
+               _default: [ 0, "", "" ]
+       },
+       safeFragment = createSafeFragment( document );
+
+wrapMap.optgroup = wrapMap.option;
+wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
+wrapMap.th = wrapMap.td;
+
+// IE can't serialize <link> and <script> tags normally
+if ( !jQuery.support.htmlSerialize ) {
+       wrapMap._default = [ 1, "div<div>", "</div>" ];
+}
+
+jQuery.fn.extend({
+       text: function( text ) {
+               if ( jQuery.isFunction(text) ) {
+                       return this.each(function(i) {
+                               var self = jQuery( this );
+
+                               self.text( text.call(this, i, self.text()) );
+                       });
+               }
+
+               if ( typeof text !== "object" && text !== undefined ) {
+                       return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) );
+               }
+
+               return jQuery.text( this );
+       },
+
+       wrapAll: function( html ) {
+               if ( jQuery.isFunction( html ) ) {
+                       return this.each(function(i) {
+                               jQuery(this).wrapAll( html.call(this, i) );
+                       });
+               }
+
+               if ( this[0] ) {
+                       // The elements to wrap the target around
+                       var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
+
+                       if ( this[0].parentNode ) {
+                               wrap.insertBefore( this[0] );
+                       }
+
+                       wrap.map(function() {
+                               var elem = this;
+
+                               while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
+                                       elem = elem.firstChild;
+                               }
+
+                               return elem;
+                       }).append( this );
+               }
+
+               return this;
+       },
+
+       wrapInner: function( html ) {
+               if ( jQuery.isFunction( html ) ) {
+                       return this.each(function(i) {
+                               jQuery(this).wrapInner( html.call(this, i) );
+                       });
+               }
+
+               return this.each(function() {
+                       var self = jQuery( this ),
+                               contents = self.contents();
+
+                       if ( contents.length ) {
+                               contents.wrapAll( html );
+
+                       } else {
+                               self.append( html );
+                       }
+               });
+       },
+
+       wrap: function( html ) {
+               var isFunction = jQuery.isFunction( html );
+
+               return this.each(function(i) {
+                       jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );
+               });
+       },
+
+       unwrap: function() {
+               return this.parent().each(function() {
+                       if ( !jQuery.nodeName( this, "body" ) ) {
+                               jQuery( this ).replaceWith( this.childNodes );
+                       }
+               }).end();
+       },
+
+       append: function() {
+               return this.domManip(arguments, true, function( elem ) {
+                       if ( this.nodeType === 1 ) {
+                               this.appendChild( elem );
+                       }
+               });
+       },
+
+       prepend: function() {
+               return this.domManip(arguments, true, function( elem ) {
+                       if ( this.nodeType === 1 ) {
+                               this.insertBefore( elem, this.firstChild );
+                       }
+               });
+       },
+
+       before: function() {
+               if ( this[0] && this[0].parentNode ) {
+                       return this.domManip(arguments, false, function( elem ) {
+                               this.parentNode.insertBefore( elem, this );
+                       });
+               } else if ( arguments.length ) {
+                       var set = jQuery.clean( arguments );
+                       set.push.apply( set, this.toArray() );
+                       return this.pushStack( set, "before", arguments );
+               }
+       },
+
+       after: function() {
+               if ( this[0] && this[0].parentNode ) {
+                       return this.domManip(arguments, false, function( elem ) {
+                               this.parentNode.insertBefore( elem, this.nextSibling );
+                       });
+               } else if ( arguments.length ) {
+                       var set = this.pushStack( this, "after", arguments );
+                       set.push.apply( set, jQuery.clean(arguments) );
+                       return set;
+               }
+       },
+
+       // keepData is for internal use only--do not document
+       remove: function( selector, keepData ) {
+               for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
+                       if ( !selector || jQuery.filter( selector, [ elem ] ).length ) {
+                               if ( !keepData && elem.nodeType === 1 ) {
+                                       jQuery.cleanData( elem.getElementsByTagName("*") );
+                                       jQuery.cleanData( [ elem ] );
+                               }
+
+                               if ( elem.parentNode ) {
+                                       elem.parentNode.removeChild( elem );
+                               }
+                       }
+               }
+
+               return this;
+       },
+
+       empty: function() {
+               for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
+                       // Remove element nodes and prevent memory leaks
+                       if ( elem.nodeType === 1 ) {
+                               jQuery.cleanData( elem.getElementsByTagName("*") );
+                       }
+
+                       // Remove any remaining nodes
+                       while ( elem.firstChild ) {
+                               elem.removeChild( elem.firstChild );
+                       }
+               }
+
+               return this;
+       },
+
+       clone: function( dataAndEvents, deepDataAndEvents ) {
+               dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
+               deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
+
+               return this.map( function () {
+                       return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
+               });
+       },
+
+       html: function( value ) {
+               if ( value === undefined ) {
+                       return this[0] && this[0].nodeType === 1 ?
+                               this[0].innerHTML.replace(rinlinejQuery, "") :
+                               null;
+
+               // See if we can take a shortcut and just use innerHTML
+               } else if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
+                       (jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value )) &&
+                       !wrapMap[ (rtagName.exec( value ) || ["", ""])[1].toLowerCase() ] ) {
+
+                       value = value.replace(rxhtmlTag, "<$1></$2>");
+
+                       try {
+                               for ( var i = 0, l = this.length; i < l; i++ ) {
+                                       // Remove element nodes and prevent memory leaks
+                                       if ( this[i].nodeType === 1 ) {
+                                               jQuery.cleanData( this[i].getElementsByTagName("*") );
+                                               this[i].innerHTML = value;
+                                       }
+                               }
+
+                       // If using innerHTML throws an exception, use the fallback method
+                       } catch(e) {
+                               this.empty().append( value );
+                       }
+
+               } else if ( jQuery.isFunction( value ) ) {
+                       this.each(function(i){
+                               var self = jQuery( this );
+
+                               self.html( value.call(this, i, self.html()) );
+                       });
+
+               } else {
+                       this.empty().append( value );
+               }
+
+               return this;
+       },
+
+       replaceWith: function( value ) {
+               if ( this[0] && this[0].parentNode ) {
+                       // Make sure that the elements are removed from the DOM before they are inserted
+                       // this can help fix replacing a parent with child elements
+                       if ( jQuery.isFunction( value ) ) {
+                               return this.each(function(i) {
+                                       var self = jQuery(this), old = self.html();
+                                       self.replaceWith( value.call( this, i, old ) );
+                               });
+                       }
+
+                       if ( typeof value !== "string" ) {
+                               value = jQuery( value ).detach();
+                       }
+
+                       return this.each(function() {
+                               var next = this.nextSibling,
+                                       parent = this.parentNode;
+
+                               jQuery( this ).remove();
+
+                               if ( next ) {
+                                       jQuery(next).before( value );
+                               } else {
+                                       jQuery(parent).append( value );
+                               }
+                       });
+               } else {
+                       return this.length ?
+                               this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value ) :
+                               this;
+               }
+       },
+
+       detach: function( selector ) {
+               return this.remove( selector, true );
+       },
+
+       domManip: function( args, table, callback ) {
+               var results, first, fragment, parent,
+                       value = args[0],
+                       scripts = [];
+
+               // We can't cloneNode fragments that contain checked, in WebKit
+               if ( !jQuery.support.checkClone && arguments.length === 3 && typeof value === "string" && rchecked.test( value ) ) {
+                       return this.each(function() {
+                               jQuery(this).domManip( args, table, callback, true );
+                       });
+               }
+
+               if ( jQuery.isFunction(value) ) {
+                       return this.each(function(i) {
+                               var self = jQuery(this);
+                               args[0] = value.call(this, i, table ? self.html() : undefined);
+                               self.domManip( args, table, callback );
+                       });
+               }
+
+               if ( this[0] ) {
+                       parent = value && value.parentNode;
+
+                       // If we're in a fragment, just use that instead of building a new one
+                       if ( jQuery.support.parentNode && parent && parent.nodeType === 11 && parent.childNodes.length === this.length ) {
+                               results = { fragment: parent };
+
+                       } else {
+                               results = jQuery.buildFragment( args, this, scripts );
+                       }
+
+                       fragment = results.fragment;
+
+                       if ( fragment.childNodes.length === 1 ) {
+                               first = fragment = fragment.firstChild;
+                       } else {
+                               first = fragment.firstChild;
+                       }
+
+                       if ( first ) {
+                               table = table && jQuery.nodeName( first, "tr" );
+
+                               for ( var i = 0, l = this.length, lastIndex = l - 1; i < l; i++ ) {
+                                       callback.call(
+                                               table ?
+                                                       root(this[i], first) :
+                                                       this[i],
+                                               // Make sure that we do not leak memory by inadvertently discarding
+                                               // the original fragment (which might have attached data) instead of
+                                               // using it; in addition, use the original fragment object for the last
+                                               // item instead of first because it can end up being emptied incorrectly
+                                               // in certain situations (Bug #8070).
+                                               // Fragments from the fragment cache must always be cloned and never used
+                                               // in place.
+                                               results.cacheable || ( l > 1 && i < lastIndex ) ?
+                                                       jQuery.clone( fragment, true, true ) :
+                                                       fragment
+                                       );
+                               }
+                       }
+
+                       if ( scripts.length ) {
+                               jQuery.each( scripts, evalScript );
+                       }
+               }
+
+               return this;
+       }
+});
+
+function root( elem, cur ) {
+       return jQuery.nodeName(elem, "table") ?
+               (elem.getElementsByTagName("tbody")[0] ||
+               elem.appendChild(elem.ownerDocument.createElement("tbody"))) :
+               elem;
+}
+
+function cloneCopyEvent( src, dest ) {
+
+       if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
+               return;
+       }
+
+       var type, i, l,
+               oldData = jQuery._data( src ),
+               curData = jQuery._data( dest, oldData ),
+               events = oldData.events;
+
+       if ( events ) {
+               delete curData.handle;
+               curData.events = {};
+
+               for ( type in events ) {
+                       for ( i = 0, l = events[ type ].length; i < l; i++ ) {
+                               jQuery.event.add( dest, type + ( events[ type ][ i ].namespace ? "." : "" ) + events[ type ][ i ].namespace, events[ type ][ i ], events[ type ][ i ].data );
+                       }
+               }
+       }
+
+       // make the cloned public data object a copy from the original
+       if ( curData.data ) {
+               curData.data = jQuery.extend( {}, curData.data );
+       }
+}
+
+function cloneFixAttributes( src, dest ) {
+       var nodeName;
+
+       // We do not need to do anything for non-Elements
+       if ( dest.nodeType !== 1 ) {
+               return;
+       }
+
+       // clearAttributes removes the attributes, which we don't want,
+       // but also removes the attachEvent events, which we *do* want
+       if ( dest.clearAttributes ) {
+               dest.clearAttributes();
+       }
+
+       // mergeAttributes, in contrast, only merges back on the
+       // original attributes, not the events
+       if ( dest.mergeAttributes ) {
+               dest.mergeAttributes( src );
+       }
+
+       nodeName = dest.nodeName.toLowerCase();
+
+       // IE6-8 fail to clone children inside object elements that use
+       // the proprietary classid attribute value (rather than the type
+       // attribute) to identify the type of content to display
+       if ( nodeName === "object" ) {
+               dest.outerHTML = src.outerHTML;
+
+       } else if ( nodeName === "input" && (src.type === "checkbox" || src.type === "radio") ) {
+               // IE6-8 fails to persist the checked state of a cloned checkbox
+               // or radio button. Worse, IE6-7 fail to give the cloned element
+               // a checked appearance if the defaultChecked value isn't also set
+               if ( src.checked ) {
+                       dest.defaultChecked = dest.checked = src.checked;
+               }
+
+               // IE6-7 get confused and end up setting the value of a cloned
+               // checkbox/radio button to an empty string instead of "on"
+               if ( dest.value !== src.value ) {
+                       dest.value = src.value;
+               }
+
+       // IE6-8 fails to return the selected option to the default selected
+       // state when cloning options
+       } else if ( nodeName === "option" ) {
+               dest.selected = src.defaultSelected;
+
+       // IE6-8 fails to set the defaultValue to the correct value when
+       // cloning other types of input fields
+       } else if ( nodeName === "input" || nodeName === "textarea" ) {
+               dest.defaultValue = src.defaultValue;
+       }
+
+       // Event data gets referenced instead of copied if the expando
+       // gets copied too
+       dest.removeAttribute( jQuery.expando );
+}
+
+jQuery.buildFragment = function( args, nodes, scripts ) {
+       var fragment, cacheable, cacheresults, doc,
+       first = args[ 0 ];
+
+       // nodes may contain either an explicit document object,
+       // a jQuery collection or context object.
+       // If nodes[0] contains a valid object to assign to doc
+       if ( nodes && nodes[0] ) {
+               doc = nodes[0].ownerDocument || nodes[0];
+       }
+
+       // Ensure that an attr object doesn't incorrectly stand in as a document object
+       // Chrome and Firefox seem to allow this to occur and will throw exception
+       // Fixes #8950
+       if ( !doc.createDocumentFragment ) {
+               doc = document;
+       }
+
+       // Only cache "small" (1/2 KB) HTML strings that are associated with the main document
+       // Cloning options loses the selected state, so don't cache them
+       // IE 6 doesn't like it when you put <object> or <embed> elements in a fragment
+       // Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache
+       // Lastly, IE6,7,8 will not correctly reuse cached fragments that were created from unknown elems #10501
+       if ( args.length === 1 && typeof first === "string" && first.length < 512 && doc === document &&
+               first.charAt(0) === "<" && !rnocache.test( first ) &&
+               (jQuery.support.checkClone || !rchecked.test( first )) &&
+               (jQuery.support.html5Clone || !rnoshimcache.test( first )) ) {
+
+               cacheable = true;
+
+               cacheresults = jQuery.fragments[ first ];
+               if ( cacheresults && cacheresults !== 1 ) {
+                       fragment = cacheresults;
+               }
+       }
+
+       if ( !fragment ) {
+               fragment = doc.createDocumentFragment();
+               jQuery.clean( args, doc, fragment, scripts );
+       }
+
+       if ( cacheable ) {
+               jQuery.fragments[ first ] = cacheresults ? fragment : 1;
+       }
+
+       return { fragment: fragment, cacheable: cacheable };
+};
+
+jQuery.fragments = {};
+
+jQuery.each({
+       appendTo: "append",
+       prependTo: "prepend",
+       insertBefore: "before",
+       insertAfter: "after",
+       replaceAll: "replaceWith"
+}, function( name, original ) {
+       jQuery.fn[ name ] = function( selector ) {
+               var ret = [],
+                       insert = jQuery( selector ),
+                       parent = this.length === 1 && this[0].parentNode;
+
+               if ( parent && parent.nodeType === 11 && parent.childNodes.length === 1 && insert.length === 1 ) {
+                       insert[ original ]( this[0] );
+                       return this;
+
+               } else {
+                       for ( var i = 0, l = insert.length; i < l; i++ ) {
+                               var elems = ( i > 0 ? this.clone(true) : this ).get();
+                               jQuery( insert[i] )[ original ]( elems );
+                               ret = ret.concat( elems );
+                       }
+
+                       return this.pushStack( ret, name, insert.selector );
+               }
+       };
+});
+
+function getAll( elem ) {
+       if ( typeof elem.getElementsByTagName !== "undefined" ) {
+               return elem.getElementsByTagName( "*" );
+
+       } else if ( typeof elem.querySelectorAll !== "undefined" ) {
+               return elem.querySelectorAll( "*" );
+
+       } else {
+               return [];
+       }
+}
+
+// Used in clean, fixes the defaultChecked property
+function fixDefaultChecked( elem ) {
+       if ( elem.type === "checkbox" || elem.type === "radio" ) {
+               elem.defaultChecked = elem.checked;
+       }
+}
+// Finds all inputs and passes them to fixDefaultChecked
+function findInputs( elem ) {
+       var nodeName = ( elem.nodeName || "" ).toLowerCase();
+       if ( nodeName === "input" ) {
+               fixDefaultChecked( elem );
+       // Skip scripts, get other children
+       } else if ( nodeName !== "script" && typeof elem.getElementsByTagName !== "undefined" ) {
+               jQuery.grep( elem.getElementsByTagName("input"), fixDefaultChecked );
+       }
+}
+
+// Derived From: http://www.iecss.com/shimprove/javascript/shimprove.1-0-1.js
+function shimCloneNode( elem ) {
+       var div = document.createElement( "div" );
+       safeFragment.appendChild( div );
+
+       div.innerHTML = elem.outerHTML;
+       return div.firstChild;
+}
+
+jQuery.extend({
+       clone: function( elem, dataAndEvents, deepDataAndEvents ) {
+               var srcElements,
+                       destElements,
+                       i,
+                       // IE<=8 does not properly clone detached, unknown element nodes
+                       clone = jQuery.support.html5Clone || !rnoshimcache.test( "<" + elem.nodeName ) ?
+                               elem.cloneNode( true ) :
+                               shimCloneNode( elem );
+
+               if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&
+                               (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {
+                       // IE copies events bound via attachEvent when using cloneNode.
+                       // Calling detachEvent on the clone will also remove the events
+                       // from the original. In order to get around this, we use some
+                       // proprietary methods to clear the events. Thanks to MooTools
+                       // guys for this hotness.
+
+                       cloneFixAttributes( elem, clone );
+
+                       // Using Sizzle here is crazy slow, so we use getElementsByTagName instead
+                       srcElements = getAll( elem );
+                       destElements = getAll( clone );
+
+                       // Weird iteration because IE will replace the length property
+                       // with an element if you are cloning the body and one of the
+                       // elements on the page has a name or id of "length"
+                       for ( i = 0; srcElements[i]; ++i ) {
+                               // Ensure that the destination node is not null; Fixes #9587
+                               if ( destElements[i] ) {
+                                       cloneFixAttributes( srcElements[i], destElements[i] );
+                               }
+                       }
+               }
+
+               // Copy the events from the original to the clone
+               if ( dataAndEvents ) {
+                       cloneCopyEvent( elem, clone );
+
+                       if ( deepDataAndEvents ) {
+                               srcElements = getAll( elem );
+                               destElements = getAll( clone );
+
+                               for ( i = 0; srcElements[i]; ++i ) {
+                                       cloneCopyEvent( srcElements[i], destElements[i] );
+                               }
+                       }
+               }
+
+               srcElements = destElements = null;
+
+               // Return the cloned set
+               return clone;
+       },
+
+       clean: function( elems, context, fragment, scripts ) {
+               var checkScriptType;
+
+               context = context || document;
+
+               // !context.createElement fails in IE with an error but returns typeof 'object'
+               if ( typeof context.createElement === "undefined" ) {
+                       context = context.ownerDocument || context[0] && context[0].ownerDocument || document;
+               }
+
+               var ret = [], j;
+
+               for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
+                       if ( typeof elem === "number" ) {
+                               elem += "";
+                       }
+
+                       if ( !elem ) {
+                               continue;
+                       }
+
+                       // Convert html string into DOM nodes
+                       if ( typeof elem === "string" ) {
+                               if ( !rhtml.test( elem ) ) {
+                                       elem = context.createTextNode( elem );
+                               } else {
+                                       // Fix "XHTML"-style tags in all browsers
+                                       elem = elem.replace(rxhtmlTag, "<$1></$2>");
+
+                                       // Trim whitespace, otherwise indexOf won't work as expected
+                                       var tag = ( rtagName.exec( elem ) || ["", ""] )[1].toLowerCase(),
+                                               wrap = wrapMap[ tag ] || wrapMap._default,
+                                               depth = wrap[0],
+                                               div = context.createElement("div");
+
+                                       // Append wrapper element to unknown element safe doc fragment
+                                       if ( context === document ) {
+                                               // Use the fragment we've already created for this document
+                                               safeFragment.appendChild( div );
+                                       } else {
+                                               // Use a fragment created with the owner document
+                                               createSafeFragment( context ).appendChild( div );
+                                       }
+
+                                       // Go to html and back, then peel off extra wrappers
+                                       div.innerHTML = wrap[1] + elem + wrap[2];
+
+                                       // Move to the right depth
+                                       while ( depth-- ) {
+                                               div = div.lastChild;
+                                       }
+
+                                       // Remove IE's autoinserted <tbody> from table fragments
+                                       if ( !jQuery.support.tbody ) {
+
+                                               // String was a <table>, *may* have spurious <tbody>
+                                               var hasBody = rtbody.test(elem),
+                                                       tbody = tag === "table" && !hasBody ?
+                                                               div.firstChild && div.firstChild.childNodes :
+
+                                                               // String was a bare <thead> or <tfoot>
+                                                               wrap[1] === "<table>" && !hasBody ?
+                                                                       div.childNodes :
+                                                                       [];
+
+                                               for ( j = tbody.length - 1; j >= 0 ; --j ) {
+                                                       if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) {
+                                                               tbody[ j ].parentNode.removeChild( tbody[ j ] );
+                                                       }
+                                               }
+                                       }
+
+                                       // IE completely kills leading whitespace when innerHTML is used
+                                       if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
+                                               div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild );
+                                       }
+
+                                       elem = div.childNodes;
+                               }
+                       }
+
+                       // Resets defaultChecked for any radios and checkboxes
+                       // about to be appended to the DOM in IE 6/7 (#8060)
+                       var len;
+                       if ( !jQuery.support.appendChecked ) {
+                               if ( elem[0] && typeof (len = elem.length) === "number" ) {
+                                       for ( j = 0; j < len; j++ ) {
+                                               findInputs( elem[j] );
+                                       }
+                               } else {
+                                       findInputs( elem );
+                               }
+                       }
+
+                       if ( elem.nodeType ) {
+                               ret.push( elem );
+                       } else {
+                               ret = jQuery.merge( ret, elem );
+                       }
+               }
+
+               if ( fragment ) {
+                       checkScriptType = function( elem ) {
+                               return !elem.type || rscriptType.test( elem.type );
+                       };
+                       for ( i = 0; ret[i]; i++ ) {
+                               if ( scripts && jQuery.nodeName( ret[i], "script" ) && (!ret[i].type || ret[i].type.toLowerCase() === "text/javascript") ) {
+                                       scripts.push( ret[i].parentNode ? ret[i].parentNode.removeChild( ret[i] ) : ret[i] );
+
+                               } else {
+                                       if ( ret[i].nodeType === 1 ) {
+                                               var jsTags = jQuery.grep( ret[i].getElementsByTagName( "script" ), checkScriptType );
+
+                                               ret.splice.apply( ret, [i + 1, 0].concat( jsTags ) );
+                                       }
+                                       fragment.appendChild( ret[i] );
+                               }
+                       }
+               }
+
+               return ret;
+       },
+
+       cleanData: function( elems ) {
+               var data, id,
+                       cache = jQuery.cache,
+                       special = jQuery.event.special,
+                       deleteExpando = jQuery.support.deleteExpando;
+
+               for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
+                       if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {
+                               continue;
+                       }
+
+                       id = elem[ jQuery.expando ];
+
+                       if ( id ) {
+                               data = cache[ id ];
+
+                               if ( data && data.events ) {
+                                       for ( var type in data.events ) {
+                                               if ( special[ type ] ) {
+                                                       jQuery.event.remove( elem, type );
+
+                                               // This is a shortcut to avoid jQuery.event.remove's overhead
+                                               } else {
+                                                       jQuery.removeEvent( elem, type, data.handle );
+                                               }
+                                       }
+
+                                       // Null the DOM reference to avoid IE6/7/8 leak (#7054)
+                                       if ( data.handle ) {
+                                               data.handle.elem = null;
+                                       }
+                               }
+
+                               if ( deleteExpando ) {
+                                       delete elem[ jQuery.expando ];
+
+                               } else if ( elem.removeAttribute ) {
+                                       elem.removeAttribute( jQuery.expando );
+                               }
+
+                               delete cache[ id ];
+                       }
+               }
+       }
+});
+
+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 || "" ).replace( rcleanScript, "/*$0*/" ) );
+       }
+
+       if ( elem.parentNode ) {
+               elem.parentNode.removeChild( elem );
+       }
+}
+
+
+
+
+var ralpha = /alpha\([^)]*\)/i,
+       ropacity = /opacity=([^)]*)/,
+       // fixed for IE9, see #8346
+       rupper = /([A-Z]|^ms)/g,
+       rnumpx = /^-?\d+(?:px)?$/i,
+       rnum = /^-?\d/,
+       rrelNum = /^([\-+])=([\-+.\de]+)/,
+
+       cssShow = { position: "absolute", visibility: "hidden", display: "block" },
+       cssWidth = [ "Left", "Right" ],
+       cssHeight = [ "Top", "Bottom" ],
+       curCSS,
+
+       getComputedStyle,
+       currentStyle;
+
+jQuery.fn.css = function( name, value ) {
+       // Setting 'undefined' is a no-op
+       if ( arguments.length === 2 && value === undefined ) {
+               return this;
+       }
+
+       return jQuery.access( this, name, value, true, function( elem, name, value ) {
+               return value !== undefined ?
+                       jQuery.style( elem, name, value ) :
+                       jQuery.css( elem, name );
+       });
+};
+
+jQuery.extend({
+       // Add in style property hooks for overriding the default
+       // behavior of getting and setting a style property
+       cssHooks: {
+               opacity: {
+                       get: function( elem, computed ) {
+                               if ( computed ) {
+                                       // We should always get a number back from opacity
+                                       var ret = curCSS( elem, "opacity", "opacity" );
+                                       return ret === "" ? "1" : ret;
+
+                               } else {
+                                       return elem.style.opacity;
+                               }
+                       }
+               }
+       },
+
+       // Exclude the following css properties to add px
+       cssNumber: {
+               "fillOpacity": true,
+               "fontWeight": true,
+               "lineHeight": true,
+               "opacity": true,
+               "orphans": true,
+               "widows": true,
+               "zIndex": true,
+               "zoom": true
+       },
+
+       // Add in properties whose names you wish to fix before
+       // setting or getting the value
+       cssProps: {
+               // normalize float css property
+               "float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat"
+       },
+
+       // Get and set the style property on a DOM Node
+       style: function( elem, name, value, extra ) {
+               // Don't set styles on text and comment nodes
+               if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
+                       return;
+               }
+
+               // Make sure that we're working with the right name
+               var ret, type, origName = jQuery.camelCase( name ),
+                       style = elem.style, hooks = jQuery.cssHooks[ origName ];
+
+               name = jQuery.cssProps[ origName ] || origName;
+
+               // Check if we're setting a value
+               if ( value !== undefined ) {
+                       type = typeof value;
+
+                       // convert relative number strings (+= or -=) to relative numbers. #7345
+                       if ( type === "string" && (ret = rrelNum.exec( value )) ) {
+                               value = ( +( ret[1] + 1) * +ret[2] ) + parseFloat( jQuery.css( elem, name ) );
+                               // Fixes bug #9237
+                               type = "number";
+                       }
+
+                       // Make sure that NaN and null values aren't set. See: #7116
+                       if ( value == null || type === "number" && isNaN( value ) ) {
+                               return;
+                       }
+
+                       // If a number was passed in, add 'px' to the (except for certain CSS properties)
+                       if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
+                               value += "px";
+                       }
+
+                       // If a hook was provided, use that value, otherwise just set the specified value
+                       if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value )) !== undefined ) {
+                               // Wrapped to prevent IE from throwing errors when 'invalid' values are provided
+                               // Fixes bug #5509
+                               try {
+                                       style[ name ] = value;
+                               } catch(e) {}
+                       }
+
+               } else {
+                       // If a hook was provided get the non-computed value from there
+                       if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
+                               return ret;
+                       }
+
+                       // Otherwise just get the value from the style object
+                       return style[ name ];
+               }
+       },
+
+       css: function( elem, name, extra ) {
+               var ret, hooks;
+
+               // Make sure that we're working with the right name
+               name = jQuery.camelCase( name );
+               hooks = jQuery.cssHooks[ name ];
+               name = jQuery.cssProps[ name ] || name;
+
+               // cssFloat needs a special treatment
+               if ( name === "cssFloat" ) {
+                       name = "float";
+               }
+
+               // If a hook was provided get the computed value from there
+               if ( hooks && "get" in hooks && (ret = hooks.get( elem, true, extra )) !== undefined ) {
+                       return ret;
+
+               // Otherwise, if a way to get the computed value exists, use that
+               } else if ( curCSS ) {
+                       return curCSS( elem, name );
+               }
+       },
+
+       // A method for quickly swapping in/out CSS properties to get correct calculations
+       swap: function( elem, options, callback ) {
+               var old = {};
+
+               // Remember the old values, and insert the new ones
+               for ( var name in options ) {
+                       old[ name ] = elem.style[ name ];
+                       elem.style[ name ] = options[ name ];
+               }
+
+               callback.call( elem );
+
+               // Revert the old values
+               for ( name in options ) {
+                       elem.style[ name ] = old[ name ];
+               }
+       }
+});
+
+// DEPRECATED, Use jQuery.css() instead
+jQuery.curCSS = jQuery.css;
+
+jQuery.each(["height", "width"], function( i, name ) {
+       jQuery.cssHooks[ name ] = {
+               get: function( elem, computed, extra ) {
+                       var val;
+
+                       if ( computed ) {
+                               if ( elem.offsetWidth !== 0 ) {
+                                       return getWH( elem, name, extra );
+                               } else {
+                                       jQuery.swap( elem, cssShow, function() {
+                                               val = getWH( elem, name, extra );
+                                       });
+                               }
+
+                               return val;
+                       }
+               },
+
+               set: function( elem, value ) {
+                       if ( rnumpx.test( value ) ) {
+                               // ignore negative width and height values #1599
+                               value = parseFloat( value );
+
+                               if ( value >= 0 ) {
+                                       return value + "px";
+                               }
+
+                       } else {
+                               return value;
+                       }
+               }
+       };
+});
+
+if ( !jQuery.support.opacity ) {
+       jQuery.cssHooks.opacity = {
+               get: function( elem, computed ) {
+                       // IE uses filters for opacity
+                       return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ?
+                               ( parseFloat( RegExp.$1 ) / 100 ) + "" :
+                               computed ? "1" : "";
+               },
+
+               set: function( elem, value ) {
+                       var style = elem.style,
+                               currentStyle = elem.currentStyle,
+                               opacity = jQuery.isNumeric( value ) ? "alpha(opacity=" + value * 100 + ")" : "",
+                               filter = currentStyle && currentStyle.filter || style.filter || "";
+
+                       // IE has trouble with opacity if it does not have layout
+                       // Force it by setting the zoom level
+                       style.zoom = 1;
+
+                       // if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652
+                       if ( value >= 1 && jQuery.trim( filter.replace( ralpha, "" ) ) === "" ) {
+
+                               // Setting style.filter to null, "" & " " still leave "filter:" in the cssText
+                               // if "filter:" is present at all, clearType is disabled, we want to avoid this
+                               // style.removeAttribute is IE Only, but so apparently is this code path...
+                               style.removeAttribute( "filter" );
+
+                               // if there there is no filter style applied in a css rule, we are done
+                               if ( currentStyle && !currentStyle.filter ) {
+                                       return;
+                               }
+                       }
+
+                       // otherwise, set new filter values
+                       style.filter = ralpha.test( filter ) ?
+                               filter.replace( ralpha, opacity ) :
+                               filter + " " + opacity;
+               }
+       };
+}
+
+jQuery(function() {
+       // This hook cannot be added until DOM ready because the support test
+       // for it is not run until after DOM ready
+       if ( !jQuery.support.reliableMarginRight ) {
+               jQuery.cssHooks.marginRight = {
+                       get: function( elem, computed ) {
+                               // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+                               // Work around by temporarily setting element display to inline-block
+                               var ret;
+                               jQuery.swap( elem, { "display": "inline-block" }, function() {
+                                       if ( computed ) {
+                                               ret = curCSS( elem, "margin-right", "marginRight" );
+                                       } else {
+                                               ret = elem.style.marginRight;
+                                       }
+                               });
+                               return ret;
+                       }
+               };
+       }
+});
+
+if ( document.defaultView && document.defaultView.getComputedStyle ) {
+       getComputedStyle = function( elem, name ) {
+               var ret, defaultView, computedStyle;
+
+               name = name.replace( rupper, "-$1" ).toLowerCase();
+
+               if ( (defaultView = elem.ownerDocument.defaultView) &&
+                               (computedStyle = defaultView.getComputedStyle( elem, null )) ) {
+                       ret = computedStyle.getPropertyValue( name );
+                       if ( ret === "" && !jQuery.contains( elem.ownerDocument.documentElement, elem ) ) {
+                               ret = jQuery.style( elem, name );
+                       }
+               }
+
+               return ret;
+       };
+}
+
+if ( document.documentElement.currentStyle ) {
+       currentStyle = function( elem, name ) {
+               var left, rsLeft, uncomputed,
+                       ret = elem.currentStyle && elem.currentStyle[ name ],
+                       style = elem.style;
+
+               // Avoid setting ret to empty string here
+               // so we don't default to auto
+               if ( ret === null && style && (uncomputed = style[ name ]) ) {
+                       ret = uncomputed;
+               }
+
+               // From the awesome hack by Dean Edwards
+               // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
+
+               // If we're not dealing with a regular pixel number
+               // but a number that has a weird ending, we need to convert it to pixels
+               if ( !rnumpx.test( ret ) && rnum.test( ret ) ) {
+
+                       // Remember the original values
+                       left = style.left;
+                       rsLeft = elem.runtimeStyle && elem.runtimeStyle.left;
+
+                       // Put in the new values to get a computed value out
+                       if ( rsLeft ) {
+                               elem.runtimeStyle.left = elem.currentStyle.left;
+                       }
+                       style.left = name === "fontSize" ? "1em" : ( ret || 0 );
+                       ret = style.pixelLeft + "px";
+
+                       // Revert the changed values
+                       style.left = left;
+                       if ( rsLeft ) {
+                               elem.runtimeStyle.left = rsLeft;
+                       }
+               }
+
+               return ret === "" ? "auto" : ret;
+       };
+}
+
+curCSS = getComputedStyle || currentStyle;
+
+function getWH( elem, name, extra ) {
+
+       // Start with offset property
+       var val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
+               which = name === "width" ? cssWidth : cssHeight,
+               i = 0,
+               len = which.length;
+
+       if ( val > 0 ) {
+               if ( extra !== "border" ) {
+                       for ( ; i < len; i++ ) {
+                               if ( !extra ) {
+                                       val -= parseFloat( jQuery.css( elem, "padding" + which[ i ] ) ) || 0;
+                               }
+                               if ( extra === "margin" ) {
+                                       val += parseFloat( jQuery.css( elem, extra + which[ i ] ) ) || 0;
+                               } else {
+                                       val -= parseFloat( jQuery.css( elem, "border" + which[ i ] + "Width" ) ) || 0;
+                               }
+                       }
+               }
+
+               return val + "px";
+       }
+
+       // Fall back to computed then uncomputed css if necessary
+       val = curCSS( elem, name, name );
+       if ( val < 0 || val == null ) {
+               val = elem.style[ name ] || 0;
+       }
+       // Normalize "", auto, and prepare for extra
+       val = parseFloat( val ) || 0;
+
+       // Add padding, border, margin
+       if ( extra ) {
+               for ( ; i < len; i++ ) {
+                       val += parseFloat( jQuery.css( elem, "padding" + which[ i ] ) ) || 0;
+                       if ( extra !== "padding" ) {
+                               val += parseFloat( jQuery.css( elem, "border" + which[ i ] + "Width" ) ) || 0;
+                       }
+                       if ( extra === "margin" ) {
+                               val += parseFloat( jQuery.css( elem, extra + which[ i ] ) ) || 0;
+                       }
+               }
+       }
+
+       return val + "px";
+}
+
+if ( jQuery.expr && jQuery.expr.filters ) {
+       jQuery.expr.filters.hidden = function( elem ) {
+               var width = elem.offsetWidth,
+                       height = elem.offsetHeight;
+
+               return ( width === 0 && height === 0 ) || (!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || jQuery.css( elem, "display" )) === "none");
+       };
+
+       jQuery.expr.filters.visible = function( elem ) {
+               return !jQuery.expr.filters.hidden( elem );
+       };
+}
+
+
+
+
+var r20 = /%20/g,
+       rbracket = /\[\]$/,
+       rCRLF = /\r?\n/g,
+       rhash = /#.*$/,
+       rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL
+       rinput = /^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,
+       // #7653, #8125, #8152: local protocol detection
+       rlocalProtocol = /^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,
+       rnoContent = /^(?:GET|HEAD)$/,
+       rprotocol = /^\/\//,
+       rquery = /\?/,
+       rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
+       rselectTextarea = /^(?:select|textarea)/i,
+       rspacesAjax = /\s+/,
+       rts = /([?&])_=[^&]*/,
+       rurl = /^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,
+
+       // Keep a copy of the old load method
+       _load = jQuery.fn.load,
+
+       /* Prefilters
+        * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
+        * 2) These are called:
+        *    - BEFORE asking for a transport
+        *    - AFTER param serialization (s.data is a string if s.processData is true)
+        * 3) key is the dataType
+        * 4) the catchall symbol "*" can be used
+        * 5) execution will start with transport dataType and THEN continue down to "*" if needed
+        */
+       prefilters = {},
+
+       /* Transports bindings
+        * 1) key is the dataType
+        * 2) the catchall symbol "*" can be used
+        * 3) selection will start with transport dataType and THEN go to "*" if needed
+        */
+       transports = {},
+
+       // Document location
+       ajaxLocation,
+
+       // Document location segments
+       ajaxLocParts,
+
+       // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
+       allTypes = ["*/"] + ["*"];
+
+// #8138, IE may throw an exception when accessing
+// a field from window.location if document.domain has been set
+try {
+       ajaxLocation = location.href;
+} catch( e ) {
+       // Use the href attribute of an A element
+       // since IE will modify it given document.location
+       ajaxLocation = document.createElement( "a" );
+       ajaxLocation.href = "";
+       ajaxLocation = ajaxLocation.href;
+}
+
+// Segment location into parts
+ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
+
+// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
+function addToPrefiltersOrTransports( structure ) {
+
+       // dataTypeExpression is optional and defaults to "*"
+       return function( dataTypeExpression, func ) {
+
+               if ( typeof dataTypeExpression !== "string" ) {
+                       func = dataTypeExpression;
+                       dataTypeExpression = "*";
+               }
+
+               if ( jQuery.isFunction( func ) ) {
+                       var dataTypes = dataTypeExpression.toLowerCase().split( rspacesAjax ),
+                               i = 0,
+                               length = dataTypes.length,
+                               dataType,
+                               list,
+                               placeBefore;
+
+                       // For each dataType in the dataTypeExpression
+                       for ( ; i < length; i++ ) {
+                               dataType = dataTypes[ i ];
+                               // We control if we're asked to add before
+                               // any existing element
+                               placeBefore = /^\+/.test( dataType );
+                               if ( placeBefore ) {
+                                       dataType = dataType.substr( 1 ) || "*";
+                               }
+                               list = structure[ dataType ] = structure[ dataType ] || [];
+                               // then we add to the structure accordingly
+                               list[ placeBefore ? "unshift" : "push" ]( func );
+                       }
+               }
+       };
+}
+
+// Base inspection function for prefilters and transports
+function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR,
+               dataType /* internal */, inspected /* internal */ ) {
+
+       dataType = dataType || options.dataTypes[ 0 ];
+       inspected = inspected || {};
+
+       inspected[ dataType ] = true;
+
+       var list = structure[ dataType ],
+               i = 0,
+               length = list ? list.length : 0,
+               executeOnly = ( structure === prefilters ),
+               selection;
+
+       for ( ; i < length && ( executeOnly || !selection ); i++ ) {
+               selection = list[ i ]( options, originalOptions, jqXHR );
+               // If we got redirected to another dataType
+               // we try there if executing only and not done already
+               if ( typeof selection === "string" ) {
+                       if ( !executeOnly || inspected[ selection ] ) {
+                               selection = undefined;
+                       } else {
+                               options.dataTypes.unshift( selection );
+                               selection = inspectPrefiltersOrTransports(
+                                               structure, options, originalOptions, jqXHR, selection, inspected );
+                       }
+               }
+       }
+       // If we're only executing or nothing was selected
+       // we try the catchall dataType if not done already
+       if ( ( executeOnly || !selection ) && !inspected[ "*" ] ) {
+               selection = inspectPrefiltersOrTransports(
+                               structure, options, originalOptions, jqXHR, "*", inspected );
+       }
+       // unnecessary when only executing (prefilters)
+       // but it'll be ignored by the caller in that case
+       return selection;
+}
+
+// A special extend for ajax options
+// that takes "flat" options (not to be deep extended)
+// Fixes #9887
+function ajaxExtend( target, src ) {
+       var key, deep,
+               flatOptions = jQuery.ajaxSettings.flatOptions || {};
+       for ( key in src ) {
+               if ( src[ key ] !== undefined ) {
+                       ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
+               }
+       }
+       if ( deep ) {
+               jQuery.extend( true, target, deep );
+       }
+}
+
+jQuery.fn.extend({
+       load: function( url, params, callback ) {
+               if ( typeof url !== "string" && _load ) {
+                       return _load.apply( this, arguments );
+
+               // Don't do a request if no elements are being requested
+               } else if ( !this.length ) {
+                       return this;
+               }
+
+               var off = url.indexOf( " " );
+               if ( off >= 0 ) {
+                       var selector = url.slice( off, url.length );
+                       url = url.slice( 0, off );
+               }
+
+               // Default to a GET request
+               var type = "GET";
+
+               // If the second parameter was provided
+               if ( params ) {
+                       // If it's a function
+                       if ( jQuery.isFunction( params ) ) {
+                               // We assume that it's the callback
+                               callback = params;
+                               params = undefined;
+
+                       // Otherwise, build a param string
+                       } else if ( typeof params === "object" ) {
+                               params = jQuery.param( params, jQuery.ajaxSettings.traditional );
+                               type = "POST";
+                       }
+               }
+
+               var self = this;
+
+               // Request the remote document
+               jQuery.ajax({
+                       url: url,
+                       type: type,
+                       dataType: "html",
+                       data: params,
+                       // Complete callback (responseText is used internally)
+                       complete: function( jqXHR, status, responseText ) {
+                               // Store the response as specified by the jqXHR object
+                               responseText = jqXHR.responseText;
+                               // If successful, inject the HTML into all the matched elements
+                               if ( jqXHR.isResolved() ) {
+                                       // #4825: Get the actual response in case
+                                       // a dataFilter is present in ajaxSettings
+                                       jqXHR.done(function( r ) {
+                                               responseText = r;
+                                       });
+                                       // See if a selector was specified
+                                       self.html( selector ?
+                                               // Create a dummy div to hold the results
+                                               jQuery("<div>")
+                                                       // inject the contents of the document in, removing the scripts
+                                                       // to avoid any 'Permission Denied' errors in IE
+                                                       .append(responseText.replace(rscript, ""))
+
+                                                       // Locate the specified elements
+                                                       .find(selector) :
+
+                                               // If not, just inject the full result
+                                               responseText );
+                               }
+
+                               if ( callback ) {
+                                       self.each( callback, [ responseText, status, jqXHR ] );
+                               }
+                       }
+               });
+
+               return this;
+       },
+
+       serialize: function() {
+               return jQuery.param( this.serializeArray() );
+       },
+
+       serializeArray: function() {
+               return this.map(function(){
+                       return this.elements ? jQuery.makeArray( this.elements ) : this;
+               })
+               .filter(function(){
+                       return this.name && !this.disabled &&
+                               ( this.checked || rselectTextarea.test( this.nodeName ) ||
+                                       rinput.test( this.type ) );
+               })
+               .map(function( i, elem ){
+                       var val = jQuery( this ).val();
+
+                       return val == null ?
+                               null :
+                               jQuery.isArray( val ) ?
+                                       jQuery.map( val, function( val, i ){
+                                               return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+                                       }) :
+                                       { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+               }).get();
+       }
+});
+
+// Attach a bunch of functions for handling common AJAX events
+jQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split( " " ), function( i, o ){
+       jQuery.fn[ o ] = function( f ){
+               return this.on( o, f );
+       };
+});
+
+jQuery.each( [ "get", "post" ], function( i, method ) {
+       jQuery[ method ] = function( url, data, callback, type ) {
+               // shift arguments if data argument was omitted
+               if ( jQuery.isFunction( data ) ) {
+                       type = type || callback;
+                       callback = data;
+                       data = undefined;
+               }
+
+               return jQuery.ajax({
+                       type: method,
+                       url: url,
+                       data: data,
+                       success: callback,
+                       dataType: type
+               });
+       };
+});
+
+jQuery.extend({
+
+       getScript: function( url, callback ) {
+               return jQuery.get( url, undefined, callback, "script" );
+       },
+
+       getJSON: function( url, data, callback ) {
+               return jQuery.get( url, data, callback, "json" );
+       },
+
+       // Creates a full fledged settings object into target
+       // with both ajaxSettings and settings fields.
+       // If target is omitted, writes into ajaxSettings.
+       ajaxSetup: function( target, settings ) {
+               if ( settings ) {
+                       // Building a settings object
+                       ajaxExtend( target, jQuery.ajaxSettings );
+               } else {
+                       // Extending ajaxSettings
+                       settings = target;
+                       target = jQuery.ajaxSettings;
+               }
+               ajaxExtend( target, settings );
+               return target;
+       },
+
+       ajaxSettings: {
+               url: ajaxLocation,
+               isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
+               global: true,
+               type: "GET",
+               contentType: "application/x-www-form-urlencoded",
+               processData: true,
+               async: true,
+               /*
+               timeout: 0,
+               data: null,
+               dataType: null,
+               username: null,
+               password: null,
+               cache: null,
+               traditional: false,
+               headers: {},
+               */
+
+               accepts: {
+                       xml: "application/xml, text/xml",
+                       html: "text/html",
+                       text: "text/plain",
+                       json: "application/json, text/javascript",
+                       "*": allTypes
+               },
+
+               contents: {
+                       xml: /xml/,
+                       html: /html/,
+                       json: /json/
+               },
+
+               responseFields: {
+                       xml: "responseXML",
+                       text: "responseText"
+               },
+
+               // List of data converters
+               // 1) key format is "source_type destination_type" (a single space in-between)
+               // 2) the catchall symbol "*" can be used for source_type
+               converters: {
+
+                       // Convert anything to text
+                       "* text": window.String,
+
+                       // Text to html (true = no transformation)
+                       "text html": true,
+
+                       // Evaluate text as a json expression
+                       "text json": jQuery.parseJSON,
+
+                       // Parse text as xml
+                       "text xml": jQuery.parseXML
+               },
+
+               // For options that shouldn't be deep extended:
+               // you can add your own custom options here if
+               // and when you create one that shouldn't be
+               // deep extended (see ajaxExtend)
+               flatOptions: {
+                       context: true,
+                       url: true
+               }
+       },
+
+       ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
+       ajaxTransport: addToPrefiltersOrTransports( transports ),
+
+       // Main method
+       ajax: function( url, options ) {
+
+               // If url is an object, simulate pre-1.5 signature
+               if ( typeof url === "object" ) {
+                       options = url;
+                       url = undefined;
+               }
+
+               // Force options to be an object
+               options = options || {};
+
+               var // Create the final options object
+                       s = jQuery.ajaxSetup( {}, options ),
+                       // Callbacks context
+                       callbackContext = s.context || s,
+                       // Context for global events
+                       // It's the callbackContext if one was provided in the options
+                       // and if it's a DOM node or a jQuery collection
+                       globalEventContext = callbackContext !== s &&
+                               ( callbackContext.nodeType || callbackContext instanceof jQuery ) ?
+                                               jQuery( callbackContext ) : jQuery.event,
+                       // Deferreds
+                       deferred = jQuery.Deferred(),
+                       completeDeferred = jQuery.Callbacks( "once memory" ),
+                       // Status-dependent callbacks
+                       statusCode = s.statusCode || {},
+                       // ifModified key
+                       ifModifiedKey,
+                       // Headers (they are sent all at once)
+                       requestHeaders = {},
+                       requestHeadersNames = {},
+                       // Response headers
+                       responseHeadersString,
+                       responseHeaders,
+                       // transport
+                       transport,
+                       // timeout handle
+                       timeoutTimer,
+                       // Cross-domain detection vars
+                       parts,
+                       // The jqXHR state
+                       state = 0,
+                       // To know if global events are to be dispatched
+                       fireGlobals,
+                       // Loop variable
+                       i,
+                       // Fake xhr
+                       jqXHR = {
+
+                               readyState: 0,
+
+                               // Caches the header
+                               setRequestHeader: function( name, value ) {
+                                       if ( !state ) {
+                                               var lname = name.toLowerCase();
+                                               name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
+                                               requestHeaders[ name ] = value;
+                                       }
+                                       return this;
+                               },
+
+                               // Raw string
+                               getAllResponseHeaders: function() {
+                                       return state === 2 ? responseHeadersString : null;
+                               },
+
+                               // Builds headers hashtable if needed
+                               getResponseHeader: function( key ) {
+                                       var match;
+                                       if ( state === 2 ) {
+                                               if ( !responseHeaders ) {
+                                                       responseHeaders = {};
+                                                       while( ( match = rheaders.exec( responseHeadersString ) ) ) {
+                                                               responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
+                                                       }
+                                               }
+                                               match = responseHeaders[ key.toLowerCase() ];
+                                       }
+                                       return match === undefined ? null : match;
+                               },
+
+                               // Overrides response content-type header
+                               overrideMimeType: function( type ) {
+                                       if ( !state ) {
+                                               s.mimeType = type;
+                                       }
+                                       return this;
+                               },
+
+                               // Cancel the request
+                               abort: function( statusText ) {
+                                       statusText = statusText || "abort";
+                                       if ( transport ) {
+                                               transport.abort( statusText );
+                                       }
+                                       done( 0, statusText );
+                                       return this;
+                               }
+                       };
+
+               // Callback for when everything is done
+               // It is defined here because jslint complains if it is declared
+               // at the end of the function (which would be more logical and readable)
+               function done( status, nativeStatusText, responses, headers ) {
+
+                       // Called once
+                       if ( state === 2 ) {
+                               return;
+                       }
+
+                       // State is "done" now
+                       state = 2;
+
+                       // Clear timeout if it exists
+                       if ( timeoutTimer ) {
+                               clearTimeout( timeoutTimer );
+                       }
+
+                       // Dereference transport for early garbage collection
+                       // (no matter how long the jqXHR object will be used)
+                       transport = undefined;
+
+                       // Cache response headers
+                       responseHeadersString = headers || "";
+
+                       // Set readyState
+                       jqXHR.readyState = status > 0 ? 4 : 0;
+
+                       var isSuccess,
+                               success,
+                               error,
+                               statusText = nativeStatusText,
+                               response = responses ? ajaxHandleResponses( s, jqXHR, responses ) : undefined,
+                               lastModified,
+                               etag;
+
+                       // If successful, handle type chaining
+                       if ( status >= 200 && status < 300 || status === 304 ) {
+
+                               // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+                               if ( s.ifModified ) {
+
+                                       if ( ( lastModified = jqXHR.getResponseHeader( "Last-Modified" ) ) ) {
+                                               jQuery.lastModified[ ifModifiedKey ] = lastModified;
+                                       }
+                                       if ( ( etag = jqXHR.getResponseHeader( "Etag" ) ) ) {
+                                               jQuery.etag[ ifModifiedKey ] = etag;
+                                       }
+                               }
+
+                               // If not modified
+                               if ( status === 304 ) {
+
+                                       statusText = "notmodified";
+                                       isSuccess = true;
+
+                               // If we have data
+                               } else {
+
+                                       try {
+                                               success = ajaxConvert( s, response );
+                                               statusText = "success";
+                                               isSuccess = true;
+                                       } catch(e) {
+                                               // We have a parsererror
+                                               statusText = "parsererror";
+                                               error = e;
+                                       }
+                               }
+                       } else {
+                               // We extract error from statusText
+                               // then normalize statusText and status for non-aborts
+                               error = statusText;
+                               if ( !statusText || status ) {
+                                       statusText = "error";
+                                       if ( status < 0 ) {
+                                               status = 0;
+                                       }
+                               }
+                       }
+
+                       // Set data for the fake xhr object
+                       jqXHR.status = status;
+                       jqXHR.statusText = "" + ( nativeStatusText || statusText );
+
+                       // Success/Error
+                       if ( isSuccess ) {
+                               deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
+                       } else {
+                               deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
+                       }
+
+                       // Status-dependent callbacks
+                       jqXHR.statusCode( statusCode );
+                       statusCode = undefined;
+
+                       if ( fireGlobals ) {
+                               globalEventContext.trigger( "ajax" + ( isSuccess ? "Success" : "Error" ),
+                                               [ jqXHR, s, isSuccess ? success : error ] );
+                       }
+
+                       // Complete
+                       completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
+
+                       if ( fireGlobals ) {
+                               globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
+                               // Handle the global AJAX counter
+                               if ( !( --jQuery.active ) ) {
+                                       jQuery.event.trigger( "ajaxStop" );
+                               }
+                       }
+               }
+
+               // Attach deferreds
+               deferred.promise( jqXHR );
+               jqXHR.success = jqXHR.done;
+               jqXHR.error = jqXHR.fail;
+               jqXHR.complete = completeDeferred.add;
+
+               // Status-dependent callbacks
+               jqXHR.statusCode = function( map ) {
+                       if ( map ) {
+                               var tmp;
+                               if ( state < 2 ) {
+                                       for ( tmp in map ) {
+                                               statusCode[ tmp ] = [ statusCode[tmp], map[tmp] ];
+                                       }
+                               } else {
+                                       tmp = map[ jqXHR.status ];
+                                       jqXHR.then( tmp, tmp );
+                               }
+                       }
+                       return this;
+               };
+
+               // Remove hash character (#7531: and string promotion)
+               // Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
+               // We also use the url parameter if available
+               s.url = ( ( url || s.url ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
+
+               // Extract dataTypes list
+               s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().split( rspacesAjax );
+
+               // Determine if a cross-domain request is in order
+               if ( s.crossDomain == null ) {
+                       parts = rurl.exec( s.url.toLowerCase() );
+                       s.crossDomain = !!( parts &&
+                               ( parts[ 1 ] != ajaxLocParts[ 1 ] || parts[ 2 ] != ajaxLocParts[ 2 ] ||
+                                       ( parts[ 3 ] || ( parts[ 1 ] === "http:" ? 80 : 443 ) ) !=
+                                               ( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? 80 : 443 ) ) )
+                       );
+               }
+
+               // Convert data if not already a string
+               if ( s.data && s.processData && typeof s.data !== "string" ) {
+                       s.data = jQuery.param( s.data, s.traditional );
+               }
+
+               // Apply prefilters
+               inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
+
+               // If request was aborted inside a prefiler, stop there
+               if ( state === 2 ) {
+                       return false;
+               }
+
+               // We can fire global events as of now if asked to
+               fireGlobals = s.global;
+
+               // Uppercase the type
+               s.type = s.type.toUpperCase();
+
+               // Determine if request has content
+               s.hasContent = !rnoContent.test( s.type );
+
+               // Watch for a new set of requests
+               if ( fireGlobals && jQuery.active++ === 0 ) {
+                       jQuery.event.trigger( "ajaxStart" );
+               }
+
+               // More options handling for requests with no content
+               if ( !s.hasContent ) {
+
+                       // If data is available, append data to url
+                       if ( s.data ) {
+                               s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.data;
+                               // #9682: remove data so that it's not used in an eventual retry
+                               delete s.data;
+                       }
+
+                       // Get ifModifiedKey before adding the anti-cache parameter
+                       ifModifiedKey = s.url;
+
+                       // Add anti-cache in url if needed
+                       if ( s.cache === false ) {
+
+                               var ts = jQuery.now(),
+                                       // try replacing _= if it is there
+                                       ret = s.url.replace( rts, "$1_=" + ts );
+
+                               // if nothing was replaced, add timestamp to the end
+                               s.url = ret + ( ( ret === s.url ) ? ( rquery.test( s.url ) ? "&" : "?" ) + "_=" + ts : "" );
+                       }
+               }
+
+               // Set the correct header, if data is being sent
+               if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
+                       jqXHR.setRequestHeader( "Content-Type", s.contentType );
+               }
+
+               // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+               if ( s.ifModified ) {
+                       ifModifiedKey = ifModifiedKey || s.url;
+                       if ( jQuery.lastModified[ ifModifiedKey ] ) {
+                               jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ ifModifiedKey ] );
+                       }
+                       if ( jQuery.etag[ ifModifiedKey ] ) {
+                               jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ ifModifiedKey ] );
+                       }
+               }
+
+               // Set the Accepts header for the server, depending on the dataType
+               jqXHR.setRequestHeader(
+                       "Accept",
+                       s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?
+                               s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
+                               s.accepts[ "*" ]
+               );
+
+               // Check for headers option
+               for ( i in s.headers ) {
+                       jqXHR.setRequestHeader( i, s.headers[ i ] );
+               }
+
+               // Allow custom headers/mimetypes and early abort
+               if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
+                               // Abort if not done already
+                               jqXHR.abort();
+                               return false;
+
+               }
+
+               // Install callbacks on deferreds
+               for ( i in { success: 1, error: 1, complete: 1 } ) {
+                       jqXHR[ i ]( s[ i ] );
+               }
+
+               // Get transport
+               transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
+
+               // If no transport, we auto-abort
+               if ( !transport ) {
+                       done( -1, "No Transport" );
+               } else {
+                       jqXHR.readyState = 1;
+                       // Send global event
+                       if ( fireGlobals ) {
+                               globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
+                       }
+                       // Timeout
+                       if ( s.async && s.timeout > 0 ) {
+                               timeoutTimer = setTimeout( function(){
+                                       jqXHR.abort( "timeout" );
+                               }, s.timeout );
+                       }
+
+                       try {
+                               state = 1;
+                               transport.send( requestHeaders, done );
+                       } catch (e) {
+                               // Propagate exception as error if not done
+                               if ( state < 2 ) {
+                                       done( -1, e );
+                               // Simply rethrow otherwise
+                               } else {
+                                       throw e;
+                               }
+                       }
+               }
+
+               return jqXHR;
+       },
+
+       // Serialize an array of form elements or a set of
+       // key/values into a query string
+       param: function( a, traditional ) {
+               var s = [],
+                       add = function( key, value ) {
+                               // If value is a function, invoke it and return its value
+                               value = jQuery.isFunction( value ) ? value() : value;
+                               s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
+                       };
+
+               // Set traditional to true for jQuery <= 1.3.2 behavior.
+               if ( traditional === undefined ) {
+                       traditional = jQuery.ajaxSettings.traditional;
+               }
+
+               // If an array was passed in, assume that it is an array of form elements.
+               if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
+                       // Serialize the form elements
+                       jQuery.each( a, function() {
+                               add( this.name, this.value );
+                       });
+
+               } else {
+                       // If traditional, encode the "old" way (the way 1.3.2 or older
+                       // did it), otherwise encode params recursively.
+                       for ( var prefix in a ) {
+                               buildParams( prefix, a[ prefix ], traditional, add );
+                       }
+               }
+
+               // Return the resulting serialization
+               return s.join( "&" ).replace( r20, "+" );
+       }
+});
+
+function buildParams( prefix, obj, traditional, add ) {
+       if ( jQuery.isArray( obj ) ) {
+               // Serialize array item.
+               jQuery.each( obj, function( i, v ) {
+                       if ( traditional || rbracket.test( prefix ) ) {
+                               // Treat each array item as a scalar.
+                               add( prefix, v );
+
+                       } else {
+                               // If array item is non-scalar (array or object), encode its
+                               // numeric index to resolve deserialization ambiguity issues.
+                               // Note that rack (as of 1.0.0) can't currently deserialize
+                               // nested arrays properly, and attempting to do so may cause
+                               // a server error. Possible fixes are to modify rack's
+                               // deserialization algorithm or to provide an option or flag
+                               // to force array serialization to be shallow.
+                               buildParams( prefix + "[" + ( typeof v === "object" || jQuery.isArray(v) ? i : "" ) + "]", v, traditional, add );
+                       }
+               });
+
+       } else if ( !traditional && obj != null && typeof obj === "object" ) {
+               // Serialize object item.
+               for ( var name in obj ) {
+                       buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
+               }
+
+       } else {
+               // Serialize scalar item.
+               add( prefix, obj );
+       }
+}
+
+// This is still on the jQuery object... for now
+// Want to move this to jQuery.ajax some day
+jQuery.extend({
+
+       // Counter for holding the number of active queries
+       active: 0,
+
+       // Last-Modified header cache for next request
+       lastModified: {},
+       etag: {}
+
+});
+
+/* Handles responses to an ajax request:
+ * - sets all responseXXX fields accordingly
+ * - finds the right dataType (mediates between content-type and expected dataType)
+ * - returns the corresponding response
+ */
+function ajaxHandleResponses( s, jqXHR, responses ) {
+
+       var contents = s.contents,
+               dataTypes = s.dataTypes,
+               responseFields = s.responseFields,
+               ct,
+               type,
+               finalDataType,
+               firstDataType;
+
+       // Fill responseXXX fields
+       for ( type in responseFields ) {
+               if ( type in responses ) {
+                       jqXHR[ responseFields[type] ] = responses[ type ];
+               }
+       }
+
+       // Remove auto dataType and get content-type in the process
+       while( dataTypes[ 0 ] === "*" ) {
+               dataTypes.shift();
+               if ( ct === undefined ) {
+                       ct = s.mimeType || jqXHR.getResponseHeader( "content-type" );
+               }
+       }
+
+       // Check if we're dealing with a known content-type
+       if ( ct ) {
+               for ( type in contents ) {
+                       if ( contents[ type ] && contents[ type ].test( ct ) ) {
+                               dataTypes.unshift( type );
+                               break;
+                       }
+               }
+       }
+
+       // Check to see if we have a response for the expected dataType
+       if ( dataTypes[ 0 ] in responses ) {
+               finalDataType = dataTypes[ 0 ];
+       } else {
+               // Try convertible dataTypes
+               for ( type in responses ) {
+                       if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
+                               finalDataType = type;
+                               break;
+                       }
+                       if ( !firstDataType ) {
+                               firstDataType = type;
+                       }
+               }
+               // Or just use first one
+               finalDataType = finalDataType || firstDataType;
+       }
+
+       // If we found a dataType
+       // We add the dataType to the list if needed
+       // and return the corresponding response
+       if ( finalDataType ) {
+               if ( finalDataType !== dataTypes[ 0 ] ) {
+                       dataTypes.unshift( finalDataType );
+               }
+               return responses[ finalDataType ];
+       }
+}
+
+// Chain conversions given the request and the original response
+function ajaxConvert( s, response ) {
+
+       // Apply the dataFilter if provided
+       if ( s.dataFilter ) {
+               response = s.dataFilter( response, s.dataType );
+       }
+
+       var dataTypes = s.dataTypes,
+               converters = {},
+               i,
+               key,
+               length = dataTypes.length,
+               tmp,
+               // Current and previous dataTypes
+               current = dataTypes[ 0 ],
+               prev,
+               // Conversion expression
+               conversion,
+               // Conversion function
+               conv,
+               // Conversion functions (transitive conversion)
+               conv1,
+               conv2;
+
+       // For each dataType in the chain
+       for ( i = 1; i < length; i++ ) {
+
+               // Create converters map
+               // with lowercased keys
+               if ( i === 1 ) {
+                       for ( key in s.converters ) {
+                               if ( typeof key === "string" ) {
+                                       converters[ key.toLowerCase() ] = s.converters[ key ];
+                               }
+                       }
+               }
+
+               // Get the dataTypes
+               prev = current;
+               current = dataTypes[ i ];
+
+               // If current is auto dataType, update it to prev
+               if ( current === "*" ) {
+                       current = prev;
+               // If no auto and dataTypes are actually different
+               } else if ( prev !== "*" && prev !== current ) {
+
+                       // Get the converter
+                       conversion = prev + " " + current;
+                       conv = converters[ conversion ] || converters[ "* " + current ];
+
+                       // If there is no direct converter, search transitively
+                       if ( !conv ) {
+                               conv2 = undefined;
+                               for ( conv1 in converters ) {
+                                       tmp = conv1.split( " " );
+                                       if ( tmp[ 0 ] === prev || tmp[ 0 ] === "*" ) {
+                                               conv2 = converters[ tmp[1] + " " + current ];
+                                               if ( conv2 ) {
+                                                       conv1 = converters[ conv1 ];
+                                                       if ( conv1 === true ) {
+                                                               conv = conv2;
+                                                       } else if ( conv2 === true ) {
+                                                               conv = conv1;
+                                                       }
+                                                       break;
+                                               }
+                                       }
+                               }
+                       }
+                       // If we found no converter, dispatch an error
+                       if ( !( conv || conv2 ) ) {
+                               jQuery.error( "No conversion from " + conversion.replace(" "," to ") );
+                       }
+                       // If found converter is not an equivalence
+                       if ( conv !== true ) {
+                               // Convert with 1 or 2 converters accordingly
+                               response = conv ? conv( response ) : conv2( conv1(response) );
+                       }
+               }
+       }
+       return response;
+}
+
+
+
+
+var jsc = jQuery.now(),
+       jsre = /(\=)\?(&|$)|\?\?/i;
+
+// Default jsonp settings
+jQuery.ajaxSetup({
+       jsonp: "callback",
+       jsonpCallback: function() {
+               return jQuery.expando + "_" + ( jsc++ );
+       }
+});
+
+// Detect, normalize options and install callbacks for jsonp requests
+jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
+
+       var inspectData = s.contentType === "application/x-www-form-urlencoded" &&
+               ( typeof s.data === "string" );
+
+       if ( s.dataTypes[ 0 ] === "jsonp" ||
+               s.jsonp !== false && ( jsre.test( s.url ) ||
+                               inspectData && jsre.test( s.data ) ) ) {
+
+               var responseContainer,
+                       jsonpCallback = s.jsonpCallback =
+                               jQuery.isFunction( s.jsonpCallback ) ? s.jsonpCallback() : s.jsonpCallback,
+                       previous = window[ jsonpCallback ],
+                       url = s.url,
+                       data = s.data,
+                       replace = "$1" + jsonpCallback + "$2";
+
+               if ( s.jsonp !== false ) {
+                       url = url.replace( jsre, replace );
+                       if ( s.url === url ) {
+                               if ( inspectData ) {
+                                       data = data.replace( jsre, replace );
+                               }
+                               if ( s.data === data ) {
+                                       // Add callback manually
+                                       url += (/\?/.test( url ) ? "&" : "?") + s.jsonp + "=" + jsonpCallback;
+                               }
+                       }
+               }
+
+               s.url = url;
+               s.data = data;
+
+               // Install callback
+               window[ jsonpCallback ] = function( response ) {
+                       responseContainer = [ response ];
+               };
+
+               // Clean-up function
+               jqXHR.always(function() {
+                       // Set callback back to previous value
+                       window[ jsonpCallback ] = previous;
+                       // Call if it was a function and we have a response
+                       if ( responseContainer && jQuery.isFunction( previous ) ) {
+                               window[ jsonpCallback ]( responseContainer[ 0 ] );
+                       }
+               });
+
+               // Use data converter to retrieve json after script execution
+               s.converters["script json"] = function() {
+                       if ( !responseContainer ) {
+                               jQuery.error( jsonpCallback + " was not called" );
+                       }
+                       return responseContainer[ 0 ];
+               };
+
+               // force json dataType
+               s.dataTypes[ 0 ] = "json";
+
+               // Delegate to script
+               return "script";
+       }
+});
+
+
+
+
+// Install script dataType
+jQuery.ajaxSetup({
+       accepts: {
+               script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
+       },
+       contents: {
+               script: /javascript|ecmascript/
+       },
+       converters: {
+               "text script": function( text ) {
+                       jQuery.globalEval( text );
+                       return text;
+               }
+       }
+});
+
+// Handle cache's special case and global
+jQuery.ajaxPrefilter( "script", function( s ) {
+       if ( s.cache === undefined ) {
+               s.cache = false;
+       }
+       if ( s.crossDomain ) {
+               s.type = "GET";
+               s.global = false;
+       }
+});
+
+// Bind script tag hack transport
+jQuery.ajaxTransport( "script", function(s) {
+
+       // This transport only deals with cross domain requests
+       if ( s.crossDomain ) {
+
+               var script,
+                       head = document.head || document.getElementsByTagName( "head" )[0] || document.documentElement;
+
+               return {
+
+                       send: function( _, callback ) {
+
+                               script = document.createElement( "script" );
+
+                               script.async = "async";
+
+                               if ( s.scriptCharset ) {
+                                       script.charset = s.scriptCharset;
+                               }
+
+                               script.src = s.url;
+
+                               // Attach handlers for all browsers
+                               script.onload = script.onreadystatechange = function( _, isAbort ) {
+
+                                       if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {
+
+                                               // Handle memory leak in IE
+                                               script.onload = script.onreadystatechange = null;
+
+                                               // Remove the script
+                                               if ( head && script.parentNode ) {
+                                                       head.removeChild( script );
+                                               }
+
+                                               // Dereference the script
+                                               script = undefined;
+
+                                               // Callback if not abort
+                                               if ( !isAbort ) {
+                                                       callback( 200, "success" );
+                                               }
+                                       }
+                               };
+                               // Use insertBefore instead of appendChild  to circumvent an IE6 bug.
+                               // This arises when a base node is used (#2709 and #4378).
+                               head.insertBefore( script, head.firstChild );
+                       },
+
+                       abort: function() {
+                               if ( script ) {
+                                       script.onload( 0, 1 );
+                               }
+                       }
+               };
+       }
+});
+
+
+
+
+var // #5280: Internet Explorer will keep connections alive if we don't abort on unload
+       xhrOnUnloadAbort = window.ActiveXObject ? function() {
+               // Abort all pending requests
+               for ( var key in xhrCallbacks ) {
+                       xhrCallbacks[ key ]( 0, 1 );
+               }
+       } : false,
+       xhrId = 0,
+       xhrCallbacks;
+
+// Functions to create xhrs
+function createStandardXHR() {
+       try {
+               return new window.XMLHttpRequest();
+       } catch( e ) {}
+}
+
+function createActiveXHR() {
+       try {
+               return new window.ActiveXObject( "Microsoft.XMLHTTP" );
+       } catch( e ) {}
+}
+
+// Create the request object
+// (This is still attached to ajaxSettings for backward compatibility)
+jQuery.ajaxSettings.xhr = window.ActiveXObject ?
+       /* Microsoft failed to properly
+        * implement the XMLHttpRequest in IE7 (can't request local files),
+        * so we use the ActiveXObject when it is available
+        * Additionally XMLHttpRequest can be disabled in IE7/IE8 so
+        * we need a fallback.
+        */
+       function() {
+               return !this.isLocal && createStandardXHR() || createActiveXHR();
+       } :
+       // For all other browsers, use the standard XMLHttpRequest object
+       createStandardXHR;
+
+// Determine support properties
+(function( xhr ) {
+       jQuery.extend( jQuery.support, {
+               ajax: !!xhr,
+               cors: !!xhr && ( "withCredentials" in xhr )
+       });
+})( jQuery.ajaxSettings.xhr() );
+
+// Create transport if the browser can provide an xhr
+if ( jQuery.support.ajax ) {
+
+       jQuery.ajaxTransport(function( s ) {
+               // Cross domain only allowed if supported through XMLHttpRequest
+               if ( !s.crossDomain || jQuery.support.cors ) {
+
+                       var callback;
+
+                       return {
+                               send: function( headers, complete ) {
+
+                                       // Get a new xhr
+                                       var xhr = s.xhr(),
+                                               handle,
+                                               i;
+
+                                       // Open the socket
+                                       // Passing null username, generates a login popup on Opera (#2865)
+                                       if ( s.username ) {
+                                               xhr.open( s.type, s.url, s.async, s.username, s.password );
+                                       } else {
+                                               xhr.open( s.type, s.url, s.async );
+                                       }
+
+                                       // Apply custom fields if provided
+                                       if ( s.xhrFields ) {
+                                               for ( i in s.xhrFields ) {
+                                                       xhr[ i ] = s.xhrFields[ i ];
+                                               }
+                                       }
+
+                                       // Override mime type if needed
+                                       if ( s.mimeType && xhr.overrideMimeType ) {
+                                               xhr.overrideMimeType( s.mimeType );
+                                       }
+
+                                       // X-Requested-With header
+                                       // For cross-domain requests, seeing as conditions for a preflight are
+                                       // akin to a jigsaw puzzle, we simply never set it to be sure.
+                                       // (it can always be set on a per-request basis or even using ajaxSetup)
+                                       // For same-domain requests, won't change header if already provided.
+                                       if ( !s.crossDomain && !headers["X-Requested-With"] ) {
+                                               headers[ "X-Requested-With" ] = "XMLHttpRequest";
+                                       }
+
+                                       // Need an extra try/catch for cross domain requests in Firefox 3
+                                       try {
+                                               for ( i in headers ) {
+                                                       xhr.setRequestHeader( i, headers[ i ] );
+                                               }
+                                       } catch( _ ) {}
+
+                                       // Do send the request
+                                       // This may raise an exception which is actually
+                                       // handled in jQuery.ajax (so no try/catch here)
+                                       xhr.send( ( s.hasContent && s.data ) || null );
+
+                                       // Listener
+                                       callback = function( _, isAbort ) {
+
+                                               var status,
+                                                       statusText,
+                                                       responseHeaders,
+                                                       responses,
+                                                       xml;
+
+                                               // Firefox throws exceptions when accessing properties
+                                               // of an xhr when a network error occured
+                                               // http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)
+                                               try {
+
+                                                       // Was never called and is aborted or complete
+                                                       if ( callback && ( isAbort || xhr.readyState === 4 ) ) {
+
+                                                               // Only called once
+                                                               callback = undefined;
+
+                                                               // Do not keep as active anymore
+                                                               if ( handle ) {
+                                                                       xhr.onreadystatechange = jQuery.noop;
+                                                                       if ( xhrOnUnloadAbort ) {
+                                                                               delete xhrCallbacks[ handle ];
+                                                                       }
+                                                               }
+
+                                                               // If it's an abort
+                                                               if ( isAbort ) {
+                                                                       // Abort it manually if needed
+                                                                       if ( xhr.readyState !== 4 ) {
+                                                                               xhr.abort();
+                                                                       }
+                                                               } else {
+                                                                       status = xhr.status;
+                                                                       responseHeaders = xhr.getAllResponseHeaders();
+                                                                       responses = {};
+                                                                       xml = xhr.responseXML;
+
+                                                                       // Construct response list
+                                                                       if ( xml && xml.documentElement /* #4958 */ ) {
+                                                                               responses.xml = xml;
+                                                                       }
+                                                                       responses.text = xhr.responseText;
+
+                                                                       // Firefox throws an exception when accessing
+                                                                       // statusText for faulty cross-domain requests
+                                                                       try {
+                                                                               statusText = xhr.statusText;
+                                                                       } catch( e ) {
+                                                                               // We normalize with Webkit giving an empty statusText
+                                                                               statusText = "";
+                                                                       }
+
+                                                                       // Filter status for non standard behaviors
+
+                                                                       // If the request is local and we have data: assume a success
+                                                                       // (success with no data won't get notified, that's the best we
+                                                                       // can do given current implementations)
+                                                                       if ( !status && s.isLocal && !s.crossDomain ) {
+                                                                               status = responses.text ? 200 : 404;
+                                                                       // IE - #1450: sometimes returns 1223 when it should be 204
+                                                                       } else if ( status === 1223 ) {
+                                                                               status = 204;
+                                                                       }
+                                                               }
+                                                       }
+                                               } catch( firefoxAccessException ) {
+                                                       if ( !isAbort ) {
+                                                               complete( -1, firefoxAccessException );
+                                                       }
+                                               }
+
+                                               // Call complete if needed
+                                               if ( responses ) {
+                                                       complete( status, statusText, responses, responseHeaders );
+                                               }
+                                       };
+
+                                       // if we're in sync mode or it's in cache
+                                       // and has been retrieved directly (IE6 & IE7)
+                                       // we need to manually fire the callback
+                                       if ( !s.async || xhr.readyState === 4 ) {
+                                               callback();
+                                       } else {
+                                               handle = ++xhrId;
+                                               if ( xhrOnUnloadAbort ) {
+                                                       // Create the active xhrs callbacks list if needed
+                                                       // and attach the unload handler
+                                                       if ( !xhrCallbacks ) {
+                                                               xhrCallbacks = {};
+                                                               jQuery( window ).unload( xhrOnUnloadAbort );
+                                                       }
+                                                       // Add to list of active xhrs callbacks
+                                                       xhrCallbacks[ handle ] = callback;
+                                               }
+                                               xhr.onreadystatechange = callback;
+                                       }
+                               },
+
+                               abort: function() {
+                                       if ( callback ) {
+                                               callback(0,1);
+                                       }
+                               }
+                       };
+               }
+       });
+}
+
+
+
+
+var elemdisplay = {},
+       iframe, iframeDoc,
+       rfxtypes = /^(?:toggle|show|hide)$/,
+       rfxnum = /^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,
+       timerId,
+       fxAttrs = [
+               // height animations
+               [ "height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" ],
+               // width animations
+               [ "width", "marginLeft", "marginRight", "paddingLeft", "paddingRight" ],
+               // opacity animations
+               [ "opacity" ]
+       ],
+       fxNow;
+
+jQuery.fn.extend({
+       show: function( speed, easing, callback ) {
+               var elem, display;
+
+               if ( speed || speed === 0 ) {
+                       return this.animate( genFx("show", 3), speed, easing, callback );
+
+               } else {
+                       for ( var i = 0, j = this.length; i < j; i++ ) {
+                               elem = this[ i ];
+
+                               if ( elem.style ) {
+                                       display = elem.style.display;
+
+                                       // Reset the inline display of this element to learn if it is
+                                       // being hidden by cascaded rules or not
+                                       if ( !jQuery._data(elem, "olddisplay") && display === "none" ) {
+                                               display = elem.style.display = "";
+                                       }
+
+                                       // Set elements which have been overridden with display: none
+                                       // in a stylesheet to whatever the default browser style is
+                                       // for such an element
+                                       if ( display === "" && jQuery.css(elem, "display") === "none" ) {
+                                               jQuery._data( elem, "olddisplay", defaultDisplay(elem.nodeName) );
+                                       }
+                               }
+                       }
+
+                       // Set the display of most of the elements in a second loop
+                       // to avoid the constant reflow
+                       for ( i = 0; i < j; i++ ) {
+                               elem = this[ i ];
+
+                               if ( elem.style ) {
+                                       display = elem.style.display;
+
+                                       if ( display === "" || display === "none" ) {
+                                               elem.style.display = jQuery._data( elem, "olddisplay" ) || "";
+                                       }
+                               }
+                       }
+
+                       return this;
+               }
+       },
+
+       hide: function( speed, easing, callback ) {
+               if ( speed || speed === 0 ) {
+                       return this.animate( genFx("hide", 3), speed, easing, callback);
+
+               } else {
+                       var elem, display,
+                               i = 0,
+                               j = this.length;
+
+                       for ( ; i < j; i++ ) {
+                               elem = this[i];
+                               if ( elem.style ) {
+                                       display = jQuery.css( elem, "display" );
+
+                                       if ( display !== "none" && !jQuery._data( elem, "olddisplay" ) ) {
+                                               jQuery._data( elem, "olddisplay", display );
+                                       }
+                               }
+                       }
+
+                       // Set the display of the elements in a second loop
+                       // to avoid the constant reflow
+                       for ( i = 0; i < j; i++ ) {
+                               if ( this[i].style ) {
+                                       this[i].style.display = "none";
+                               }
+                       }
+
+                       return this;
+               }
+       },
+
+       // Save the old toggle function
+       _toggle: jQuery.fn.toggle,
+
+       toggle: function( fn, fn2, callback ) {
+               var bool = typeof fn === "boolean";
+
+               if ( jQuery.isFunction(fn) && jQuery.isFunction(fn2) ) {
+                       this._toggle.apply( this, arguments );
+
+               } else if ( fn == null || bool ) {
+                       this.each(function() {
+                               var state = bool ? fn : jQuery(this).is(":hidden");
+                               jQuery(this)[ state ? "show" : "hide" ]();
+                       });
+
+               } else {
+                       this.animate(genFx("toggle", 3), fn, fn2, callback);
+               }
+
+               return this;
+       },
+
+       fadeTo: function( speed, to, easing, callback ) {
+               return this.filter(":hidden").css("opacity", 0).show().end()
+                                       .animate({opacity: to}, speed, easing, callback);
+       },
+
+       animate: function( prop, speed, easing, callback ) {
+               var optall = jQuery.speed( speed, easing, callback );
+
+               if ( jQuery.isEmptyObject( prop ) ) {
+                       return this.each( optall.complete, [ false ] );
+               }
+
+               // Do not change referenced properties as per-property easing will be lost
+               prop = jQuery.extend( {}, prop );
+
+               function doAnimation() {
+                       // XXX 'this' does not always have a nodeName when running the
+                       // test suite
+
+                       if ( optall.queue === false ) {
+                               jQuery._mark( this );
+                       }
+
+                       var opt = jQuery.extend( {}, optall ),
+                               isElement = this.nodeType === 1,
+                               hidden = isElement && jQuery(this).is(":hidden"),
+                               name, val, p, e,
+                               parts, start, end, unit,
+                               method;
+
+                       // will store per property easing and be used to determine when an animation is complete
+                       opt.animatedProperties = {};
+
+                       for ( p in prop ) {
+
+                               // property name normalization
+                               name = jQuery.camelCase( p );
+                               if ( p !== name ) {
+                                       prop[ name ] = prop[ p ];
+                                       delete prop[ p ];
+                               }
+
+                               val = prop[ name ];
+
+                               // easing resolution: per property > opt.specialEasing > opt.easing > 'swing' (default)
+                               if ( jQuery.isArray( val ) ) {
+                                       opt.animatedProperties[ name ] = val[ 1 ];
+                                       val = prop[ name ] = val[ 0 ];
+                               } else {
+                                       opt.animatedProperties[ name ] = opt.specialEasing && opt.specialEasing[ name ] || opt.easing || 'swing';
+                               }
+
+                               if ( val === "hide" && hidden || val === "show" && !hidden ) {
+                                       return opt.complete.call( this );
+                               }
+
+                               if ( isElement && ( name === "height" || name === "width" ) ) {
+                                       // Make sure that nothing sneaks out
+                                       // Record all 3 overflow attributes because IE does not
+                                       // change the overflow attribute when overflowX and
+                                       // overflowY are set to the same value
+                                       opt.overflow = [ this.style.overflow, this.style.overflowX, this.style.overflowY ];
+
+                                       // Set display property to inline-block for height/width
+                                       // animations on inline elements that are having width/height animated
+                                       if ( jQuery.css( this, "display" ) === "inline" &&
+                                                       jQuery.css( this, "float" ) === "none" ) {
+
+                                               // inline-level elements accept inline-block;
+                                               // block-level elements need to be inline with layout
+                                               if ( !jQuery.support.inlineBlockNeedsLayout || defaultDisplay( this.nodeName ) === "inline" ) {
+                                                       this.style.display = "inline-block";
+
+                                               } else {
+                                                       this.style.zoom = 1;
+                                               }
+                                       }
+                               }
+                       }
+
+                       if ( opt.overflow != null ) {
+                               this.style.overflow = "hidden";
+                       }
+
+                       for ( p in prop ) {
+                               e = new jQuery.fx( this, opt, p );
+                               val = prop[ p ];
+
+                               if ( rfxtypes.test( val ) ) {
+
+                                       // Tracks whether to show or hide based on private
+                                       // data attached to the element
+                                       method = jQuery._data( this, "toggle" + p ) || ( val === "toggle" ? hidden ? "show" : "hide" : 0 );
+                                       if ( method ) {
+                                               jQuery._data( this, "toggle" + p, method === "show" ? "hide" : "show" );
+                                               e[ method ]();
+                                       } else {
+                                               e[ val ]();
+                                       }
+
+                               } else {
+                                       parts = rfxnum.exec( val );
+                                       start = e.cur();
+
+                                       if ( parts ) {
+                                               end = parseFloat( parts[2] );
+                                               unit = parts[3] || ( jQuery.cssNumber[ p ] ? "" : "px" );
+
+                                               // We need to compute starting value
+                                               if ( unit !== "px" ) {
+                                                       jQuery.style( this, p, (end || 1) + unit);
+                                                       start = ( (end || 1) / e.cur() ) * start;
+                                                       jQuery.style( this, p, start + unit);
+                                               }
+
+                                               // If a +=/-= token was provided, we're doing a relative animation
+                                               if ( parts[1] ) {
+                                                       end = ( (parts[ 1 ] === "-=" ? -1 : 1) * end ) + start;
+                                               }
+
+                                               e.custom( start, end, unit );
+
+                                       } else {
+                                               e.custom( start, val, "" );
+                                       }
+                               }
+                       }
+
+                       // For JS strict compliance
+                       return true;
+               }
+
+               return optall.queue === false ?
+                       this.each( doAnimation ) :
+                       this.queue( optall.queue, doAnimation );
+       },
+
+       stop: function( type, clearQueue, gotoEnd ) {
+               if ( typeof type !== "string" ) {
+                       gotoEnd = clearQueue;
+                       clearQueue = type;
+                       type = undefined;
+               }
+               if ( clearQueue && type !== false ) {
+                       this.queue( type || "fx", [] );
+               }
+
+               return this.each(function() {
+                       var index,
+                               hadTimers = false,
+                               timers = jQuery.timers,
+                               data = jQuery._data( this );
+
+                       // clear marker counters if we know they won't be
+                       if ( !gotoEnd ) {
+                               jQuery._unmark( true, this );
+                       }
+
+                       function stopQueue( elem, data, index ) {
+                               var hooks = data[ index ];
+                               jQuery.removeData( elem, index, true );
+                               hooks.stop( gotoEnd );
+                       }
+
+                       if ( type == null ) {
+                               for ( index in data ) {
+                                       if ( data[ index ] && data[ index ].stop && index.indexOf(".run") === index.length - 4 ) {
+                                               stopQueue( this, data, index );
+                                       }
+                               }
+                       } else if ( data[ index = type + ".run" ] && data[ index ].stop ){
+                               stopQueue( this, data, index );
+                       }
+
+                       for ( index = timers.length; index--; ) {
+                               if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {
+                                       if ( gotoEnd ) {
+
+                                               // force the next step to be the last
+                                               timers[ index ]( true );
+                                       } else {
+                                               timers[ index ].saveState();
+                                       }
+                                       hadTimers = true;
+                                       timers.splice( index, 1 );
+                               }
+                       }
+
+                       // start the next in the queue if the last step wasn't forced
+                       // timers currently will call their complete callbacks, which will dequeue
+                       // but only if they were gotoEnd
+                       if ( !( gotoEnd && hadTimers ) ) {
+                               jQuery.dequeue( this, type );
+                       }
+               });
+       }
+
+});
+
+// Animations created synchronously will run synchronously
+function createFxNow() {
+       setTimeout( clearFxNow, 0 );
+       return ( fxNow = jQuery.now() );
+}
+
+function clearFxNow() {
+       fxNow = undefined;
+}
+
+// Generate parameters to create a standard animation
+function genFx( type, num ) {
+       var obj = {};
+
+       jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice( 0, num )), function() {
+               obj[ this ] = type;
+       });
+
+       return obj;
+}
+
+// Generate shortcuts for custom animations
+jQuery.each({
+       slideDown: genFx( "show", 1 ),
+       slideUp: genFx( "hide", 1 ),
+       slideToggle: genFx( "toggle", 1 ),
+       fadeIn: { opacity: "show" },
+       fadeOut: { opacity: "hide" },
+       fadeToggle: { opacity: "toggle" }
+}, function( name, props ) {
+       jQuery.fn[ name ] = function( speed, easing, callback ) {
+               return this.animate( props, speed, easing, callback );
+       };
+});
+
+jQuery.extend({
+       speed: function( speed, easing, fn ) {
+               var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
+                       complete: fn || !fn && easing ||
+                               jQuery.isFunction( speed ) && speed,
+                       duration: speed,
+                       easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
+               };
+
+               opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
+                       opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
+
+               // normalize opt.queue - true/undefined/null -> "fx"
+               if ( opt.queue == null || opt.queue === true ) {
+                       opt.queue = "fx";
+               }
+
+               // Queueing
+               opt.old = opt.complete;
+
+               opt.complete = function( noUnmark ) {
+                       if ( jQuery.isFunction( opt.old ) ) {
+                               opt.old.call( this );
+                       }
+
+                       if ( opt.queue ) {
+                               jQuery.dequeue( this, opt.queue );
+                       } else if ( noUnmark !== false ) {
+                               jQuery._unmark( 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: [],
+
+       fx: function( elem, options, prop ) {
+               this.options = options;
+               this.elem = elem;
+               this.prop = prop;
+
+               options.orig = options.orig || {};
+       }
+
+});
+
+jQuery.fx.prototype = {
+       // Simple function for setting a style value
+       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 );
+       },
+
+       // Get the current size
+       cur: function() {
+               if ( this.elem[ this.prop ] != null && (!this.elem.style || this.elem.style[ this.prop ] == null) ) {
+                       return this.elem[ this.prop ];
+               }
+
+               var parsed,
+                       r = jQuery.css( this.elem, this.prop );
+               // Empty strings, null, undefined and "auto" are converted to 0,
+               // complex values such as "rotate(1rad)" are returned as is,
+               // simple values such as "10px" are parsed to Float.
+               return isNaN( parsed = parseFloat( r ) ) ? !r || r === "auto" ? 0 : r : parsed;
+       },
+
+       // Start an animation from one number to another
+       custom: function( from, to, unit ) {
+               var self = this,
+                       fx = jQuery.fx;
+
+               this.startTime = fxNow || createFxNow();
+               this.end = to;
+               this.now = this.start = from;
+               this.pos = this.state = 0;
+               this.unit = unit || this.unit || ( jQuery.cssNumber[ this.prop ] ? "" : "px" );
+
+               function t( gotoEnd ) {
+                       return self.step( gotoEnd );
+               }
+
+               t.queue = this.options.queue;
+               t.elem = this.elem;
+               t.saveState = function() {
+                       if ( self.options.hide && jQuery._data( self.elem, "fxshow" + self.prop ) === undefined ) {
+                               jQuery._data( self.elem, "fxshow" + self.prop, self.start );
+                       }
+               };
+
+               if ( t() && jQuery.timers.push(t) && !timerId ) {
+                       timerId = setInterval( fx.tick, fx.interval );
+               }
+       },
+
+       // Simple 'show' function
+       show: function() {
+               var dataShow = jQuery._data( this.elem, "fxshow" + this.prop );
+
+               // Remember where we started, so that we can go back to it later
+               this.options.orig[ this.prop ] = dataShow || jQuery.style( this.elem, this.prop );
+               this.options.show = true;
+
+               // Begin the animation
+               // Make sure that we start at a small width/height to avoid any flash of content
+               if ( dataShow !== undefined ) {
+                       // This show is picking up where a previous hide or show left off
+                       this.custom( this.cur(), dataShow );
+               } else {
+                       this.custom( this.prop === "width" || this.prop === "height" ? 1 : 0, this.cur() );
+               }
+
+               // Start by showing the element
+               jQuery( this.elem ).show();
+       },
+
+       // Simple 'hide' function
+       hide: function() {
+               // Remember where we started, so that we can go back to it later
+               this.options.orig[ this.prop ] = jQuery._data( this.elem, "fxshow" + this.prop ) || jQuery.style( this.elem, this.prop );
+               this.options.hide = true;
+
+               // Begin the animation
+               this.custom( this.cur(), 0 );
+       },
+
+       // Each step of an animation
+       step: function( gotoEnd ) {
+               var p, n, complete,
+                       t = fxNow || createFxNow(),
+                       done = true,
+                       elem = this.elem,
+                       options = this.options;
+
+               if ( gotoEnd || t >= options.duration + this.startTime ) {
+                       this.now = this.end;
+                       this.pos = this.state = 1;
+                       this.update();
+
+                       options.animatedProperties[ this.prop ] = true;
+
+                       for ( p in options.animatedProperties ) {
+                               if ( options.animatedProperties[ p ] !== true ) {
+                                       done = false;
+                               }
+                       }
+
+                       if ( done ) {
+                               // Reset the overflow
+                               if ( options.overflow != null && !jQuery.support.shrinkWrapBlocks ) {
+
+                                       jQuery.each( [ "", "X", "Y" ], function( index, value ) {
+                                               elem.style[ "overflow" + value ] = options.overflow[ index ];
+                                       });
+                               }
+
+                               // Hide the element if the "hide" operation was done
+                               if ( options.hide ) {
+                                       jQuery( elem ).hide();
+                               }
+
+                               // Reset the properties, if the item has been hidden or shown
+                               if ( options.hide || options.show ) {
+                                       for ( p in options.animatedProperties ) {
+                                               jQuery.style( elem, p, options.orig[ p ] );
+                                               jQuery.removeData( elem, "fxshow" + p, true );
+                                               // Toggle data is no longer needed
+                                               jQuery.removeData( elem, "toggle" + p, true );
+                                       }
+                               }
+
+                               // Execute the complete function
+                               // in the event that the complete function throws an exception
+                               // we must ensure it won't be called twice. #5684
+
+                               complete = options.complete;
+                               if ( complete ) {
+
+                                       options.complete = false;
+                                       complete.call( elem );
+                               }
+                       }
+
+                       return false;
+
+               } else {
+                       // classical easing cannot be used with an Infinity duration
+                       if ( options.duration == Infinity ) {
+                               this.now = t;
+                       } else {
+                               n = t - this.startTime;
+                               this.state = n / options.duration;
+
+                               // Perform the easing function, defaults to swing
+                               this.pos = jQuery.easing[ options.animatedProperties[this.prop] ]( this.state, n, 0, 1, options.duration );
+                               this.now = this.start + ( (this.end - this.start) * this.pos );
+                       }
+                       // Perform the next step of the animation
+                       this.update();
+               }
+
+               return true;
+       }
+};
+
+jQuery.extend( jQuery.fx, {
+       tick: function() {
+               var timer,
+                       timers = jQuery.timers,
+                       i = 0;
+
+               for ( ; i < timers.length; i++ ) {
+                       timer = timers[ i ];
+                       // Checks the timer has not already been removed
+                       if ( !timer() && timers[ i ] === timer ) {
+                               timers.splice( i--, 1 );
+                       }
+               }
+
+               if ( !timers.length ) {
+                       jQuery.fx.stop();
+               }
+       },
+
+       interval: 13,
+
+       stop: function() {
+               clearInterval( timerId );
+               timerId = null;
+       },
+
+       speeds: {
+               slow: 600,
+               fast: 200,
+               // Default speed
+               _default: 400
+       },
+
+       step: {
+               opacity: function( fx ) {
+                       jQuery.style( fx.elem, "opacity", fx.now );
+               },
+
+               _default: function( fx ) {
+                       if ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) {
+                               fx.elem.style[ fx.prop ] = fx.now + fx.unit;
+                       } else {
+                               fx.elem[ fx.prop ] = fx.now;
+                       }
+               }
+       }
+});
+
+// Adds width/height step functions
+// Do not set anything below 0
+jQuery.each([ "width", "height" ], function( i, prop ) {
+       jQuery.fx.step[ prop ] = function( fx ) {
+               jQuery.style( fx.elem, prop, Math.max(0, fx.now) + fx.unit );
+       };
+});
+
+if ( jQuery.expr && jQuery.expr.filters ) {
+       jQuery.expr.filters.animated = function( elem ) {
+               return jQuery.grep(jQuery.timers, function( fn ) {
+                       return elem === fn.elem;
+               }).length;
+       };
+}
+
+// Try to restore the default display value of an element
+function defaultDisplay( nodeName ) {
+
+       if ( !elemdisplay[ nodeName ] ) {
+
+               var body = document.body,
+                       elem = jQuery( "<" + nodeName + ">" ).appendTo( body ),
+                       display = elem.css( "display" );
+               elem.remove();
+
+               // If the simple way fails,
+               // get element's real default display by attaching it to a temp iframe
+               if ( display === "none" || display === "" ) {
+                       // No iframe to use yet, so create it
+                       if ( !iframe ) {
+                               iframe = document.createElement( "iframe" );
+                               iframe.frameBorder = iframe.width = iframe.height = 0;
+                       }
+
+                       body.appendChild( iframe );
+
+                       // Create a cacheable copy of the iframe document on first call.
+                       // IE and Opera will allow us to reuse the iframeDoc without re-writing the fake HTML
+                       // document to it; WebKit & Firefox won't allow reusing the iframe document.
+                       if ( !iframeDoc || !iframe.createElement ) {
+                               iframeDoc = ( iframe.contentWindow || iframe.contentDocument ).document;
+                               iframeDoc.write( ( document.compatMode === "CSS1Compat" ? "<!doctype html>" : "" ) + "<html><body>" );
+                               iframeDoc.close();
+                       }
+
+                       elem = iframeDoc.createElement( nodeName );
+
+                       iframeDoc.body.appendChild( elem );
+
+                       display = jQuery.css( elem, "display" );
+                       body.removeChild( iframe );
+               }
+
+               // Store the correct default display
+               elemdisplay[ nodeName ] = display;
+       }
+
+       return elemdisplay[ nodeName ];
+}
+
+
+
+
+var rtable = /^t(?:able|d|h)$/i,
+       rroot = /^(?:body|html)$/i;
+
+if ( "getBoundingClientRect" in document.documentElement ) {
+       jQuery.fn.offset = function( options ) {
+               var elem = this[0], box;
+
+               if ( options ) {
+                       return this.each(function( i ) {
+                               jQuery.offset.setOffset( this, options, i );
+                       });
+               }
+
+               if ( !elem || !elem.ownerDocument ) {
+                       return null;
+               }
+
+               if ( elem === elem.ownerDocument.body ) {
+                       return jQuery.offset.bodyOffset( elem );
+               }
+
+               try {
+                       box = elem.getBoundingClientRect();
+               } catch(e) {}
+
+               var doc = elem.ownerDocument,
+                       docElem = doc.documentElement;
+
+               // Make sure we're not dealing with a disconnected DOM node
+               if ( !box || !jQuery.contains( docElem, elem ) ) {
+                       return box ? { top: box.top, left: box.left } : { top: 0, left: 0 };
+               }
+
+               var body = doc.body,
+                       win = getWindow(doc),
+                       clientTop  = docElem.clientTop  || body.clientTop  || 0,
+                       clientLeft = docElem.clientLeft || body.clientLeft || 0,
+                       scrollTop  = win.pageYOffset || jQuery.support.boxModel && docElem.scrollTop  || body.scrollTop,
+                       scrollLeft = win.pageXOffset || jQuery.support.boxModel && docElem.scrollLeft || body.scrollLeft,
+                       top  = box.top  + scrollTop  - clientTop,
+                       left = box.left + scrollLeft - clientLeft;
+
+               return { top: top, left: left };
+       };
+
+} else {
+       jQuery.fn.offset = function( options ) {
+               var elem = this[0];
+
+               if ( options ) {
+                       return this.each(function( i ) {
+                               jQuery.offset.setOffset( this, options, i );
+                       });
+               }
+
+               if ( !elem || !elem.ownerDocument ) {
+                       return null;
+               }
+
+               if ( elem === elem.ownerDocument.body ) {
+                       return jQuery.offset.bodyOffset( elem );
+               }
+
+               var computedStyle,
+                       offsetParent = elem.offsetParent,
+                       prevOffsetParent = elem,
+                       doc = elem.ownerDocument,
+                       docElem = doc.documentElement,
+                       body = doc.body,
+                       defaultView = doc.defaultView,
+                       prevComputedStyle = defaultView ? defaultView.getComputedStyle( elem, null ) : elem.currentStyle,
+                       top = elem.offsetTop,
+                       left = elem.offsetLeft;
+
+               while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) {
+                       if ( jQuery.support.fixedPosition && prevComputedStyle.position === "fixed" ) {
+                               break;
+                       }
+
+                       computedStyle = defaultView ? defaultView.getComputedStyle(elem, null) : elem.currentStyle;
+                       top  -= elem.scrollTop;
+                       left -= elem.scrollLeft;
+
+                       if ( elem === offsetParent ) {
+                               top  += elem.offsetTop;
+                               left += elem.offsetLeft;
+
+                               if ( jQuery.support.doesNotAddBorder && !(jQuery.support.doesAddBorderForTableAndCells && rtable.test(elem.nodeName)) ) {
+                                       top  += parseFloat( computedStyle.borderTopWidth  ) || 0;
+                                       left += parseFloat( computedStyle.borderLeftWidth ) || 0;
+                               }
+
+                               prevOffsetParent = offsetParent;
+                               offsetParent = elem.offsetParent;
+                       }
+
+                       if ( jQuery.support.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" ) {
+                               top  += parseFloat( computedStyle.borderTopWidth  ) || 0;
+                               left += parseFloat( computedStyle.borderLeftWidth ) || 0;
+                       }
+
+                       prevComputedStyle = computedStyle;
+               }
+
+               if ( prevComputedStyle.position === "relative" || prevComputedStyle.position === "static" ) {
+                       top  += body.offsetTop;
+                       left += body.offsetLeft;
+               }
+
+               if ( jQuery.support.fixedPosition && prevComputedStyle.position === "fixed" ) {
+                       top  += Math.max( docElem.scrollTop, body.scrollTop );
+                       left += Math.max( docElem.scrollLeft, body.scrollLeft );
+               }
+
+               return { top: top, left: left };
+       };
+}
+
+jQuery.offset = {
+
+       bodyOffset: function( body ) {
+               var top = body.offsetTop,
+                       left = body.offsetLeft;
+
+               if ( jQuery.support.doesNotIncludeMarginInBodyOffset ) {
+                       top  += parseFloat( jQuery.css(body, "marginTop") ) || 0;
+                       left += parseFloat( jQuery.css(body, "marginLeft") ) || 0;
+               }
+
+               return { top: top, left: left };
+       },
+
+       setOffset: function( elem, options, i ) {
+               var position = jQuery.css( elem, "position" );
+
+               // set position first, in-case top/left are set even on static elem
+               if ( position === "static" ) {
+                       elem.style.position = "relative";
+               }
+
+               var curElem = jQuery( elem ),
+                       curOffset = curElem.offset(),
+                       curCSSTop = jQuery.css( elem, "top" ),
+                       curCSSLeft = jQuery.css( elem, "left" ),
+                       calculatePosition = ( position === "absolute" || position === "fixed" ) && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1,
+                       props = {}, curPosition = {}, curTop, curLeft;
+
+               // need to be able to calculate position if either top or left is auto and position is either absolute or fixed
+               if ( calculatePosition ) {
+                       curPosition = curElem.position();
+                       curTop = curPosition.top;
+                       curLeft = curPosition.left;
+               } else {
+                       curTop = parseFloat( curCSSTop ) || 0;
+                       curLeft = parseFloat( curCSSLeft ) || 0;
+               }
+
+               if ( jQuery.isFunction( options ) ) {
+                       options = options.call( elem, i, curOffset );
+               }
+
+               if ( options.top != null ) {
+                       props.top = ( options.top - curOffset.top ) + curTop;
+               }
+               if ( options.left != null ) {
+                       props.left = ( options.left - curOffset.left ) + curLeft;
+               }
+
+               if ( "using" in options ) {
+                       options.using.call( elem, props );
+               } else {
+                       curElem.css( props );
+               }
+       }
+};
+
+
+jQuery.fn.extend({
+
+       position: function() {
+               if ( !this[0] ) {
+                       return null;
+               }
+
+               var elem = this[0],
+
+               // Get *real* offsetParent
+               offsetParent = this.offsetParent(),
+
+               // Get correct offsets
+               offset       = this.offset(),
+               parentOffset = rroot.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset();
+
+               // Subtract element margins
+               // note: when an element has margin: auto the offsetLeft and marginLeft
+               // are the same in Safari causing offset.left to incorrectly be 0
+               offset.top  -= parseFloat( jQuery.css(elem, "marginTop") ) || 0;
+               offset.left -= parseFloat( jQuery.css(elem, "marginLeft") ) || 0;
+
+               // Add offsetParent borders
+               parentOffset.top  += parseFloat( jQuery.css(offsetParent[0], "borderTopWidth") ) || 0;
+               parentOffset.left += parseFloat( jQuery.css(offsetParent[0], "borderLeftWidth") ) || 0;
+
+               // Subtract the two offsets
+               return {
+                       top:  offset.top  - parentOffset.top,
+                       left: offset.left - parentOffset.left
+               };
+       },
+
+       offsetParent: function() {
+               return this.map(function() {
+                       var offsetParent = this.offsetParent || document.body;
+                       while ( offsetParent && (!rroot.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") ) {
+                               offsetParent = offsetParent.offsetParent;
+                       }
+                       return offsetParent;
+               });
+       }
+});
+
+
+// Create scrollLeft and scrollTop methods
+jQuery.each( ["Left", "Top"], function( i, name ) {
+       var method = "scroll" + name;
+
+       jQuery.fn[ method ] = function( val ) {
+               var elem, win;
+
+               if ( val === undefined ) {
+                       elem = this[ 0 ];
+
+                       if ( !elem ) {
+                               return null;
+                       }
+
+                       win = getWindow( elem );
+
+                       // Return the scroll offset
+                       return win ? ("pageXOffset" in win) ? win[ i ? "pageYOffset" : "pageXOffset" ] :
+                               jQuery.support.boxModel && win.document.documentElement[ method ] ||
+                                       win.document.body[ method ] :
+                               elem[ method ];
+               }
+
+               // Set the scroll offset
+               return this.each(function() {
+                       win = getWindow( this );
+
+                       if ( win ) {
+                               win.scrollTo(
+                                       !i ? val : jQuery( win ).scrollLeft(),
+                                        i ? val : jQuery( win ).scrollTop()
+                               );
+
+                       } else {
+                               this[ method ] = val;
+                       }
+               });
+       };
+});
+
+function getWindow( elem ) {
+       return jQuery.isWindow( elem ) ?
+               elem :
+               elem.nodeType === 9 ?
+                       elem.defaultView || elem.parentWindow :
+                       false;
+}
+
+
+
+
+// Create width, height, innerHeight, innerWidth, outerHeight and outerWidth methods
+jQuery.each([ "Height", "Width" ], function( i, name ) {
+
+       var type = name.toLowerCase();
+
+       // innerHeight and innerWidth
+       jQuery.fn[ "inner" + name ] = function() {
+               var elem = this[0];
+               return elem ?
+                       elem.style ?
+                       parseFloat( jQuery.css( elem, type, "padding" ) ) :
+                       this[ type ]() :
+                       null;
+       };
+
+       // outerHeight and outerWidth
+       jQuery.fn[ "outer" + name ] = function( margin ) {
+               var elem = this[0];
+               return elem ?
+                       elem.style ?
+                       parseFloat( jQuery.css( elem, type, margin ? "margin" : "border" ) ) :
+                       this[ type ]() :
+                       null;
+       };
+
+       jQuery.fn[ type ] = function( size ) {
+               // Get window width or height
+               var elem = this[0];
+               if ( !elem ) {
+                       return size == null ? null : this;
+               }
+
+               if ( jQuery.isFunction( size ) ) {
+                       return this.each(function( i ) {
+                               var self = jQuery( this );
+                               self[ type ]( size.call( this, i, self[ type ]() ) );
+                       });
+               }
+
+               if ( jQuery.isWindow( elem ) ) {
+                       // Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode
+                       // 3rd condition allows Nokia support, as it supports the docElem prop but not CSS1Compat
+                       var docElemProp = elem.document.documentElement[ "client" + name ],
+                               body = elem.document.body;
+                       return elem.document.compatMode === "CSS1Compat" && docElemProp ||
+                               body && body[ "client" + name ] || docElemProp;
+
+               // Get document width or height
+               } else if ( elem.nodeType === 9 ) {
+                       // Either scroll[Width/Height] or offset[Width/Height], whichever is greater
+                       return Math.max(
+                               elem.documentElement["client" + name],
+                               elem.body["scroll" + name], elem.documentElement["scroll" + name],
+                               elem.body["offset" + name], elem.documentElement["offset" + name]
+                       );
+
+               // Get or set width or height on the element
+               } else if ( size === undefined ) {
+                       var orig = jQuery.css( elem, type ),
+                               ret = parseFloat( orig );
+
+                       return jQuery.isNumeric( ret ) ? ret : orig;
+
+               // Set the width or height on the element (default to pixels if value is unitless)
+               } else {
+                       return this.css( type, typeof size === "string" ? size : size + "px" );
+               }
+       };
+
+});
+
+
+
+
+// Expose jQuery to the global object
+window.jQuery = window.$ = jQuery;
+
+// Expose jQuery as an AMD module, but only for AMD loaders that
+// understand the issues with loading multiple versions of jQuery
+// in a page that all might call define(). The loader will indicate
+// they have special allowances for multiple jQuery versions by
+// specifying define.amd.jQuery = true. Register as a named module,
+// since jQuery can be concatenated with other files that may use define,
+// but not use a proper concatenation script that understands anonymous
+// AMD modules. A named AMD is safest and most robust way to register.
+// Lowercase jquery is used because AMD module names are derived from
+// file names, and jQuery is normally delivered in a lowercase file name.
+// Do this after creating the global so that if an AMD module wants to call
+// noConflict to hide this version of jQuery, it will work.
+if ( typeof define === "function" && define.amd && define.amd.jQuery ) {
+       define( "jquery", [], function () { return jQuery; } );
+}
+
+
+
+})( window );
diff --git a/jquery/jquery.ba-1.3-hashchange.js b/jquery/jquery.ba-1.3-hashchange.js
new file mode 100644 (file)
index 0000000..47105f4
--- /dev/null
@@ -0,0 +1,390 @@
+/*!
+ * jQuery hashchange event - v1.3 - 7/21/2010
+ * http://benalman.com/projects/jquery-hashchange-plugin/
+ * 
+ * Copyright (c) 2010 "Cowboy" Ben Alman
+ * Dual licensed under the MIT and GPL licenses.
+ * http://benalman.com/about/license/
+ */
+
+// Script: jQuery hashchange event
+//
+// *Version: 1.3, Last updated: 7/21/2010*
+// 
+// Project Home - http://benalman.com/projects/jquery-hashchange-plugin/
+// GitHub       - http://github.com/cowboy/jquery-hashchange/
+// Source       - http://github.com/cowboy/jquery-hashchange/raw/master/jquery.ba-hashchange.js
+// (Minified)   - http://github.com/cowboy/jquery-hashchange/raw/master/jquery.ba-hashchange.min.js (0.8kb gzipped)
+// 
+// About: License
+// 
+// Copyright (c) 2010 "Cowboy" Ben Alman,
+// Dual licensed under the MIT and GPL licenses.
+// http://benalman.com/about/license/
+// 
+// About: Examples
+// 
+// These working examples, complete with fully commented code, illustrate a few
+// ways in which this plugin can be used.
+// 
+// hashchange event - http://benalman.com/code/projects/jquery-hashchange/examples/hashchange/
+// document.domain - http://benalman.com/code/projects/jquery-hashchange/examples/document_domain/
+// 
+// About: Support and Testing
+// 
+// Information about what version or versions of jQuery this plugin has been
+// tested with, what browsers it has been tested in, and where the unit tests
+// reside (so you can test it yourself).
+// 
+// jQuery Versions - 1.2.6, 1.3.2, 1.4.1, 1.4.2
+// Browsers Tested - Internet Explorer 6-8, Firefox 2-4, Chrome 5-6, Safari 3.2-5,
+//                   Opera 9.6-10.60, iPhone 3.1, Android 1.6-2.2, BlackBerry 4.6-5.
+// Unit Tests      - http://benalman.com/code/projects/jquery-hashchange/unit/
+// 
+// About: Known issues
+// 
+// While this jQuery hashchange event implementation is quite stable and
+// robust, there are a few unfortunate browser bugs surrounding expected
+// hashchange event-based behaviors, independent of any JavaScript
+// window.onhashchange abstraction. See the following examples for more
+// information:
+// 
+// Chrome: Back Button - http://benalman.com/code/projects/jquery-hashchange/examples/bug-chrome-back-button/
+// Firefox: Remote XMLHttpRequest - http://benalman.com/code/projects/jquery-hashchange/examples/bug-firefox-remote-xhr/
+// WebKit: Back Button in an Iframe - http://benalman.com/code/projects/jquery-hashchange/examples/bug-webkit-hash-iframe/
+// Safari: Back Button from a different domain - http://benalman.com/code/projects/jquery-hashchange/examples/bug-safari-back-from-diff-domain/
+// 
+// Also note that should a browser natively support the window.onhashchange 
+// event, but not report that it does, the fallback polling loop will be used.
+// 
+// About: Release History
+// 
+// 1.3   - (7/21/2010) Reorganized IE6/7 Iframe code to make it more
+//         "removable" for mobile-only development. Added IE6/7 document.title
+//         support. Attempted to make Iframe as hidden as possible by using
+//         techniques from http://www.paciellogroup.com/blog/?p=604. Added 
+//         support for the "shortcut" format $(window).hashchange( fn ) and
+//         $(window).hashchange() like jQuery provides for built-in events.
+//         Renamed jQuery.hashchangeDelay to <jQuery.fn.hashchange.delay> and
+//         lowered its default value to 50. Added <jQuery.fn.hashchange.domain>
+//         and <jQuery.fn.hashchange.src> properties plus document-domain.html
+//         file to address access denied issues when setting document.domain in
+//         IE6/7.
+// 1.2   - (2/11/2010) Fixed a bug where coming back to a page using this plugin
+//         from a page on another domain would cause an error in Safari 4. Also,
+//         IE6/7 Iframe is now inserted after the body (this actually works),
+//         which prevents the page from scrolling when the event is first bound.
+//         Event can also now be bound before DOM ready, but it won't be usable
+//         before then in IE6/7.
+// 1.1   - (1/21/2010) Incorporated document.documentMode test to fix IE8 bug
+//         where browser version is incorrectly reported as 8.0, despite
+//         inclusion of the X-UA-Compatible IE=EmulateIE7 meta tag.
+// 1.0   - (1/9/2010) Initial Release. Broke out the jQuery BBQ event.special
+//         window.onhashchange functionality into a separate plugin for users
+//         who want just the basic event & back button support, without all the
+//         extra awesomeness that BBQ provides. This plugin will be included as
+//         part of jQuery BBQ, but also be available separately.
+
+(function($,window,undefined){
+  '$:nomunge'; // Used by YUI compressor.
+  
+  // Reused string.
+  var str_hashchange = 'hashchange',
+    
+    // Method / object references.
+    doc = document,
+    fake_onhashchange,
+    special = $.event.special,
+    
+    // Does the browser support window.onhashchange? Note that IE8 running in
+    // IE7 compatibility mode reports true for 'onhashchange' in window, even
+    // though the event isn't supported, so also test document.documentMode.
+    doc_mode = doc.documentMode,
+    supports_onhashchange = 'on' + str_hashchange in window && ( doc_mode === undefined || doc_mode > 7 );
+  
+  // Get location.hash (or what you'd expect location.hash to be) sans any
+  // leading #. Thanks for making this necessary, Firefox!
+  function get_fragment( url ) {
+    url = url || location.href;
+    return '#' + url.replace( /^[^#]*#?(.*)$/, '$1' );
+  };
+  
+  // Method: jQuery.fn.hashchange
+  // 
+  // Bind a handler to the window.onhashchange event or trigger all bound
+  // window.onhashchange event handlers. This behavior is consistent with
+  // jQuery's built-in event handlers.
+  // 
+  // Usage:
+  // 
+  // > jQuery(window).hashchange( [ handler ] );
+  // 
+  // Arguments:
+  // 
+  //  handler - (Function) Optional handler to be bound to the hashchange
+  //    event. This is a "shortcut" for the more verbose form:
+  //    jQuery(window).bind( 'hashchange', handler ). If handler is omitted,
+  //    all bound window.onhashchange event handlers will be triggered. This
+  //    is a shortcut for the more verbose
+  //    jQuery(window).trigger( 'hashchange' ). These forms are described in
+  //    the <hashchange event> section.
+  // 
+  // Returns:
+  // 
+  //  (jQuery) The initial jQuery collection of elements.
+  
+  // Allow the "shortcut" format $(elem).hashchange( fn ) for binding and
+  // $(elem).hashchange() for triggering, like jQuery does for built-in events.
+  $.fn[ str_hashchange ] = function( fn ) {
+    return fn ? this.bind( str_hashchange, fn ) : this.trigger( str_hashchange );
+  };
+  
+  // Property: jQuery.fn.hashchange.delay
+  // 
+  // The numeric interval (in milliseconds) at which the <hashchange event>
+  // polling loop executes. Defaults to 50.
+  
+  // Property: jQuery.fn.hashchange.domain
+  // 
+  // If you're setting document.domain in your JavaScript, and you want hash
+  // history to work in IE6/7, not only must this property be set, but you must
+  // also set document.domain BEFORE jQuery is loaded into the page. This
+  // property is only applicable if you are supporting IE6/7 (or IE8 operating
+  // in "IE7 compatibility" mode).
+  // 
+  // In addition, the <jQuery.fn.hashchange.src> property must be set to the
+  // path of the included "document-domain.html" file, which can be renamed or
+  // modified if necessary (note that the document.domain specified must be the
+  // same in both your main JavaScript as well as in this file).
+  // 
+  // Usage:
+  // 
+  // jQuery.fn.hashchange.domain = document.domain;
+  
+  // Property: jQuery.fn.hashchange.src
+  // 
+  // If, for some reason, you need to specify an Iframe src file (for example,
+  // when setting document.domain as in <jQuery.fn.hashchange.domain>), you can
+  // do so using this property. Note that when using this property, history
+  // won't be recorded in IE6/7 until the Iframe src file loads. This property
+  // is only applicable if you are supporting IE6/7 (or IE8 operating in "IE7
+  // compatibility" mode).
+  // 
+  // Usage:
+  // 
+  // jQuery.fn.hashchange.src = 'path/to/file.html';
+  
+  $.fn[ str_hashchange ].delay = 50;
+  /*
+  $.fn[ str_hashchange ].domain = null;
+  $.fn[ str_hashchange ].src = null;
+  */
+  
+  // Event: hashchange event
+  // 
+  // Fired when location.hash changes. In browsers that support it, the native
+  // HTML5 window.onhashchange event is used, otherwise a polling loop is
+  // initialized, running every <jQuery.fn.hashchange.delay> milliseconds to
+  // see if the hash has changed. In IE6/7 (and IE8 operating in "IE7
+  // compatibility" mode), a hidden Iframe is created to allow the back button
+  // and hash-based history to work.
+  // 
+  // Usage as described in <jQuery.fn.hashchange>:
+  // 
+  // > // Bind an event handler.
+  // > jQuery(window).hashchange( function(e) {
+  // >   var hash = location.hash;
+  // >   ...
+  // > });
+  // > 
+  // > // Manually trigger the event handler.
+  // > jQuery(window).hashchange();
+  // 
+  // A more verbose usage that allows for event namespacing:
+  // 
+  // > // Bind an event handler.
+  // > jQuery(window).bind( 'hashchange', function(e) {
+  // >   var hash = location.hash;
+  // >   ...
+  // > });
+  // > 
+  // > // Manually trigger the event handler.
+  // > jQuery(window).trigger( 'hashchange' );
+  // 
+  // Additional Notes:
+  // 
+  // * The polling loop and Iframe are not created until at least one handler
+  //   is actually bound to the 'hashchange' event.
+  // * If you need the bound handler(s) to execute immediately, in cases where
+  //   a location.hash exists on page load, via bookmark or page refresh for
+  //   example, use jQuery(window).hashchange() or the more verbose 
+  //   jQuery(window).trigger( 'hashchange' ).
+  // * The event can be bound before DOM ready, but since it won't be usable
+  //   before then in IE6/7 (due to the necessary Iframe), recommended usage is
+  //   to bind it inside a DOM ready handler.
+  
+  // Override existing $.event.special.hashchange methods (allowing this plugin
+  // to be defined after jQuery BBQ in BBQ's source code).
+  special[ str_hashchange ] = $.extend( special[ str_hashchange ], {
+    
+    // Called only when the first 'hashchange' event is bound to window.
+    setup: function() {
+      // If window.onhashchange is supported natively, there's nothing to do..
+      if ( supports_onhashchange ) { return false; }
+      
+      // Otherwise, we need to create our own. And we don't want to call this
+      // until the user binds to the event, just in case they never do, since it
+      // will create a polling loop and possibly even a hidden Iframe.
+      $( fake_onhashchange.start );
+    },
+    
+    // Called only when the last 'hashchange' event is unbound from window.
+    teardown: function() {
+      // If window.onhashchange is supported natively, there's nothing to do..
+      if ( supports_onhashchange ) { return false; }
+      
+      // Otherwise, we need to stop ours (if possible).
+      $( fake_onhashchange.stop );
+    }
+    
+  });
+  
+  // fake_onhashchange does all the work of triggering the window.onhashchange
+  // event for browsers that don't natively support it, including creating a
+  // polling loop to watch for hash changes and in IE 6/7 creating a hidden
+  // Iframe to enable back and forward.
+  fake_onhashchange = (function(){
+    var self = {},
+      timeout_id,
+      
+      // Remember the initial hash so it doesn't get triggered immediately.
+      last_hash = get_fragment(),
+      
+      fn_retval = function(val){ return val; },
+      history_set = fn_retval,
+      history_get = fn_retval;
+    
+    // Start the polling loop.
+    self.start = function() {
+      timeout_id || poll();
+    };
+    
+    // Stop the polling loop.
+    self.stop = function() {
+      timeout_id && clearTimeout( timeout_id );
+      timeout_id = undefined;
+    };
+    
+    // This polling loop checks every $.fn.hashchange.delay milliseconds to see
+    // if location.hash has changed, and triggers the 'hashchange' event on
+    // window when necessary.
+    function poll() {
+      var hash = get_fragment(),
+        history_hash = history_get( last_hash );
+      
+      if ( hash !== last_hash ) {
+        history_set( last_hash = hash, history_hash );
+        
+        $(window).trigger( str_hashchange );
+        
+      } else if ( history_hash !== last_hash ) {
+        location.href = location.href.replace( /#.*/, '' ) + history_hash;
+      }
+      
+      timeout_id = setTimeout( poll, $.fn[ str_hashchange ].delay );
+    };
+    
+    // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
+    // vvvvvvvvvvvvvvvvvvv REMOVE IF NOT SUPPORTING IE6/7/8 vvvvvvvvvvvvvvvvvvv
+    // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
+    $.browser.msie && !supports_onhashchange && (function(){
+      // Not only do IE6/7 need the "magical" Iframe treatment, but so does IE8
+      // when running in "IE7 compatibility" mode.
+      
+      var iframe,
+        iframe_src;
+      
+      // When the event is bound and polling starts in IE 6/7, create a hidden
+      // Iframe for history handling.
+      self.start = function(){
+        if ( !iframe ) {
+          iframe_src = $.fn[ str_hashchange ].src;
+          iframe_src = iframe_src && iframe_src + get_fragment();
+          
+          // Create hidden Iframe. Attempt to make Iframe as hidden as possible
+          // by using techniques from http://www.paciellogroup.com/blog/?p=604.
+          iframe = $('<iframe tabindex="-1" title="empty"/>').hide()
+            
+            // When Iframe has completely loaded, initialize the history and
+            // start polling.
+            .one( 'load', function(){
+              iframe_src || history_set( get_fragment() );
+              poll();
+            })
+            
+            // Load Iframe src if specified, otherwise nothing.
+            .attr( 'src', iframe_src || 'javascript:0' )
+            
+            // Append Iframe after the end of the body to prevent unnecessary
+            // initial page scrolling (yes, this works).
+            .insertAfter( 'body' )[0].contentWindow;
+          
+          // Whenever `document.title` changes, update the Iframe's title to
+          // prettify the back/next history menu entries. Since IE sometimes
+          // errors with "Unspecified error" the very first time this is set
+          // (yes, very useful) wrap this with a try/catch block.
+          doc.onpropertychange = function(){
+            try {
+              if ( event.propertyName === 'title' ) {
+                iframe.document.title = doc.title;
+              }
+            } catch(e) {}
+          };
+          
+        }
+      };
+      
+      // Override the "stop" method since an IE6/7 Iframe was created. Even
+      // if there are no longer any bound event handlers, the polling loop
+      // is still necessary for back/next to work at all!
+      self.stop = fn_retval;
+      
+      // Get history by looking at the hidden Iframe's location.hash.
+      history_get = function() {
+        return get_fragment( iframe.location.href );
+      };
+      
+      // Set a new history item by opening and then closing the Iframe
+      // document, *then* setting its location.hash. If document.domain has
+      // been set, update that as well.
+      history_set = function( hash, history_hash ) {
+        var iframe_doc = iframe.document,
+          domain = $.fn[ str_hashchange ].domain;
+        
+        if ( hash !== history_hash ) {
+          // Update Iframe with any initial `document.title` that might be set.
+          iframe_doc.title = doc.title;
+          
+          // Opening the Iframe's document after it has been closed is what
+          // actually adds a history entry.
+          iframe_doc.open();
+          
+          // Set document.domain for the Iframe document as well, if necessary.
+          domain && iframe_doc.write( '<script>document.domain="' + domain + '"</script>' );
+          
+          iframe_doc.close();
+          
+          // Update the Iframe's hash, for great justice.
+          iframe.location.hash = hash;
+        }
+      };
+      
+    })();
+    // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+    // ^^^^^^^^^^^^^^^^^^^ REMOVE IF NOT SUPPORTING IE6/7/8 ^^^^^^^^^^^^^^^^^^^
+    // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+    
+    return self;
+  })();
+  
+})(jQuery,this);
diff --git a/jquery/jquery.scrollTo-1.4.2.js b/jquery/jquery.scrollTo-1.4.2.js
new file mode 100644 (file)
index 0000000..eec31e1
--- /dev/null
@@ -0,0 +1,215 @@
+/**\r
+ * jQuery.ScrollTo\r
+ * Copyright (c) 2007-2009 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com\r
+ * Dual licensed under MIT and GPL.\r
+ * Date: 5/25/2009\r
+ *\r
+ * @projectDescription Easy element scrolling using jQuery.\r
+ * http://flesler.blogspot.com/2007/10/jqueryscrollto.html\r
+ * Works with jQuery +1.2.6. Tested on FF 2/3, IE 6/7/8, Opera 9.5/6, Safari 3, Chrome 1 on WinXP.\r
+ *\r
+ * @author Ariel Flesler\r
+ * @version 1.4.2\r
+ *\r
+ * @id jQuery.scrollTo\r
+ * @id jQuery.fn.scrollTo\r
+ * @param {String, Number, DOMElement, jQuery, Object} target Where to scroll the matched elements.\r
+ *       The different options for target are:\r
+ *             - A number position (will be applied to all axes).\r
+ *             - A string position ('44', '100px', '+=90', etc ) will be applied to all axes\r
+ *             - A jQuery/DOM element ( logically, child of the element to scroll )\r
+ *             - A string selector, that will be relative to the element to scroll ( 'li:eq(2)', etc )\r
+ *             - A hash { top:x, left:y }, x and y can be any kind of number/string like above.\r
+*              - A percentage of the container's dimension/s, for example: 50% to go to the middle.\r
+ *             - The string 'max' for go-to-end. \r
+ * @param {Number} duration The OVERALL length of the animation, this argument can be the settings object instead.\r
+ * @param {Object,Function} settings Optional set of settings or the onAfter callback.\r
+ *      @option {String} axis Which axis must be scrolled, use 'x', 'y', 'xy' or 'yx'.\r
+ *      @option {Number} duration The OVERALL length of the animation.\r
+ *      @option {String} easing The easing method for the animation.\r
+ *      @option {Boolean} margin If true, the margin of the target element will be deducted from the final position.\r
+ *      @option {Object, Number} offset Add/deduct from the end position. One number for both axes or { top:x, left:y }.\r
+ *      @option {Object, Number} over Add/deduct the height/width multiplied by 'over', can be { top:x, left:y } when using both axes.\r
+ *      @option {Boolean} queue If true, and both axis are given, the 2nd axis will only be animated after the first one ends.\r
+ *      @option {Function} onAfter Function to be called after the scrolling ends. \r
+ *      @option {Function} onAfterFirst If queuing is activated, this function will be called after the first scrolling ends.\r
+ * @return {jQuery} Returns the same jQuery object, for chaining.\r
+ *\r
+ * @desc Scroll to a fixed position\r
+ * @example $('div').scrollTo( 340 );\r
+ *\r
+ * @desc Scroll relatively to the actual position\r
+ * @example $('div').scrollTo( '+=340px', { axis:'y' } );\r
+ *\r
+ * @dec Scroll using a selector (relative to the scrolled element)\r
+ * @example $('div').scrollTo( 'p.paragraph:eq(2)', 500, { easing:'swing', queue:true, axis:'xy' } );\r
+ *\r
+ * @ Scroll to a DOM element (same for jQuery object)\r
+ * @example var second_child = document.getElementById('container').firstChild.nextSibling;\r
+ *                     $('#container').scrollTo( second_child, { duration:500, axis:'x', onAfter:function(){\r
+ *                             alert('scrolled!!');                                                                                                                               \r
+ *                     }});\r
+ *\r
+ * @desc Scroll on both axes, to different values\r
+ * @example $('div').scrollTo( { top: 300, left:'+=200' }, { axis:'xy', offset:-20 } );\r
+ */\r
+;(function( $ ){\r
+       \r
+       var $scrollTo = $.scrollTo = function( target, duration, settings ){\r
+               $(window).scrollTo( target, duration, settings );\r
+       };\r
+\r
+       $scrollTo.defaults = {\r
+               axis:'xy',\r
+               duration: parseFloat($.fn.jquery) >= 1.3 ? 0 : 1\r
+       };\r
+\r
+       // Returns the element that needs to be animated to scroll the window.\r
+       // Kept for backwards compatibility (specially for localScroll & serialScroll)\r
+       $scrollTo.window = function( scope ){\r
+               return $(window)._scrollable();\r
+       };\r
+\r
+       // Hack, hack, hack :)\r
+       // Returns the real elements to scroll (supports window/iframes, documents and regular nodes)\r
+       $.fn._scrollable = function(){\r
+               return this.map(function(){\r
+                       var elem = this,\r
+                               isWin = !elem.nodeName || $.inArray( elem.nodeName.toLowerCase(), ['iframe','#document','html','body'] ) != -1;\r
+\r
+                               if( !isWin )\r
+                                       return elem;\r
+\r
+                       var doc = (elem.contentWindow || elem).document || elem.ownerDocument || elem;\r
+                       \r
+                       return $.browser.safari || doc.compatMode == 'BackCompat' ?\r
+                               doc.body : \r
+                               doc.documentElement;\r
+               });\r
+       };\r
+\r
+       $.fn.scrollTo = function( target, duration, settings ){\r
+               if( typeof duration == 'object' ){\r
+                       settings = duration;\r
+                       duration = 0;\r
+               }\r
+               if( typeof settings == 'function' )\r
+                       settings = { onAfter:settings };\r
+                       \r
+               if( target == 'max' )\r
+                       target = 9e9;\r
+                       \r
+               settings = $.extend( {}, $scrollTo.defaults, settings );\r
+               // Speed is still recognized for backwards compatibility\r
+               duration = duration || settings.speed || settings.duration;\r
+               // Make sure the settings are given right\r
+               settings.queue = settings.queue && settings.axis.length > 1;\r
+               \r
+               if( settings.queue )\r
+                       // Let's keep the overall duration\r
+                       duration /= 2;\r
+               settings.offset = both( settings.offset );\r
+               settings.over = both( settings.over );\r
+\r
+               return this._scrollable().each(function(){\r
+                       var elem = this,\r
+                               $elem = $(elem),\r
+                               targ = target, toff, attr = {},\r
+                               win = $elem.is('html,body');\r
+\r
+                       switch( typeof targ ){\r
+                               // A number will pass the regex\r
+                               case 'number':\r
+                               case 'string':\r
+                                       if( /^([+-]=)?\d+(\.\d+)?(px|%)?$/.test(targ) ){\r
+                                               targ = both( targ );\r
+                                               // We are done\r
+                                               break;\r
+                                       }\r
+                                       // Relative selector, no break!\r
+                                       targ = $(targ,this);\r
+                               case 'object':\r
+                                       // DOMElement / jQuery\r
+                                       if( targ.is || targ.style )\r
+                                               // Get the real position of the target \r
+                                               toff = (targ = $(targ)).offset();\r
+                       }\r
+                       $.each( settings.axis.split(''), function( i, axis ){\r
+                               var Pos = axis == 'x' ? 'Left' : 'Top',\r
+                                       pos = Pos.toLowerCase(),\r
+                                       key = 'scroll' + Pos,\r
+                                       old = elem[key],\r
+                                       max = $scrollTo.max(elem, axis);\r
+\r
+                               if( toff ){// jQuery / DOMElement\r
+                                       attr[key] = toff[pos] + ( win ? 0 : old - $elem.offset()[pos] );\r
+\r
+                                       // If it's a dom element, reduce the margin\r
+                                       if( settings.margin ){\r
+                                               attr[key] -= parseInt(targ.css('margin'+Pos)) || 0;\r
+                                               attr[key] -= parseInt(targ.css('border'+Pos+'Width')) || 0;\r
+                                       }\r
+                                       \r
+                                       attr[key] += settings.offset[pos] || 0;\r
+                                       \r
+                                       if( settings.over[pos] )\r
+                                               // Scroll to a fraction of its width/height\r
+                                               attr[key] += targ[axis=='x'?'width':'height']() * settings.over[pos];\r
+                               }else{ \r
+                                       var val = targ[pos];\r
+                                       // Handle percentage values\r
+                                       attr[key] = val.slice && val.slice(-1) == '%' ? \r
+                                               parseFloat(val) / 100 * max\r
+                                               : val;\r
+                               }\r
+\r
+                               // Number or 'number'\r
+                               if( /^\d+$/.test(attr[key]) )\r
+                                       // Check the limits\r
+                                       attr[key] = attr[key] <= 0 ? 0 : Math.min( attr[key], max );\r
+\r
+                               // Queueing axes\r
+                               if( !i && settings.queue ){\r
+                                       // Don't waste time animating, if there's no need.\r
+                                       if( old != attr[key] )\r
+                                               // Intermediate animation\r
+                                               animate( settings.onAfterFirst );\r
+                                       // Don't animate this axis again in the next iteration.\r
+                                       delete attr[key];\r
+                               }\r
+                       });\r
+\r
+                       animate( settings.onAfter );                    \r
+\r
+                       function animate( callback ){\r
+                               $elem.animate( attr, duration, settings.easing, callback && function(){\r
+                                       callback.call(this, target, settings);\r
+                               });\r
+                       };\r
+\r
+               }).end();\r
+       };\r
+       \r
+       // Max scrolling position, works on quirks mode\r
+       // It only fails (not too badly) on IE, quirks mode.\r
+       $scrollTo.max = function( elem, axis ){\r
+               var Dim = axis == 'x' ? 'Width' : 'Height',\r
+                       scroll = 'scroll'+Dim;\r
+               \r
+               if( !$(elem).is('html,body') )\r
+                       return elem[scroll] - $(elem)[Dim.toLowerCase()]();\r
+               \r
+               var size = 'client' + Dim,\r
+                       html = elem.ownerDocument.documentElement,\r
+                       body = elem.ownerDocument.body;\r
+\r
+               return Math.max( html[scroll], body[scroll] ) \r
+                        - Math.min( html[size]  , body[size]   );\r
+                       \r
+       };\r
+\r
+       function both( val ){\r
+               return typeof val == 'object' ? val : { top:val, left:val };\r
+       };\r
+\r
+})( jQuery );
\ No newline at end of file
diff --git a/jquery/jquery.ui-1.8.18.core.js b/jquery/jquery.ui-1.8.18.core.js
new file mode 100644 (file)
index 0000000..98b4f9b
--- /dev/null
@@ -0,0 +1,319 @@
+/*!
+ * jQuery UI 1.8.18
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI
+ */
+(function( $, undefined ) {
+
+// prevent duplicate loading
+// this is only a problem because we proxy existing functions
+// and we don't want to double proxy them
+$.ui = $.ui || {};
+if ( $.ui.version ) {
+       return;
+}
+
+$.extend( $.ui, {
+       version: "1.8.18",
+
+       keyCode: {
+               ALT: 18,
+               BACKSPACE: 8,
+               CAPS_LOCK: 20,
+               COMMA: 188,
+               COMMAND: 91,
+               COMMAND_LEFT: 91, // COMMAND
+               COMMAND_RIGHT: 93,
+               CONTROL: 17,
+               DELETE: 46,
+               DOWN: 40,
+               END: 35,
+               ENTER: 13,
+               ESCAPE: 27,
+               HOME: 36,
+               INSERT: 45,
+               LEFT: 37,
+               MENU: 93, // COMMAND_RIGHT
+               NUMPAD_ADD: 107,
+               NUMPAD_DECIMAL: 110,
+               NUMPAD_DIVIDE: 111,
+               NUMPAD_ENTER: 108,
+               NUMPAD_MULTIPLY: 106,
+               NUMPAD_SUBTRACT: 109,
+               PAGE_DOWN: 34,
+               PAGE_UP: 33,
+               PERIOD: 190,
+               RIGHT: 39,
+               SHIFT: 16,
+               SPACE: 32,
+               TAB: 9,
+               UP: 38,
+               WINDOWS: 91 // COMMAND
+       }
+});
+
+// plugins
+$.fn.extend({
+       propAttr: $.fn.prop || $.fn.attr,
+
+       _focus: $.fn.focus,
+       focus: function( delay, fn ) {
+               return typeof delay === "number" ?
+                       this.each(function() {
+                               var elem = this;
+                               setTimeout(function() {
+                                       $( elem ).focus();
+                                       if ( fn ) {
+                                               fn.call( elem );
+                                       }
+                               }, delay );
+                       }) :
+                       this._focus.apply( this, arguments );
+       },
+
+       scrollParent: function() {
+               var scrollParent;
+               if (($.browser.msie && (/(static|relative)/).test(this.css('position'))) || (/absolute/).test(this.css('position'))) {
+                       scrollParent = this.parents().filter(function() {
+                               return (/(relative|absolute|fixed)/).test($.curCSS(this,'position',1)) && (/(auto|scroll)/).test($.curCSS(this,'overflow',1)+$.curCSS(this,'overflow-y',1)+$.curCSS(this,'overflow-x',1));
+                       }).eq(0);
+               } else {
+                       scrollParent = this.parents().filter(function() {
+                               return (/(auto|scroll)/).test($.curCSS(this,'overflow',1)+$.curCSS(this,'overflow-y',1)+$.curCSS(this,'overflow-x',1));
+                       }).eq(0);
+               }
+
+               return (/fixed/).test(this.css('position')) || !scrollParent.length ? $(document) : scrollParent;
+       },
+
+       zIndex: function( zIndex ) {
+               if ( zIndex !== undefined ) {
+                       return this.css( "zIndex", zIndex );
+               }
+
+               if ( this.length ) {
+                       var elem = $( this[ 0 ] ), position, value;
+                       while ( elem.length && elem[ 0 ] !== document ) {
+                               // Ignore z-index if position is set to a value where z-index is ignored by the browser
+                               // This makes behavior of this function consistent across browsers
+                               // WebKit always returns auto if the element is positioned
+                               position = elem.css( "position" );
+                               if ( position === "absolute" || position === "relative" || position === "fixed" ) {
+                                       // IE returns 0 when zIndex is not specified
+                                       // other browsers return a string
+                                       // we ignore the case of nested elements with an explicit value of 0
+                                       // <div style="z-index: -10;"><div style="z-index: 0;"></div></div>
+                                       value = parseInt( elem.css( "zIndex" ), 10 );
+                                       if ( !isNaN( value ) && value !== 0 ) {
+                                               return value;
+                                       }
+                               }
+                               elem = elem.parent();
+                       }
+               }
+
+               return 0;
+       },
+
+       disableSelection: function() {
+               return this.bind( ( $.support.selectstart ? "selectstart" : "mousedown" ) +
+                       ".ui-disableSelection", function( event ) {
+                               event.preventDefault();
+                       });
+       },
+
+       enableSelection: function() {
+               return this.unbind( ".ui-disableSelection" );
+       }
+});
+
+$.each( [ "Width", "Height" ], function( i, name ) {
+       var side = name === "Width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ],
+               type = name.toLowerCase(),
+               orig = {
+                       innerWidth: $.fn.innerWidth,
+                       innerHeight: $.fn.innerHeight,
+                       outerWidth: $.fn.outerWidth,
+                       outerHeight: $.fn.outerHeight
+               };
+
+       function reduce( elem, size, border, margin ) {
+               $.each( side, function() {
+                       size -= parseFloat( $.curCSS( elem, "padding" + this, true) ) || 0;
+                       if ( border ) {
+                               size -= parseFloat( $.curCSS( elem, "border" + this + "Width", true) ) || 0;
+                       }
+                       if ( margin ) {
+                               size -= parseFloat( $.curCSS( elem, "margin" + this, true) ) || 0;
+                       }
+               });
+               return size;
+       }
+
+       $.fn[ "inner" + name ] = function( size ) {
+               if ( size === undefined ) {
+                       return orig[ "inner" + name ].call( this );
+               }
+
+               return this.each(function() {
+                       $( this ).css( type, reduce( this, size ) + "px" );
+               });
+       };
+
+       $.fn[ "outer" + name] = function( size, margin ) {
+               if ( typeof size !== "number" ) {
+                       return orig[ "outer" + name ].call( this, size );
+               }
+
+               return this.each(function() {
+                       $( this).css( type, reduce( this, size, true, margin ) + "px" );
+               });
+       };
+});
+
+// selectors
+function focusable( element, isTabIndexNotNaN ) {
+       var nodeName = element.nodeName.toLowerCase();
+       if ( "area" === nodeName ) {
+               var map = element.parentNode,
+                       mapName = map.name,
+                       img;
+               if ( !element.href || !mapName || map.nodeName.toLowerCase() !== "map" ) {
+                       return false;
+               }
+               img = $( "img[usemap=#" + mapName + "]" )[0];
+               return !!img && visible( img );
+       }
+       return ( /input|select|textarea|button|object/.test( nodeName )
+               ? !element.disabled
+               : "a" == nodeName
+                       ? element.href || isTabIndexNotNaN
+                       : isTabIndexNotNaN)
+               // the element and all of its ancestors must be visible
+               && visible( element );
+}
+
+function visible( element ) {
+       return !$( element ).parents().andSelf().filter(function() {
+               return $.curCSS( this, "visibility" ) === "hidden" ||
+                       $.expr.filters.hidden( this );
+       }).length;
+}
+
+$.extend( $.expr[ ":" ], {
+       data: function( elem, i, match ) {
+               return !!$.data( elem, match[ 3 ] );
+       },
+
+       focusable: function( element ) {
+               return focusable( element, !isNaN( $.attr( element, "tabindex" ) ) );
+       },
+
+       tabbable: function( element ) {
+               var tabIndex = $.attr( element, "tabindex" ),
+                       isTabIndexNaN = isNaN( tabIndex );
+               return ( isTabIndexNaN || tabIndex >= 0 ) && focusable( element, !isTabIndexNaN );
+       }
+});
+
+// support
+$(function() {
+       var body = document.body,
+               div = body.appendChild( div = document.createElement( "div" ) );
+
+       // access offsetHeight before setting the style to prevent a layout bug
+       // in IE 9 which causes the elemnt to continue to take up space even
+       // after it is removed from the DOM (#8026)
+       div.offsetHeight;
+
+       $.extend( div.style, {
+               minHeight: "100px",
+               height: "auto",
+               padding: 0,
+               borderWidth: 0
+       });
+
+       $.support.minHeight = div.offsetHeight === 100;
+       $.support.selectstart = "onselectstart" in div;
+
+       // set display to none to avoid a layout bug in IE
+       // http://dev.jquery.com/ticket/4014
+       body.removeChild( div ).style.display = "none";
+});
+
+
+
+
+
+// deprecated
+$.extend( $.ui, {
+       // $.ui.plugin is deprecated.  Use the proxy pattern instead.
+       plugin: {
+               add: function( module, option, set ) {
+                       var proto = $.ui[ module ].prototype;
+                       for ( var i in set ) {
+                               proto.plugins[ i ] = proto.plugins[ i ] || [];
+                               proto.plugins[ i ].push( [ option, set[ i ] ] );
+                       }
+               },
+               call: function( instance, name, args ) {
+                       var set = instance.plugins[ name ];
+                       if ( !set || !instance.element[ 0 ].parentNode ) {
+                               return;
+                       }
+       
+                       for ( var i = 0; i < set.length; i++ ) {
+                               if ( instance.options[ set[ i ][ 0 ] ] ) {
+                                       set[ i ][ 1 ].apply( instance.element, args );
+                               }
+                       }
+               }
+       },
+       
+       // will be deprecated when we switch to jQuery 1.4 - use jQuery.contains()
+       contains: function( a, b ) {
+               return document.compareDocumentPosition ?
+                       a.compareDocumentPosition( b ) & 16 :
+                       a !== b && a.contains( b );
+       },
+       
+       // only used by resizable
+       hasScroll: function( el, a ) {
+       
+               //If overflow is hidden, the element might have extra content, but the user wants to hide it
+               if ( $( el ).css( "overflow" ) === "hidden") {
+                       return false;
+               }
+       
+               var scroll = ( a && a === "left" ) ? "scrollLeft" : "scrollTop",
+                       has = false;
+       
+               if ( el[ scroll ] > 0 ) {
+                       return true;
+               }
+       
+               // TODO: determine which cases actually cause this to happen
+               // if the element doesn't have the scroll set, see if it's possible to
+               // set the scroll
+               el[ scroll ] = 1;
+               has = ( el[ scroll ] > 0 );
+               el[ scroll ] = 0;
+               return has;
+       },
+       
+       // these are odd functions, fix the API or move into individual plugins
+       isOverAxis: function( x, reference, size ) {
+               //Determines when x coordinate is over "b" element axis
+               return ( x > reference ) && ( x < ( reference + size ) );
+       },
+       isOver: function( y, x, top, left, height, width ) {
+               //Determines when x, y coordinates is over "b" element
+               return $.ui.isOverAxis( y, top, height ) && $.ui.isOverAxis( x, left, width );
+       }
+});
+
+})( jQuery );
diff --git a/jquery/jquery.ui-1.8.18.mouse.js b/jquery/jquery.ui-1.8.18.mouse.js
new file mode 100644 (file)
index 0000000..669d563
--- /dev/null
@@ -0,0 +1,162 @@
+/*!
+ * jQuery UI Mouse 1.8.18
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Mouse
+ *
+ * Depends:
+ *     jquery.ui.widget.js
+ */
+(function( $, undefined ) {
+
+var mouseHandled = false;
+$( document ).mouseup( function( e ) {
+       mouseHandled = false;
+});
+
+$.widget("ui.mouse", {
+       options: {
+               cancel: ':input,option',
+               distance: 1,
+               delay: 0
+       },
+       _mouseInit: function() {
+               var self = this;
+
+               this.element
+                       .bind('mousedown.'+this.widgetName, function(event) {
+                               return self._mouseDown(event);
+                       })
+                       .bind('click.'+this.widgetName, function(event) {
+                               if (true === $.data(event.target, self.widgetName + '.preventClickEvent')) {
+                                   $.removeData(event.target, self.widgetName + '.preventClickEvent');
+                                       event.stopImmediatePropagation();
+                                       return false;
+                               }
+                       });
+
+               this.started = false;
+       },
+
+       // TODO: make sure destroying one instance of mouse doesn't mess with
+       // other instances of mouse
+       _mouseDestroy: function() {
+               this.element.unbind('.'+this.widgetName);
+       },
+
+       _mouseDown: function(event) {
+               // don't let more than one widget handle mouseStart
+               if( mouseHandled ) { return };
+
+               // we may have missed mouseup (out of window)
+               (this._mouseStarted && this._mouseUp(event));
+
+               this._mouseDownEvent = event;
+
+               var self = this,
+                       btnIsLeft = (event.which == 1),
+                       // event.target.nodeName works around a bug in IE 8 with
+                       // disabled inputs (#7620)
+                       elIsCancel = (typeof this.options.cancel == "string" && event.target.nodeName ? $(event.target).closest(this.options.cancel).length : false);
+               if (!btnIsLeft || elIsCancel || !this._mouseCapture(event)) {
+                       return true;
+               }
+
+               this.mouseDelayMet = !this.options.delay;
+               if (!this.mouseDelayMet) {
+                       this._mouseDelayTimer = setTimeout(function() {
+                               self.mouseDelayMet = true;
+                       }, this.options.delay);
+               }
+
+               if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
+                       this._mouseStarted = (this._mouseStart(event) !== false);
+                       if (!this._mouseStarted) {
+                               event.preventDefault();
+                               return true;
+                       }
+               }
+
+               // Click event may never have fired (Gecko & Opera)
+               if (true === $.data(event.target, this.widgetName + '.preventClickEvent')) {
+                       $.removeData(event.target, this.widgetName + '.preventClickEvent');
+               }
+
+               // these delegates are required to keep context
+               this._mouseMoveDelegate = function(event) {
+                       return self._mouseMove(event);
+               };
+               this._mouseUpDelegate = function(event) {
+                       return self._mouseUp(event);
+               };
+               $(document)
+                       .bind('mousemove.'+this.widgetName, this._mouseMoveDelegate)
+                       .bind('mouseup.'+this.widgetName, this._mouseUpDelegate);
+
+               event.preventDefault();
+               
+               mouseHandled = true;
+               return true;
+       },
+
+       _mouseMove: function(event) {
+               // IE mouseup check - mouseup happened when mouse was out of window
+               if ($.browser.msie && !(document.documentMode >= 9) && !event.button) {
+                       return this._mouseUp(event);
+               }
+
+               if (this._mouseStarted) {
+                       this._mouseDrag(event);
+                       return event.preventDefault();
+               }
+
+               if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
+                       this._mouseStarted =
+                               (this._mouseStart(this._mouseDownEvent, event) !== false);
+                       (this._mouseStarted ? this._mouseDrag(event) : this._mouseUp(event));
+               }
+
+               return !this._mouseStarted;
+       },
+
+       _mouseUp: function(event) {
+               $(document)
+                       .unbind('mousemove.'+this.widgetName, this._mouseMoveDelegate)
+                       .unbind('mouseup.'+this.widgetName, this._mouseUpDelegate);
+
+               if (this._mouseStarted) {
+                       this._mouseStarted = false;
+
+                       if (event.target == this._mouseDownEvent.target) {
+                           $.data(event.target, this.widgetName + '.preventClickEvent', true);
+                       }
+
+                       this._mouseStop(event);
+               }
+
+               return false;
+       },
+
+       _mouseDistanceMet: function(event) {
+               return (Math.max(
+                               Math.abs(this._mouseDownEvent.pageX - event.pageX),
+                               Math.abs(this._mouseDownEvent.pageY - event.pageY)
+                       ) >= this.options.distance
+               );
+       },
+
+       _mouseDelayMet: function(event) {
+               return this.mouseDelayMet;
+       },
+
+       // These are placeholder methods, to be overriden by extending plugin
+       _mouseStart: function(event) {},
+       _mouseDrag: function(event) {},
+       _mouseStop: function(event) {},
+       _mouseCapture: function(event) { return true; }
+});
+
+})(jQuery);
diff --git a/jquery/jquery.ui-1.8.18.resizable.js b/jquery/jquery.ui-1.8.18.resizable.js
new file mode 100644 (file)
index 0000000..b441435
--- /dev/null
@@ -0,0 +1,808 @@
+/*
+ * jQuery UI Resizable 1.8.18
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Resizables
+ *
+ * Depends:
+ *     jquery.ui.core.js
+ *     jquery.ui.mouse.js
+ *     jquery.ui.widget.js
+ */
+(function( $, undefined ) {
+
+$.widget("ui.resizable", $.ui.mouse, {
+       widgetEventPrefix: "resize",
+       options: {
+               alsoResize: false,
+               animate: false,
+               animateDuration: "slow",
+               animateEasing: "swing",
+               aspectRatio: false,
+               autoHide: false,
+               containment: false,
+               ghost: false,
+               grid: false,
+               handles: "e,s,se",
+               helper: false,
+               maxHeight: null,
+               maxWidth: null,
+               minHeight: 10,
+               minWidth: 10,
+               zIndex: 1000
+       },
+       _create: function() {
+
+               var self = this, o = this.options;
+               this.element.addClass("ui-resizable");
+
+               $.extend(this, {
+                       _aspectRatio: !!(o.aspectRatio),
+                       aspectRatio: o.aspectRatio,
+                       originalElement: this.element,
+                       _proportionallyResizeElements: [],
+                       _helper: o.helper || o.ghost || o.animate ? o.helper || 'ui-resizable-helper' : null
+               });
+
+               //Wrap the element if it cannot hold child nodes
+               if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)) {
+
+                       //Create a wrapper element and set the wrapper to the new current internal element
+                       this.element.wrap(
+                               $('<div class="ui-wrapper" style="overflow: hidden;"></div>').css({
+                                       position: this.element.css('position'),
+                                       width: this.element.outerWidth(),
+                                       height: this.element.outerHeight(),
+                                       top: this.element.css('top'),
+                                       left: this.element.css('left')
+                               })
+                       );
+
+                       //Overwrite the original this.element
+                       this.element = this.element.parent().data(
+                               "resizable", this.element.data('resizable')
+                       );
+
+                       this.elementIsWrapper = true;
+
+                       //Move margins to the wrapper
+                       this.element.css({ marginLeft: this.originalElement.css("marginLeft"), marginTop: this.originalElement.css("marginTop"), marginRight: this.originalElement.css("marginRight"), marginBottom: this.originalElement.css("marginBottom") });
+                       this.originalElement.css({ marginLeft: 0, marginTop: 0, marginRight: 0, marginBottom: 0});
+
+                       //Prevent Safari textarea resize
+                       this.originalResizeStyle = this.originalElement.css('resize');
+                       this.originalElement.css('resize', 'none');
+
+                       //Push the actual element to our proportionallyResize internal array
+                       this._proportionallyResizeElements.push(this.originalElement.css({ position: 'static', zoom: 1, display: 'block' }));
+
+                       // avoid IE jump (hard set the margin)
+                       this.originalElement.css({ margin: this.originalElement.css('margin') });
+
+                       // fix handlers offset
+                       this._proportionallyResize();
+
+               }
+
+               this.handles = o.handles || (!$('.ui-resizable-handle', this.element).length ? "e,s,se" : { n: '.ui-resizable-n', e: '.ui-resizable-e', s: '.ui-resizable-s', w: '.ui-resizable-w', se: '.ui-resizable-se', sw: '.ui-resizable-sw', ne: '.ui-resizable-ne', nw: '.ui-resizable-nw' });
+               if(this.handles.constructor == String) {
+
+                       if(this.handles == 'all') this.handles = 'n,e,s,w,se,sw,ne,nw';
+                       var n = this.handles.split(","); this.handles = {};
+
+                       for(var i = 0; i < n.length; i++) {
+
+                               var handle = $.trim(n[i]), hname = 'ui-resizable-'+handle;
+                               var axis = $('<div class="ui-resizable-handle ' + hname + '"></div>');
+
+                               // increase zIndex of sw, se, ne, nw axis
+                               //TODO : this modifies original option
+                               if(/sw|se|ne|nw/.test(handle)) axis.css({ zIndex: ++o.zIndex });
+
+                               //TODO : What's going on here?
+                               if ('se' == handle) {
+                                       axis.addClass('ui-icon ui-icon-gripsmall-diagonal-se');
+                               };
+
+                               //Insert into internal handles object and append to element
+                               this.handles[handle] = '.ui-resizable-'+handle;
+                               this.element.append(axis);
+                       }
+
+               }
+
+               this._renderAxis = function(target) {
+
+                       target = target || this.element;
+
+                       for(var i in this.handles) {
+
+                               if(this.handles[i].constructor == String)
+                                       this.handles[i] = $(this.handles[i], this.element).show();
+
+                               //Apply pad to wrapper element, needed to fix axis position (textarea, inputs, scrolls)
+                               if (this.elementIsWrapper && this.originalElement[0].nodeName.match(/textarea|input|select|button/i)) {
+
+                                       var axis = $(this.handles[i], this.element), padWrapper = 0;
+
+                                       //Checking the correct pad and border
+                                       padWrapper = /sw|ne|nw|se|n|s/.test(i) ? axis.outerHeight() : axis.outerWidth();
+
+                                       //The padding type i have to apply...
+                                       var padPos = [ 'padding',
+                                               /ne|nw|n/.test(i) ? 'Top' :
+                                               /se|sw|s/.test(i) ? 'Bottom' :
+                                               /^e$/.test(i) ? 'Right' : 'Left' ].join("");
+
+                                       target.css(padPos, padWrapper);
+
+                                       this._proportionallyResize();
+
+                               }
+
+                               //TODO: What's that good for? There's not anything to be executed left
+                               if(!$(this.handles[i]).length)
+                                       continue;
+
+                       }
+               };
+
+               //TODO: make renderAxis a prototype function
+               this._renderAxis(this.element);
+
+               this._handles = $('.ui-resizable-handle', this.element)
+                       .disableSelection();
+
+               //Matching axis name
+               this._handles.mouseover(function() {
+                       if (!self.resizing) {
+                               if (this.className)
+                                       var axis = this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);
+                               //Axis, default = se
+                               self.axis = axis && axis[1] ? axis[1] : 'se';
+                       }
+               });
+
+               //If we want to auto hide the elements
+               if (o.autoHide) {
+                       this._handles.hide();
+                       $(this.element)
+                               .addClass("ui-resizable-autohide")
+                               .hover(function() {
+                                       if (o.disabled) return;
+                                       $(this).removeClass("ui-resizable-autohide");
+                                       self._handles.show();
+                               },
+                               function(){
+                                       if (o.disabled) return;
+                                       if (!self.resizing) {
+                                               $(this).addClass("ui-resizable-autohide");
+                                               self._handles.hide();
+                                       }
+                               });
+               }
+
+               //Initialize the mouse interaction
+               this._mouseInit();
+
+       },
+
+       destroy: function() {
+
+               this._mouseDestroy();
+
+               var _destroy = function(exp) {
+                       $(exp).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing")
+                               .removeData("resizable").unbind(".resizable").find('.ui-resizable-handle').remove();
+               };
+
+               //TODO: Unwrap at same DOM position
+               if (this.elementIsWrapper) {
+                       _destroy(this.element);
+                       var wrapper = this.element;
+                       wrapper.after(
+                               this.originalElement.css({
+                                       position: wrapper.css('position'),
+                                       width: wrapper.outerWidth(),
+                                       height: wrapper.outerHeight(),
+                                       top: wrapper.css('top'),
+                                       left: wrapper.css('left')
+                               })
+                       ).remove();
+               }
+
+               this.originalElement.css('resize', this.originalResizeStyle);
+               _destroy(this.originalElement);
+
+               return this;
+       },
+
+       _mouseCapture: function(event) {
+               var handle = false;
+               for (var i in this.handles) {
+                       if ($(this.handles[i])[0] == event.target) {
+                               handle = true;
+                       }
+               }
+
+               return !this.options.disabled && handle;
+       },
+
+       _mouseStart: function(event) {
+
+               var o = this.options, iniPos = this.element.position(), el = this.element;
+
+               this.resizing = true;
+               this.documentScroll = { top: $(document).scrollTop(), left: $(document).scrollLeft() };
+
+               // bugfix for http://dev.jquery.com/ticket/1749
+               if (el.is('.ui-draggable') || (/absolute/).test(el.css('position'))) {
+                       el.css({ position: 'absolute', top: iniPos.top, left: iniPos.left });
+               }
+
+               this._renderProxy();
+
+               var curleft = num(this.helper.css('left')), curtop = num(this.helper.css('top'));
+
+               if (o.containment) {
+                       curleft += $(o.containment).scrollLeft() || 0;
+                       curtop += $(o.containment).scrollTop() || 0;
+               }
+
+               //Store needed variables
+               this.offset = this.helper.offset();
+               this.position = { left: curleft, top: curtop };
+               this.size = this._helper ? { width: el.outerWidth(), height: el.outerHeight() } : { width: el.width(), height: el.height() };
+               this.originalSize = this._helper ? { width: el.outerWidth(), height: el.outerHeight() } : { width: el.width(), height: el.height() };
+               this.originalPosition = { left: curleft, top: curtop };
+               this.sizeDiff = { width: el.outerWidth() - el.width(), height: el.outerHeight() - el.height() };
+               this.originalMousePosition = { left: event.pageX, top: event.pageY };
+
+               //Aspect Ratio
+               this.aspectRatio = (typeof o.aspectRatio == 'number') ? o.aspectRatio : ((this.originalSize.width / this.originalSize.height) || 1);
+
+           var cursor = $('.ui-resizable-' + this.axis).css('cursor');
+           $('body').css('cursor', cursor == 'auto' ? this.axis + '-resize' : cursor);
+
+               el.addClass("ui-resizable-resizing");
+               this._propagate("start", event);
+               return true;
+       },
+
+       _mouseDrag: function(event) {
+
+               //Increase performance, avoid regex
+               var el = this.helper, o = this.options, props = {},
+                       self = this, smp = this.originalMousePosition, a = this.axis;
+
+               var dx = (event.pageX-smp.left)||0, dy = (event.pageY-smp.top)||0;
+               var trigger = this._change[a];
+               if (!trigger) return false;
+
+               // Calculate the attrs that will be change
+               var data = trigger.apply(this, [event, dx, dy]), ie6 = $.browser.msie && $.browser.version < 7, csdif = this.sizeDiff;
+
+               // Put this in the mouseDrag handler since the user can start pressing shift while resizing
+               this._updateVirtualBoundaries(event.shiftKey);
+               if (this._aspectRatio || event.shiftKey)
+                       data = this._updateRatio(data, event);
+
+               data = this._respectSize(data, event);
+
+               // plugins callbacks need to be called first
+               this._propagate("resize", event);
+
+               el.css({
+                       top: this.position.top + "px", left: this.position.left + "px",
+                       width: this.size.width + "px", height: this.size.height + "px"
+               });
+
+               if (!this._helper && this._proportionallyResizeElements.length)
+                       this._proportionallyResize();
+
+               this._updateCache(data);
+
+               // calling the user callback at the end
+               this._trigger('resize', event, this.ui());
+
+               return false;
+       },
+
+       _mouseStop: function(event) {
+
+               this.resizing = false;
+               var o = this.options, self = this;
+
+               if(this._helper) {
+                       var pr = this._proportionallyResizeElements, ista = pr.length && (/textarea/i).test(pr[0].nodeName),
+                               soffseth = ista && $.ui.hasScroll(pr[0], 'left') /* TODO - jump height */ ? 0 : self.sizeDiff.height,
+                               soffsetw = ista ? 0 : self.sizeDiff.width;
+
+                       var s = { width: (self.helper.width()  - soffsetw), height: (self.helper.height() - soffseth) },
+                               left = (parseInt(self.element.css('left'), 10) + (self.position.left - self.originalPosition.left)) || null,
+                               top = (parseInt(self.element.css('top'), 10) + (self.position.top - self.originalPosition.top)) || null;
+
+                       if (!o.animate)
+                               this.element.css($.extend(s, { top: top, left: left }));
+
+                       self.helper.height(self.size.height);
+                       self.helper.width(self.size.width);
+
+                       if (this._helper && !o.animate) this._proportionallyResize();
+               }
+
+               $('body').css('cursor', 'auto');
+
+               this.element.removeClass("ui-resizable-resizing");
+
+               this._propagate("stop", event);
+
+               if (this._helper) this.helper.remove();
+               return false;
+
+       },
+
+    _updateVirtualBoundaries: function(forceAspectRatio) {
+        var o = this.options, pMinWidth, pMaxWidth, pMinHeight, pMaxHeight, b;
+
+        b = {
+            minWidth: isNumber(o.minWidth) ? o.minWidth : 0,
+            maxWidth: isNumber(o.maxWidth) ? o.maxWidth : Infinity,
+            minHeight: isNumber(o.minHeight) ? o.minHeight : 0,
+            maxHeight: isNumber(o.maxHeight) ? o.maxHeight : Infinity
+        };
+
+        if(this._aspectRatio || forceAspectRatio) {
+            // We want to create an enclosing box whose aspect ration is the requested one
+            // First, compute the "projected" size for each dimension based on the aspect ratio and other dimension
+            pMinWidth = b.minHeight * this.aspectRatio;
+            pMinHeight = b.minWidth / this.aspectRatio;
+            pMaxWidth = b.maxHeight * this.aspectRatio;
+            pMaxHeight = b.maxWidth / this.aspectRatio;
+
+            if(pMinWidth > b.minWidth) b.minWidth = pMinWidth;
+            if(pMinHeight > b.minHeight) b.minHeight = pMinHeight;
+            if(pMaxWidth < b.maxWidth) b.maxWidth = pMaxWidth;
+            if(pMaxHeight < b.maxHeight) b.maxHeight = pMaxHeight;
+        }
+        this._vBoundaries = b;
+    },
+
+       _updateCache: function(data) {
+               var o = this.options;
+               this.offset = this.helper.offset();
+               if (isNumber(data.left)) this.position.left = data.left;
+               if (isNumber(data.top)) this.position.top = data.top;
+               if (isNumber(data.height)) this.size.height = data.height;
+               if (isNumber(data.width)) this.size.width = data.width;
+       },
+
+       _updateRatio: function(data, event) {
+
+               var o = this.options, cpos = this.position, csize = this.size, a = this.axis;
+
+               if (isNumber(data.height)) data.width = (data.height * this.aspectRatio);
+               else if (isNumber(data.width)) data.height = (data.width / this.aspectRatio);
+
+               if (a == 'sw') {
+                       data.left = cpos.left + (csize.width - data.width);
+                       data.top = null;
+               }
+               if (a == 'nw') {
+                       data.top = cpos.top + (csize.height - data.height);
+                       data.left = cpos.left + (csize.width - data.width);
+               }
+
+               return data;
+       },
+
+       _respectSize: function(data, event) {
+
+               var el = this.helper, o = this._vBoundaries, pRatio = this._aspectRatio || event.shiftKey, a = this.axis,
+                               ismaxw = isNumber(data.width) && o.maxWidth && (o.maxWidth < data.width), ismaxh = isNumber(data.height) && o.maxHeight && (o.maxHeight < data.height),
+                                       isminw = isNumber(data.width) && o.minWidth && (o.minWidth > data.width), isminh = isNumber(data.height) && o.minHeight && (o.minHeight > data.height);
+
+               if (isminw) data.width = o.minWidth;
+               if (isminh) data.height = o.minHeight;
+               if (ismaxw) data.width = o.maxWidth;
+               if (ismaxh) data.height = o.maxHeight;
+
+               var dw = this.originalPosition.left + this.originalSize.width, dh = this.position.top + this.size.height;
+               var cw = /sw|nw|w/.test(a), ch = /nw|ne|n/.test(a);
+
+               if (isminw && cw) data.left = dw - o.minWidth;
+               if (ismaxw && cw) data.left = dw - o.maxWidth;
+               if (isminh && ch)       data.top = dh - o.minHeight;
+               if (ismaxh && ch)       data.top = dh - o.maxHeight;
+
+               // fixing jump error on top/left - bug #2330
+               var isNotwh = !data.width && !data.height;
+               if (isNotwh && !data.left && data.top) data.top = null;
+               else if (isNotwh && !data.top && data.left) data.left = null;
+
+               return data;
+       },
+
+       _proportionallyResize: function() {
+
+               var o = this.options;
+               if (!this._proportionallyResizeElements.length) return;
+               var element = this.helper || this.element;
+
+               for (var i=0; i < this._proportionallyResizeElements.length; i++) {
+
+                       var prel = this._proportionallyResizeElements[i];
+
+                       if (!this.borderDif) {
+                               var b = [prel.css('borderTopWidth'), prel.css('borderRightWidth'), prel.css('borderBottomWidth'), prel.css('borderLeftWidth')],
+                                       p = [prel.css('paddingTop'), prel.css('paddingRight'), prel.css('paddingBottom'), prel.css('paddingLeft')];
+
+                               this.borderDif = $.map(b, function(v, i) {
+                                       var border = parseInt(v,10)||0, padding = parseInt(p[i],10)||0;
+                                       return border + padding;
+                               });
+                       }
+
+                       if ($.browser.msie && !(!($(element).is(':hidden') || $(element).parents(':hidden').length)))
+                               continue;
+
+                       prel.css({
+                               height: (element.height() - this.borderDif[0] - this.borderDif[2]) || 0,
+                               width: (element.width() - this.borderDif[1] - this.borderDif[3]) || 0
+                       });
+
+               };
+
+       },
+
+       _renderProxy: function() {
+
+               var el = this.element, o = this.options;
+               this.elementOffset = el.offset();
+
+               if(this._helper) {
+
+                       this.helper = this.helper || $('<div style="overflow:hidden;"></div>');
+
+                       // fix ie6 offset TODO: This seems broken
+                       var ie6 = $.browser.msie && $.browser.version < 7, ie6offset = (ie6 ? 1 : 0),
+                       pxyoffset = ( ie6 ? 2 : -1 );
+
+                       this.helper.addClass(this._helper).css({
+                               width: this.element.outerWidth() + pxyoffset,
+                               height: this.element.outerHeight() + pxyoffset,
+                               position: 'absolute',
+                               left: this.elementOffset.left - ie6offset +'px',
+                               top: this.elementOffset.top - ie6offset +'px',
+                               zIndex: ++o.zIndex //TODO: Don't modify option
+                       });
+
+                       this.helper
+                               .appendTo("body")
+                               .disableSelection();
+
+               } else {
+                       this.helper = this.element;
+               }
+
+       },
+
+       _change: {
+               e: function(event, dx, dy) {
+                       return { width: this.originalSize.width + dx };
+               },
+               w: function(event, dx, dy) {
+                       var o = this.options, cs = this.originalSize, sp = this.originalPosition;
+                       return { left: sp.left + dx, width: cs.width - dx };
+               },
+               n: function(event, dx, dy) {
+                       var o = this.options, cs = this.originalSize, sp = this.originalPosition;
+                       return { top: sp.top + dy, height: cs.height - dy };
+               },
+               s: function(event, dx, dy) {
+                       return { height: this.originalSize.height + dy };
+               },
+               se: function(event, dx, dy) {
+                       return $.extend(this._change.s.apply(this, arguments), this._change.e.apply(this, [event, dx, dy]));
+               },
+               sw: function(event, dx, dy) {
+                       return $.extend(this._change.s.apply(this, arguments), this._change.w.apply(this, [event, dx, dy]));
+               },
+               ne: function(event, dx, dy) {
+                       return $.extend(this._change.n.apply(this, arguments), this._change.e.apply(this, [event, dx, dy]));
+               },
+               nw: function(event, dx, dy) {
+                       return $.extend(this._change.n.apply(this, arguments), this._change.w.apply(this, [event, dx, dy]));
+               }
+       },
+
+       _propagate: function(n, event) {
+               $.ui.plugin.call(this, n, [event, this.ui()]);
+               (n != "resize" && this._trigger(n, event, this.ui()));
+       },
+
+       plugins: {},
+
+       ui: function() {
+               return {
+                       originalElement: this.originalElement,
+                       element: this.element,
+                       helper: this.helper,
+                       position: this.position,
+                       size: this.size,
+                       originalSize: this.originalSize,
+                       originalPosition: this.originalPosition
+               };
+       }
+
+});
+
+$.extend($.ui.resizable, {
+       version: "1.8.18"
+});
+
+/*
+ * Resizable Extensions
+ */
+
+$.ui.plugin.add("resizable", "alsoResize", {
+
+       start: function (event, ui) {
+               var self = $(this).data("resizable"), o = self.options;
+
+               var _store = function (exp) {
+                       $(exp).each(function() {
+                               var el = $(this);
+                               el.data("resizable-alsoresize", {
+                                       width: parseInt(el.width(), 10), height: parseInt(el.height(), 10),
+                                       left: parseInt(el.css('left'), 10), top: parseInt(el.css('top'), 10)
+                               });
+                       });
+               };
+
+               if (typeof(o.alsoResize) == 'object' && !o.alsoResize.parentNode) {
+                       if (o.alsoResize.length) { o.alsoResize = o.alsoResize[0]; _store(o.alsoResize); }
+                       else { $.each(o.alsoResize, function (exp) { _store(exp); }); }
+               }else{
+                       _store(o.alsoResize);
+               }
+       },
+
+       resize: function (event, ui) {
+               var self = $(this).data("resizable"), o = self.options, os = self.originalSize, op = self.originalPosition;
+
+               var delta = {
+                       height: (self.size.height - os.height) || 0, width: (self.size.width - os.width) || 0,
+                       top: (self.position.top - op.top) || 0, left: (self.position.left - op.left) || 0
+               },
+
+               _alsoResize = function (exp, c) {
+                       $(exp).each(function() {
+                               var el = $(this), start = $(this).data("resizable-alsoresize"), style = {}, 
+                                       css = c && c.length ? c : el.parents(ui.originalElement[0]).length ? ['width', 'height'] : ['width', 'height', 'top', 'left'];
+
+                               $.each(css, function (i, prop) {
+                                       var sum = (start[prop]||0) + (delta[prop]||0);
+                                       if (sum && sum >= 0)
+                                               style[prop] = sum || null;
+                               });
+
+                               el.css(style);
+                       });
+               };
+
+               if (typeof(o.alsoResize) == 'object' && !o.alsoResize.nodeType) {
+                       $.each(o.alsoResize, function (exp, c) { _alsoResize(exp, c); });
+               }else{
+                       _alsoResize(o.alsoResize);
+               }
+       },
+
+       stop: function (event, ui) {
+               $(this).removeData("resizable-alsoresize");
+       }
+});
+
+$.ui.plugin.add("resizable", "animate", {
+
+       stop: function(event, ui) {
+               var self = $(this).data("resizable"), o = self.options;
+
+               var pr = self._proportionallyResizeElements, ista = pr.length && (/textarea/i).test(pr[0].nodeName),
+                                       soffseth = ista && $.ui.hasScroll(pr[0], 'left') /* TODO - jump height */ ? 0 : self.sizeDiff.height,
+                                               soffsetw = ista ? 0 : self.sizeDiff.width;
+
+               var style = { width: (self.size.width - soffsetw), height: (self.size.height - soffseth) },
+                                       left = (parseInt(self.element.css('left'), 10) + (self.position.left - self.originalPosition.left)) || null,
+                                               top = (parseInt(self.element.css('top'), 10) + (self.position.top - self.originalPosition.top)) || null;
+
+               self.element.animate(
+                       $.extend(style, top && left ? { top: top, left: left } : {}), {
+                               duration: o.animateDuration,
+                               easing: o.animateEasing,
+                               step: function() {
+
+                                       var data = {
+                                               width: parseInt(self.element.css('width'), 10),
+                                               height: parseInt(self.element.css('height'), 10),
+                                               top: parseInt(self.element.css('top'), 10),
+                                               left: parseInt(self.element.css('left'), 10)
+                                       };
+
+                                       if (pr && pr.length) $(pr[0]).css({ width: data.width, height: data.height });
+
+                                       // propagating resize, and updating values for each animation step
+                                       self._updateCache(data);
+                                       self._propagate("resize", event);
+
+                               }
+                       }
+               );
+       }
+
+});
+
+$.ui.plugin.add("resizable", "containment", {
+
+       start: function(event, ui) {
+               var self = $(this).data("resizable"), o = self.options, el = self.element;
+               var oc = o.containment, ce = (oc instanceof $) ? oc.get(0) : (/parent/.test(oc)) ? el.parent().get(0) : oc;
+               if (!ce) return;
+
+               self.containerElement = $(ce);
+
+               if (/document/.test(oc) || oc == document) {
+                       self.containerOffset = { left: 0, top: 0 };
+                       self.containerPosition = { left: 0, top: 0 };
+
+                       self.parentData = {
+                               element: $(document), left: 0, top: 0,
+                               width: $(document).width(), height: $(document).height() || document.body.parentNode.scrollHeight
+                       };
+               }
+
+               // i'm a node, so compute top, left, right, bottom
+               else {
+                       var element = $(ce), p = [];
+                       $([ "Top", "Right", "Left", "Bottom" ]).each(function(i, name) { p[i] = num(element.css("padding" + name)); });
+
+                       self.containerOffset = element.offset();
+                       self.containerPosition = element.position();
+                       self.containerSize = { height: (element.innerHeight() - p[3]), width: (element.innerWidth() - p[1]) };
+
+                       var co = self.containerOffset, ch = self.containerSize.height,  cw = self.containerSize.width,
+                                               width = ($.ui.hasScroll(ce, "left") ? ce.scrollWidth : cw ), height = ($.ui.hasScroll(ce) ? ce.scrollHeight : ch);
+
+                       self.parentData = {
+                               element: ce, left: co.left, top: co.top, width: width, height: height
+                       };
+               }
+       },
+
+       resize: function(event, ui) {
+               var self = $(this).data("resizable"), o = self.options,
+                               ps = self.containerSize, co = self.containerOffset, cs = self.size, cp = self.position,
+                               pRatio = self._aspectRatio || event.shiftKey, cop = { top:0, left:0 }, ce = self.containerElement;
+
+               if (ce[0] != document && (/static/).test(ce.css('position'))) cop = co;
+
+               if (cp.left < (self._helper ? co.left : 0)) {
+                       self.size.width = self.size.width + (self._helper ? (self.position.left - co.left) : (self.position.left - cop.left));
+                       if (pRatio) self.size.height = self.size.width / o.aspectRatio;
+                       self.position.left = o.helper ? co.left : 0;
+               }
+
+               if (cp.top < (self._helper ? co.top : 0)) {
+                       self.size.height = self.size.height + (self._helper ? (self.position.top - co.top) : self.position.top);
+                       if (pRatio) self.size.width = self.size.height * o.aspectRatio;
+                       self.position.top = self._helper ? co.top : 0;
+               }
+
+               self.offset.left = self.parentData.left+self.position.left;
+               self.offset.top = self.parentData.top+self.position.top;
+
+               var woset = Math.abs( (self._helper ? self.offset.left - cop.left : (self.offset.left - cop.left)) + self.sizeDiff.width ),
+                                       hoset = Math.abs( (self._helper ? self.offset.top - cop.top : (self.offset.top - co.top)) + self.sizeDiff.height );
+
+               var isParent = self.containerElement.get(0) == self.element.parent().get(0),
+                   isOffsetRelative = /relative|absolute/.test(self.containerElement.css('position'));
+
+               if(isParent && isOffsetRelative) woset -= self.parentData.left;
+
+               if (woset + self.size.width >= self.parentData.width) {
+                       self.size.width = self.parentData.width - woset;
+                       if (pRatio) self.size.height = self.size.width / self.aspectRatio;
+               }
+
+               if (hoset + self.size.height >= self.parentData.height) {
+                       self.size.height = self.parentData.height - hoset;
+                       if (pRatio) self.size.width = self.size.height * self.aspectRatio;
+               }
+       },
+
+       stop: function(event, ui){
+               var self = $(this).data("resizable"), o = self.options, cp = self.position,
+                               co = self.containerOffset, cop = self.containerPosition, ce = self.containerElement;
+
+               var helper = $(self.helper), ho = helper.offset(), w = helper.outerWidth() - self.sizeDiff.width, h = helper.outerHeight() - self.sizeDiff.height;
+
+               if (self._helper && !o.animate && (/relative/).test(ce.css('position')))
+                       $(this).css({ left: ho.left - cop.left - co.left, width: w, height: h });
+
+               if (self._helper && !o.animate && (/static/).test(ce.css('position')))
+                       $(this).css({ left: ho.left - cop.left - co.left, width: w, height: h });
+
+       }
+});
+
+$.ui.plugin.add("resizable", "ghost", {
+
+       start: function(event, ui) {
+
+               var self = $(this).data("resizable"), o = self.options, cs = self.size;
+
+               self.ghost = self.originalElement.clone();
+               self.ghost
+                       .css({ opacity: .25, display: 'block', position: 'relative', height: cs.height, width: cs.width, margin: 0, left: 0, top: 0 })
+                       .addClass('ui-resizable-ghost')
+                       .addClass(typeof o.ghost == 'string' ? o.ghost : '');
+
+               self.ghost.appendTo(self.helper);
+
+       },
+
+       resize: function(event, ui){
+               var self = $(this).data("resizable"), o = self.options;
+               if (self.ghost) self.ghost.css({ position: 'relative', height: self.size.height, width: self.size.width });
+       },
+
+       stop: function(event, ui){
+               var self = $(this).data("resizable"), o = self.options;
+               if (self.ghost && self.helper) self.helper.get(0).removeChild(self.ghost.get(0));
+       }
+
+});
+
+$.ui.plugin.add("resizable", "grid", {
+
+       resize: function(event, ui) {
+               var self = $(this).data("resizable"), o = self.options, cs = self.size, os = self.originalSize, op = self.originalPosition, a = self.axis, ratio = o._aspectRatio || event.shiftKey;
+               o.grid = typeof o.grid == "number" ? [o.grid, o.grid] : o.grid;
+               var ox = Math.round((cs.width - os.width) / (o.grid[0]||1)) * (o.grid[0]||1), oy = Math.round((cs.height - os.height) / (o.grid[1]||1)) * (o.grid[1]||1);
+
+               if (/^(se|s|e)$/.test(a)) {
+                       self.size.width = os.width + ox;
+                       self.size.height = os.height + oy;
+               }
+               else if (/^(ne)$/.test(a)) {
+                       self.size.width = os.width + ox;
+                       self.size.height = os.height + oy;
+                       self.position.top = op.top - oy;
+               }
+               else if (/^(sw)$/.test(a)) {
+                       self.size.width = os.width + ox;
+                       self.size.height = os.height + oy;
+                       self.position.left = op.left - ox;
+               }
+               else {
+                       self.size.width = os.width + ox;
+                       self.size.height = os.height + oy;
+                       self.position.top = op.top - oy;
+                       self.position.left = op.left - ox;
+               }
+       }
+
+});
+
+var num = function(v) {
+       return parseInt(v, 10) || 0;
+};
+
+var isNumber = function(value) {
+       return !isNaN(parseInt(value, 10));
+};
+
+})(jQuery);
diff --git a/jquery/jquery.ui-1.8.18.widget.js b/jquery/jquery.ui-1.8.18.widget.js
new file mode 100644 (file)
index 0000000..0c6f53f
--- /dev/null
@@ -0,0 +1,272 @@
+/*!
+ * jQuery UI Widget 1.8.18
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Widget
+ */
+(function( $, undefined ) {
+
+// jQuery 1.4+
+if ( $.cleanData ) {
+       var _cleanData = $.cleanData;
+       $.cleanData = function( elems ) {
+               for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
+                       try {
+                               $( elem ).triggerHandler( "remove" );
+                       // http://bugs.jquery.com/ticket/8235
+                       } catch( e ) {}
+               }
+               _cleanData( elems );
+       };
+} else {
+       var _remove = $.fn.remove;
+       $.fn.remove = function( selector, keepData ) {
+               return this.each(function() {
+                       if ( !keepData ) {
+                               if ( !selector || $.filter( selector, [ this ] ).length ) {
+                                       $( "*", this ).add( [ this ] ).each(function() {
+                                               try {
+                                                       $( this ).triggerHandler( "remove" );
+                                               // http://bugs.jquery.com/ticket/8235
+                                               } catch( e ) {}
+                                       });
+                               }
+                       }
+                       return _remove.call( $(this), selector, keepData );
+               });
+       };
+}
+
+$.widget = function( name, base, prototype ) {
+       var namespace = name.split( "." )[ 0 ],
+               fullName;
+       name = name.split( "." )[ 1 ];
+       fullName = namespace + "-" + name;
+
+       if ( !prototype ) {
+               prototype = base;
+               base = $.Widget;
+       }
+
+       // create selector for plugin
+       $.expr[ ":" ][ fullName ] = function( elem ) {
+               return !!$.data( elem, name );
+       };
+
+       $[ namespace ] = $[ namespace ] || {};
+       $[ namespace ][ name ] = function( options, element ) {
+               // allow instantiation without initializing for simple inheritance
+               if ( arguments.length ) {
+                       this._createWidget( options, element );
+               }
+       };
+
+       var basePrototype = new base();
+       // we need to make the options hash a property directly on the new instance
+       // otherwise we'll modify the options hash on the prototype that we're
+       // inheriting from
+//     $.each( basePrototype, function( key, val ) {
+//             if ( $.isPlainObject(val) ) {
+//                     basePrototype[ key ] = $.extend( {}, val );
+//             }
+//     });
+       basePrototype.options = $.extend( true, {}, basePrototype.options );
+       $[ namespace ][ name ].prototype = $.extend( true, basePrototype, {
+               namespace: namespace,
+               widgetName: name,
+               widgetEventPrefix: $[ namespace ][ name ].prototype.widgetEventPrefix || name,
+               widgetBaseClass: fullName
+       }, prototype );
+
+       $.widget.bridge( name, $[ namespace ][ name ] );
+};
+
+$.widget.bridge = function( name, object ) {
+       $.fn[ name ] = function( options ) {
+               var isMethodCall = typeof options === "string",
+                       args = Array.prototype.slice.call( arguments, 1 ),
+                       returnValue = this;
+
+               // allow multiple hashes to be passed on init
+               options = !isMethodCall && args.length ?
+                       $.extend.apply( null, [ true, options ].concat(args) ) :
+                       options;
+
+               // prevent calls to internal methods
+               if ( isMethodCall && options.charAt( 0 ) === "_" ) {
+                       return returnValue;
+               }
+
+               if ( isMethodCall ) {
+                       this.each(function() {
+                               var instance = $.data( this, name ),
+                                       methodValue = instance && $.isFunction( instance[options] ) ?
+                                               instance[ options ].apply( instance, args ) :
+                                               instance;
+                               // TODO: add this back in 1.9 and use $.error() (see #5972)
+//                             if ( !instance ) {
+//                                     throw "cannot call methods on " + name + " prior to initialization; " +
+//                                             "attempted to call method '" + options + "'";
+//                             }
+//                             if ( !$.isFunction( instance[options] ) ) {
+//                                     throw "no such method '" + options + "' for " + name + " widget instance";
+//                             }
+//                             var methodValue = instance[ options ].apply( instance, args );
+                               if ( methodValue !== instance && methodValue !== undefined ) {
+                                       returnValue = methodValue;
+                                       return false;
+                               }
+                       });
+               } else {
+                       this.each(function() {
+                               var instance = $.data( this, name );
+                               if ( instance ) {
+                                       instance.option( options || {} )._init();
+                               } else {
+                                       $.data( this, name, new object( options, this ) );
+                               }
+                       });
+               }
+
+               return returnValue;
+       };
+};
+
+$.Widget = function( options, element ) {
+       // allow instantiation without initializing for simple inheritance
+       if ( arguments.length ) {
+               this._createWidget( options, element );
+       }
+};
+
+$.Widget.prototype = {
+       widgetName: "widget",
+       widgetEventPrefix: "",
+       options: {
+               disabled: false
+       },
+       _createWidget: function( options, element ) {
+               // $.widget.bridge stores the plugin instance, but we do it anyway
+               // so that it's stored even before the _create function runs
+               $.data( element, this.widgetName, this );
+               this.element = $( element );
+               this.options = $.extend( true, {},
+                       this.options,
+                       this._getCreateOptions(),
+                       options );
+
+               var self = this;
+               this.element.bind( "remove." + this.widgetName, function() {
+                       self.destroy();
+               });
+
+               this._create();
+               this._trigger( "create" );
+               this._init();
+       },
+       _getCreateOptions: function() {
+               return $.metadata && $.metadata.get( this.element[0] )[ this.widgetName ];
+       },
+       _create: function() {},
+       _init: function() {},
+
+       destroy: function() {
+               this.element
+                       .unbind( "." + this.widgetName )
+                       .removeData( this.widgetName );
+               this.widget()
+                       .unbind( "." + this.widgetName )
+                       .removeAttr( "aria-disabled" )
+                       .removeClass(
+                               this.widgetBaseClass + "-disabled " +
+                               "ui-state-disabled" );
+       },
+
+       widget: function() {
+               return this.element;
+       },
+
+       option: function( key, value ) {
+               var options = key;
+
+               if ( arguments.length === 0 ) {
+                       // don't return a reference to the internal hash
+                       return $.extend( {}, this.options );
+               }
+
+               if  (typeof key === "string" ) {
+                       if ( value === undefined ) {
+                               return this.options[ key ];
+                       }
+                       options = {};
+                       options[ key ] = value;
+               }
+
+               this._setOptions( options );
+
+               return this;
+       },
+       _setOptions: function( options ) {
+               var self = this;
+               $.each( options, function( key, value ) {
+                       self._setOption( key, value );
+               });
+
+               return this;
+       },
+       _setOption: function( key, value ) {
+               this.options[ key ] = value;
+
+               if ( key === "disabled" ) {
+                       this.widget()
+                               [ value ? "addClass" : "removeClass"](
+                                       this.widgetBaseClass + "-disabled" + " " +
+                                       "ui-state-disabled" )
+                               .attr( "aria-disabled", value );
+               }
+
+               return this;
+       },
+
+       enable: function() {
+               return this._setOption( "disabled", false );
+       },
+       disable: function() {
+               return this._setOption( "disabled", true );
+       },
+
+       _trigger: function( type, event, data ) {
+               var prop, orig,
+                       callback = this.options[ type ];
+
+               data = data || {};
+               event = $.Event( event );
+               event.type = ( type === this.widgetEventPrefix ?
+                       type :
+                       this.widgetEventPrefix + type ).toLowerCase();
+               // the original event may come from any element
+               // so we need to reset the target on the new event
+               event.target = this.element[ 0 ];
+
+               // copy original event properties over to the new event
+               orig = event.originalEvent;
+               if ( orig ) {
+                       for ( prop in orig ) {
+                               if ( !( prop in event ) ) {
+                                       event[ prop ] = orig[ prop ];
+                               }
+                       }
+               }
+
+               this.element.trigger( event, data );
+
+               return !( $.isFunction(callback) &&
+                       callback.call( this.element[0], event, data ) === false ||
+                       event.isDefaultPrevented() );
+       }
+};
+
+})( jQuery );
diff --git a/jquery/split_jquery.pl b/jquery/split_jquery.pl
new file mode 100644 (file)
index 0000000..3edc763
--- /dev/null
@@ -0,0 +1,25 @@
+# script to split file into parts of roughly 32kb
+#!/bin/perl
+my $file = shift;
+my $target = shift;
+my $count = 1;
+my $len = 0;
+$target=~/p(\d+).js/;
+my $part = $1;
+open(F,"<$file") || die ("cannot open file for reading: $!");
+open(G,">$target") || die("cannot open file for writing: $!");
+while (<F>)
+{
+  if ($part==$count)
+  {
+    print G "$_";
+  }
+  $len+=length($_);
+  if ($len>32768) 
+  {
+    $len=0;
+    $count++;
+  }
+}
+close(F);
+close(G);
index 5f71b11..1a6caab 100644 (file)
@@ -8,9 +8,9 @@ distclean: clean
        $(RM) -f Makefile.libmd5 libmd5.pro Makefile 
 
 tmake:
-       $(ENV) $(PERL) $(TMAKE) libmd5.pro >Makefile.libmd5
+       $(ENV) $(PERL) "$(TMAKE)" libmd5.pro >Makefile.libmd5
 
 Makefile.libmd5: libmd5.pro
-       $(ENV) $(PERL) $(TMAKE) libmd5.pro >Makefile.libmd5
+       $(ENV) $(PERL) "$(TMAKE)" libmd5.pro >Makefile.libmd5
 
 install:
index 8aa5e83..aa8de17 100644 (file)
@@ -1,4 +1,4 @@
-# Doxyfile 1.8.3
+# Doxyfile 1.8.3.1
 
 #---------------------------------------------------------------------------
 # Project related configuration options
@@ -44,13 +44,12 @@ SUBGROUPING            = YES
 INLINE_GROUPED_CLASSES = NO
 INLINE_SIMPLE_STRUCTS  = NO
 TYPEDEF_HIDES_STRUCT   = NO
-SYMBOL_CACHE_SIZE      = 0
 LOOKUP_CACHE_SIZE      = 0
 #---------------------------------------------------------------------------
 # Build related configuration options
 #---------------------------------------------------------------------------
 EXTRACT_ALL            = YES
-EXTRACT_PRIVATE        = NO
+EXTRACT_PRIVATE        = YES
 EXTRACT_PACKAGE        = NO
 EXTRACT_STATIC         = YES
 EXTRACT_LOCAL_CLASSES  = YES
@@ -87,7 +86,7 @@ CITE_BIB_FILES         =
 #---------------------------------------------------------------------------
 # configuration options related to warning and progress messages
 #---------------------------------------------------------------------------
-QUIET                  = YES
+QUIET                  = NO
 WARNINGS               = YES
 WARN_IF_UNDOCUMENTED   = YES
 WARN_IF_DOC_ERROR      = YES
@@ -127,6 +126,8 @@ REFERENCES_RELATION    = YES
 REFERENCES_LINK_SOURCE = YES
 USE_HTAGS              = NO
 VERBATIM_HEADERS       = YES
+CLANG_ASSISTED_PARSING = YES
+CLANG_OPTIONS          =
 #---------------------------------------------------------------------------
 # configuration options related to the alphabetical class index
 #---------------------------------------------------------------------------
@@ -183,11 +184,13 @@ USE_MATHJAX            = NO
 MATHJAX_FORMAT         = HTML-CSS
 MATHJAX_RELPATH        = http://cdn.mathjax.org/mathjax/latest
 MATHJAX_EXTENSIONS     =
+MATHJAX_CODEFILE       =
 SEARCHENGINE           = YES
 SERVER_BASED_SEARCH    = YES
 EXTERNAL_SEARCH        = YES
 SEARCHENGINE_URL       = http://macbookpro/~dimitri/doxysearch.cgi
 SEARCHDATA_FILE        = searchdata.xml
+EXTERNAL_SEARCH_ID     =
 EXTRA_SEARCH_MAPPINGS  =
 #---------------------------------------------------------------------------
 # configuration options related to the LaTeX output
@@ -201,6 +204,7 @@ PAPER_TYPE             = a4wide
 EXTRA_PACKAGES         =
 LATEX_HEADER           =
 LATEX_FOOTER           =
+LATEX_EXTRA_FILES      =
 PDF_HYPERLINKS         = YES
 USE_PDFLATEX           = YES
 LATEX_BATCHMODE        = NO
@@ -226,12 +230,17 @@ MAN_LINKS              = NO
 #---------------------------------------------------------------------------
 # configuration options related to the XML output
 #---------------------------------------------------------------------------
-GENERATE_XML           = YES
+GENERATE_XML           = NO
 XML_OUTPUT             = xml
 XML_SCHEMA             =
 XML_DTD                =
 XML_PROGRAMLISTING     = YES
 #---------------------------------------------------------------------------
+# configuration options related to the DOCBOOK output
+#---------------------------------------------------------------------------
+GENERATE_DOCBOOK       = NO
+DOCBOOK_OUTPUT         = docbook
+#---------------------------------------------------------------------------
 # configuration options for the AutoGen Definitions output
 #---------------------------------------------------------------------------
 GENERATE_AUTOGEN_DEF   = NO
@@ -251,7 +260,7 @@ EXPAND_ONLY_PREDEF     = YES
 SEARCH_INCLUDES        = YES
 INCLUDE_PATH           =
 INCLUDE_FILE_PATTERNS  =
-PREDEFINED             =
+PREDEFINED             = Q_EXPORT=
 EXPAND_AS_DEFINED      =
 SKIP_FUNCTION_MACROS   = YES
 #---------------------------------------------------------------------------
@@ -261,6 +270,7 @@ TAGFILES               =
 GENERATE_TAGFILE       = ../qtools_docs/qtools.tag
 ALLEXTERNALS           = NO
 EXTERNAL_GROUPS        = YES
+EXTERNAL_PAGES         = YES
 PERL_PATH              = /usr/bin/perl
 #---------------------------------------------------------------------------
 # Configuration options related to the dot tool
@@ -268,7 +278,7 @@ PERL_PATH              = /usr/bin/perl
 CLASS_DIAGRAMS         = NO
 MSCGEN_PATH            =
 HIDE_UNDOC_RELATIONS   = YES
-HAVE_DOT               = NO
+HAVE_DOT               = YES
 DOT_NUM_THREADS        = 0
 DOT_FONTNAME           =
 DOT_FONTSIZE           = 10
index 78710fd..ca66cc1 100644 (file)
@@ -17,10 +17,10 @@ all: Makefile.qtools Makefile
        $(MAKE) -f Makefile.qtools    $@
 
 Makefile.qtools: qtools.pro 
-       $(ENV) $(PERL) $(TMAKE) qtools.pro >Makefile.qtools
+       $(ENV) $(PERL) "$(TMAKE)" qtools.pro >Makefile.qtools
 
 tmake: 
-       $(ENV) $(PERL) $(TMAKE) qtools.pro >Makefile.qtools
+       $(ENV) $(PERL) "$(TMAKE)" qtools.pro >Makefile.qtools
 
 clean: Makefile.qtools 
        $(MAKE) -f Makefile.qtools    clean 
index bbe8700..8b652b4 100644 (file)
 #include <stdlib.h>
 #include <string.h>
 
+#if !defined(_OS_WIN32_)
+#include <stdint.h>
+#endif
+
 #if defined(_OS_SUN_) && defined(_CC_GNU_)
 #include <strings.h>
 #endif
@@ -84,6 +88,12 @@ Q_EXPORT void *qmemmove( void *dst, const void *src, uint len );
 #define memmove(s1,s2,n) qmemmove((s1),(s2),(n))
 #endif
 
+#if defined(_OS_WIN32_)
+#define qsnprintf _snprintf
+#else
+#define qsnprintf snprintf
+#endif
+
 Q_EXPORT char *qstrdup( const char * );
 
 Q_EXPORT inline uint cstrlen( const char *str )
@@ -98,25 +108,26 @@ Q_EXPORT inline char *cstrcpy( char *dst, const char *src )
 Q_EXPORT inline char *qstrcpy( char *dst, const char *src )
 { return src ? strcpy(dst, src) : 0; }
 
-Q_EXPORT char *qstrncpy( char *dst, const char *src, uint len );
+Q_EXPORT char * qstrncpy(char *src,const char *dst, uint len);
 
 Q_EXPORT inline int cstrcmp( const char *str1, const char *str2 )
 { return strcmp(str1,str2); }
 
 Q_EXPORT inline int qstrcmp( const char *str1, const char *str2 )
-{ return (str1 && str2) ? strcmp(str1,str2) : (int)((long)str2 - (long)str1); }
+{ return (str1 && str2) ? strcmp(str1,str2) : (int)((intptr_t)str2 - (intptr_t)str1); }
 
 Q_EXPORT inline int cstrncmp( const char *str1, const char *str2, uint len )
 { return strncmp(str1,str2,len); }
 
 Q_EXPORT inline int qstrncmp( const char *str1, const char *str2, uint len )
 { return (str1 && str2) ? strncmp(str1,str2,len) :
-                         (int)((long)str2 - (long)str1); }
+                         (int)((intptr_t)str2 - (intptr_t)str1); }
 
-Q_EXPORT int qstricmp( const char *, const char * );
+Q_EXPORT int qstricmp( const char *str1, const char *str2 );
 
-Q_EXPORT int qstrnicmp( const char *, const char *, uint len );
+Q_EXPORT int qstrnicmp( const char *str1, const char *str2, uint len );
 
+#if 0
 // ### TODO for 3.0: these and the cstr* functions should be used if
 //                   !defined(QT_CLEAN_NAMESPACE)
 //                   We want to keep source compatibility for 2.x
@@ -143,6 +154,7 @@ Q_EXPORT int qstrnicmp( const char *, const char *, uint len );
 #define strnicmp qstrnicmp
 
 #endif
+#endif
 
 // qChecksum: Internet checksum
 
@@ -274,24 +286,28 @@ inline void QCString::duplicate( const QCString &s )
 {
   if (!s.isEmpty()) 
   {
-    uint l = strlen(s.data());
+    uint l = (uint)strlen(s.data());
     m_data = (char *)malloc(l+1);
     if (m_data) memcpy(m_data,s.data(),l+1);
   }
   else 
+  {
     m_data=0; 
+  }
 }
 
 inline void QCString::duplicate( const char *str)
 {
   if (str && str[0]!='\0') 
   {
-    uint l = strlen(str);
+    uint l = (uint)strlen(str);
     m_data = (char *)malloc(l+1);
     if (m_data) memcpy(m_data,str,l+1);
   }
   else 
+  {
     m_data=0;
+  }
 }
 
 inline QCString &QCString::duplicate( const char *str, int)
index 4edaca9..d0cc36e 100644 (file)
@@ -52,7 +52,7 @@
 #include <dos.h>
 #elif defined(_OS_OS2_)
 #include <os2.h>
-#elif defined(_OS_UNIX_)
+#elif defined(_OS_UNIX_) || defined(_OS_MAC_)
 #include <sys/time.h>
 #include <unistd.h>
 #undef gettimeofday
@@ -893,7 +893,7 @@ bool QTime::currentTime( QTime *ct )
             t.second*1000 + t.hsecond*10;
     return (t.hour== 0 && t.minute == 0);
 
-#elif defined(_OS_UNIX_)
+#elif defined(_OS_UNIX_) || defined(_OS_MAC_)
 
     struct timeval tv;
     gettimeofday( &tv, 0 );
index e845043..2257265 100644 (file)
@@ -82,12 +82,14 @@ QString QDir::canonicalPath() const
 
     char cur[PATH_MAX];
     char tmp[PATH_MAX];
-    (void)GETCWD( cur, PATH_MAX );
-    if ( CHDIR(QFile::encodeName(dPath)) >= 0 ) {
-       (void)GETCWD( tmp, PATH_MAX );
-       r = QFile::decodeName(tmp);
+    if (GETCWD( cur, PATH_MAX )) {
+      if ( CHDIR(QFile::encodeName(dPath)) >= 0 ) {
+       if (GETCWD( tmp, PATH_MAX )) {
+         r = QFile::decodeName(tmp);
+        }
+        (void)CHDIR( cur );
+      }
     }
-    (void)CHDIR( cur );
 
     slashify( r );
     return r;
index 5105c45..5a7cfe2 100644 (file)
 
 #else                                          // all other systems
 
+#ifdef __MINGW32__
+# define STATBUF       struct _stat
+# define STATBUF4TSTAT struct _stat
+# define STAT          _stat
+# define FSTAT         _fstat
+#else
 # define STATBUF       struct stat
 # define STATBUF4TSTAT struct stat
 # define STAT          ::stat
 # define FSTAT         ::fstat
+#endif
 # define STAT_REG      S_IFREG
 # define STAT_DIR      S_IFDIR
 # define STAT_MASK     S_IFMT
index efc9de0..df31363 100644 (file)
@@ -635,7 +635,7 @@ extern "C" {
 static int cmp_arr( const void *n1, const void *n2 )
 {
     return ( n1 && n2 ) ? memcmp( n1, n2, cmp_item_size ) 
-                       : (int)((long)n1 - (long)n2);
+                       : (int)((intptr_t)n1 - (intptr_t)n2);
     // Qt 3.0: Add a virtual compareItems() method and call that instead
 }
 
index e5dd8de..511c867 100644 (file)
@@ -216,7 +216,7 @@ public:
     bool  remove_ascii( QCacheItem *item )
        { return QGDict::remove_ascii((const char *)item->key,item); }
     bool  remove_int( QCacheItem *item )
-       { return QGDict::remove_int((long)item->key,item);}
+       { return QGDict::remove_int((intptr_t)item->key,item);}
 
     void  statistics()                 { QGDict::statistics(); }
 };
@@ -406,7 +406,7 @@ bool QGCache::insert_other( const char *key, QCollection::Item data,
     if ( keytype == AsciiKey )
        dict->insert_ascii( key, ci );
     else
-       dict->insert_int( (long)key, ci );
+       dict->insert_int( (intptr_t)key, ci );
     tCost += cost;
     return TRUE;
 }
@@ -469,7 +469,7 @@ QCollection::Item QGCache::take_other( const char *key )
     if ( keytype == AsciiKey )
        ci = dict->take_ascii( key );
     else
-       ci = dict->take_int( (long)key );
+       ci = dict->take_int( (intptr_t)key );
     Item d;
     if ( ci ) {
        d = ci->data;
@@ -549,7 +549,7 @@ QCollection::Item QGCache::find_string( const QString &key, bool ref ) const
 QCollection::Item QGCache::find_other( const char *key, bool ref ) const
 {
     QCacheItem *ci = keytype == AsciiKey ? dict->find_ascii(key)
-                                        : dict->find_int((long)key);
+                                        : dict->find_int((intptr_t)key);
 #if defined(DEBUG)
     lruList->finds++;
 #endif
@@ -816,10 +816,10 @@ const char *QGCacheIterator::getKeyAscii() const
   Returns the key of the current item, as a long.
 */
 
-long QGCacheIterator::getKeyInt() const
+intptr_t QGCacheIterator::getKeyInt() const
 {
     QCacheItem *item = it->current();
-    return item ? (long)item->key : 0;
+    return item ? (intptr_t)item->key : 0;
 }
 
 /*!
index 2f35c41..a71f6d3 100644 (file)
@@ -114,7 +114,7 @@ protected:
     QCollection::Item get() const;
     QString          getKeyString() const;
     const char       *getKeyAscii()  const;
-    long             getKeyInt()    const;
+    intptr_t         getKeyInt()    const;
 
     QCollection::Item operator()();
     QCollection::Item operator++();
index e51b9c1..534a93c 100644 (file)
@@ -466,7 +466,7 @@ QCollection::Item QGDict::look_int( long key, QCollection::Item d, int op )
 QCollection::Item QGDict::look_ptr( void *key, QCollection::Item d, int op )
 {
     QPtrBucket *n;
-    int index = (int)((ulong)key % vlen);      // simple hash
+    int index = (int)((uintptr_t)key % vlen);  // simple hash
     if ( op == op_find ) {                     // find
        for ( n=(QPtrBucket*)vec[index]; n;
              n=(QPtrBucket*)n->getNext() ) {
@@ -681,7 +681,7 @@ QPtrBucket *QGDict::unlink_ptr( void *key, QCollection::Item d )
        return 0;
     QPtrBucket *n;
     QPtrBucket *prev = 0;
-    int index = (int)((ulong)key % vlen);
+    int index = (int)((uintptr_t)key % vlen);
     for ( n=(QPtrBucket *)vec[index]; n; n=(QPtrBucket *)n->getNext() ) {
        bool found = (n->getKey() == key);
        if ( found && d )
@@ -1012,7 +1012,7 @@ QDataStream &QGDict::read( QDataStream &s )
                    // but hey, serializing pointers?  can it be done
                    // at all, ever?
                    if ( k )
-                       look_ptr( (void *)k, d, op_insert );
+                       look_ptr( (void *)(uintptr_t)k, d, op_insert );
                }
                break;
        }
index 6243364..a5c8aa0 100644 (file)
@@ -83,11 +83,11 @@ private:
 class QIntBucket : public QBaseBucket
 {
 public:
-    QIntBucket( long k, QCollection::Item d, QBaseBucket *n )
+    QIntBucket( intptr_t k, QCollection::Item d, QBaseBucket *n )
        : QBaseBucket(d,n), key(k) {}
-    long  getKey() const { return key; }
+    intptr_t  getKey() const { return key; }
 private:
-    long  key;
+    intptr_t  key;
 };
 
 class QPtrBucket : public QBaseBucket
@@ -178,7 +178,7 @@ public:
     QCollection::Item get()         const;
     QString          getKeyString() const;
     const char      *getKeyAscii()  const;
-    long             getKeyInt()    const;
+    intptr_t         getKeyInt()    const;
     void            *getKeyPtr()    const;
 
     QCollection::Item operator()();
@@ -208,7 +208,7 @@ inline const char *QGDictIterator::getKeyAscii() const
     return curNode ? ((QAsciiBucket*)curNode)->getKey() : 0;
 }
 
-inline long QGDictIterator::getKeyInt() const
+inline intptr_t QGDictIterator::getKeyInt() const
 {
     return curNode ? ((QIntBucket*)curNode)->getKey() : 0;
 }
index 43b2787..b52475c 100644 (file)
@@ -593,7 +593,7 @@ int QIODevice::readLine( char *data, uint maxlen )
            break;
     }
     *p++ = '\0';
-    return (int)((long)p - (long)data);
+    return (int)((intptr_t)p - (intptr_t)data);
 }
 
 
index 21b455e..bae072d 100644 (file)
@@ -1894,7 +1894,7 @@ QTextStream &QTextStream::operator<<( void *ptr )
     setf( hex, basefield );
     setf( showbase );
     unsetf( uppercase );
-    output_int( I_LONG | I_UNSIGNED, (ulong)ptr, FALSE );
+    output_int( I_LONG | I_UNSIGNED, (uintptr_t)ptr, FALSE );
     flags( f );
     return *this;
 }
diff --git a/src/.gitignore b/src/.gitignore
new file mode 100644 (file)
index 0000000..3eae438
--- /dev/null
@@ -0,0 +1,47 @@
+*~
+.*sw?
+\#*
+.DS_Store
+
+*.rej
+*.orig
+
+Makefile
+*.pro
+/.makeconfig
+/.tmakeconfig
+/VERSION
+/src/libdoxycfg.t
+/src/libdoxygen.t
+/packages/rpm/doxygen.spec
+/libmd5/Makefile.libmd5
+/qtools/Makefile.qtools
+/src/Makefile.doxygen
+/src/Makefile.libdoxycfg
+/src/Makefile.libdoxygen
+
+/bin
+/lib
+/objects
+/src/ce_lex.cpp
+/src/ce_parse.cpp
+/src/ce_parse.h
+/src/code.cpp
+/src/commentcnv.cpp
+/src/commentscan.cpp
+/src/config.cpp
+/src/declinfo.cpp
+/src/defargs.cpp
+/src/doctokenizer.cpp
+/src/fortrancode.cpp
+/src/fortranscanner.cpp
+/src/pre.cpp
+/src/pycode.cpp
+/src/pyscanner.cpp
+/src/scanner.cpp
+/src/tclscanner.cpp
+/src/version.cpp
+/src/vhdlcode.cpp
+/src/vhdlparser.cpp
+/src/vhdlparser.h
+/src/vhdlscanner.cpp
index e6a7080..2e78088 100644 (file)
@@ -2,7 +2,7 @@
 #
 # 
 #
-# Copyright (C) 1997-2012 by Dimitri van Heesch.
+# Copyright (C) 1997-2013 by Dimitri van Heesch.
 # 
 # Permission to use, copy, modify, and distribute this software and its
 # documentation under the terms of the GNU General Public License is hereby 
@@ -20,18 +20,18 @@ all: Makefile.libdoxygen Makefile.libdoxycfg Makefile.doxygen Makefile
        $(MAKE) -f Makefile.doxygen    PERL=$(PERL) $@
 
 Makefile.libdoxygen: libdoxygen.pro libdoxygen.t 
-       $(ENV) $(PERL) $(TMAKE) libdoxygen.pro >Makefile.libdoxygen
+       $(ENV) $(PERL) "$(TMAKE)" libdoxygen.pro >Makefile.libdoxygen
 
 Makefile.libdoxycfg: libdoxycfg.pro libdoxycfg.t 
-       $(ENV) $(PERL) $(TMAKE) libdoxycfg.pro >Makefile.libdoxycfg
+       $(ENV) $(PERL) "$(TMAKE)" libdoxycfg.pro >Makefile.libdoxycfg
 
 Makefile.doxygen: doxygen.pro 
-       $(ENV) $(PERL) $(TMAKE) doxygen.pro >Makefile.doxygen
+       $(ENV) $(PERL) "$(TMAKE)" doxygen.pro >Makefile.doxygen
 
 tmake: 
-       $(ENV) $(PERL) $(TMAKE) libdoxygen.pro >Makefile.libdoxygen
-       $(ENV) $(PERL) $(TMAKE) libdoxycfg.pro >Makefile.libdoxycfg
-       $(ENV) $(PERL) $(TMAKE) doxygen.pro >Makefile.doxygen
+       $(ENV) $(PERL) "$(TMAKE)" libdoxygen.pro >Makefile.libdoxygen
+       $(ENV) $(PERL) "$(TMAKE)" libdoxycfg.pro >Makefile.libdoxycfg
+       $(ENV) $(PERL) "$(TMAKE)" doxygen.pro >Makefile.doxygen
 
 # clean objects
 clean: Makefile.libdoxygen Makefile.libdoxycfg Makefile.doxygen 
index 09f5b63..eba452c 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 2e704f5..427b012 100644 (file)
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
 #ifndef _BUFSTR_H
 #define _BUFSTR_H
 
+#include <qglobal.h>
+#include <qcstring.h>
+#include <stdlib.h>
+
 /*! @brief Buffer used to store strings
  *  
  *  This buffer is used append characters and strings. It will automatically
index 91dd1e1..576c4bf 100644 (file)
@@ -88,11 +88,19 @@ static QCString getListOfBibFiles(const QCString &sep,bool namesOnly)
 
 void CiteDict::writeLatexBibliography(FTextStream &t)
 {
-  if (m_entries.count()==0) return;
+  if (m_entries.isEmpty())
+    return;
+
   QCString style = Config_getString("LATEX_BIB_STYLE");
-  if (style.isEmpty()) style="plain";
-  t << "\\newpage \\bibliographystyle{" << style << "}" << endl;
-  t << "\\bibliography{" << getListOfBibFiles(",",TRUE) << "}" << endl;
+  if (style.isEmpty())
+    style="plain";
+  t << "% Bibliography\n"
+       "\\newpage\n"
+       "\\phantomsection\n"
+       "\\addcontentsline{toc}{part}{" << theTranslator->trCiteReferences() << "}\n"
+       "\\bibliographystyle{" << style << "}\n"
+       "\\bibliography{" << getListOfBibFiles(",",TRUE) << "}\n"
+       "\n";
 }
 
 void CiteDict::insert(const char *label)
@@ -130,7 +138,7 @@ void CiteDict::generatePage() const
   f.setName(citeListFile);
   if (!f.open(IO_WriteOnly)) 
   {
-    err("error: could not open file %s for writing\n",citeListFile.data());
+    err("could not open file %s for writing\n",citeListFile.data());
   }
   FTextStream t(&f);
   t << "<!-- BEGIN CITATIONS -->" << endl;
@@ -153,7 +161,7 @@ void CiteDict::generatePage() const
   QCString bib2xhtml = bib2xhtml_pl;
   if (!f.open(IO_WriteOnly)) 
   {
-    err("error: could not open file %s for writing\n",bib2xhtmlFile.data());
+    err("could not open file %s for writing\n",bib2xhtmlFile.data());
   }
   f.writeBlock(bib2xhtml, bib2xhtml.length());
   f.close();
@@ -164,7 +172,7 @@ void CiteDict::generatePage() const
   f.setName(doxygenBstFile);
   if (!f.open(IO_WriteOnly)) 
   {
-    err("error: could not open file %s for writing\n",doxygenBstFile.data());
+    err("could not open file %s for writing\n",doxygenBstFile.data());
   }
   f.writeBlock(bstData, bstData.length());
   f.close();
@@ -198,7 +206,7 @@ void CiteDict::generatePage() const
       }
       else if (!fi.exists())
       {
-        err("Error: bib file %s not found!\n",bibFile.data());
+        err("bib file %s not found!\n",bibFile.data());
       }
       bibdata = citeDataList.next();
     }
@@ -218,7 +226,7 @@ void CiteDict::generatePage() const
   f.setName(citeListFile);
   if (!f.open(IO_ReadOnly)) 
   {
-    err("error: could not open file %s/citelist.doc for reading\n",outputDir.data());
+    err("could not open file %s/citelist.doc for reading\n",outputDir.data());
   }
   bool insideBib=FALSE;
   
@@ -285,7 +293,7 @@ void CiteDict::generatePage() const
       }
       else
       {
-        err("Error: bib file %s not found!\n",bibFile.data());
+        err("bib file %s not found!\n",bibFile.data());
       }
       bibdata = citeDataList.next();
     }
diff --git a/src/clangparser.cpp b/src/clangparser.cpp
new file mode 100644 (file)
index 0000000..459fd26
--- /dev/null
@@ -0,0 +1,944 @@
+#include "clangparser.h"
+#include "settings.h"
+#include <stdio.h>
+
+#if USE_LIBCLANG
+#include <clang-c/Index.h>
+#include <qfileinfo.h>
+#include <stdlib.h>
+#include "message.h"
+#include "sortdict.h"
+#include "outputgen.h"
+#include "filedef.h"
+#include "memberdef.h"
+#include "doxygen.h"
+#include "util.h"
+#include "config.h"
+#include "growbuf.h"
+#include "membername.h"
+#include "filename.h"
+
+static Definition *g_currentDefinition=0;
+static MemberDef  *g_currentMemberDef=0;
+static uint        g_currentLine=0;
+static bool        g_searchForBody=FALSE;
+static bool        g_insideBody=FALSE;
+static uint        g_bracketCount=0;
+#endif
+
+ClangParser *ClangParser::instance()
+{
+  if (!s_instance) s_instance = new ClangParser;
+  return s_instance;
+}
+
+ClangParser *ClangParser::s_instance = 0;
+
+//--------------------------------------------------------------------------
+#if USE_LIBCLANG
+
+class ClangParser::Private
+{
+  public:
+    enum DetectedLang { Detected_Cpp, Detected_ObjC, Detected_ObjCpp };
+    Private() : tu(0), tokens(0), numTokens(0), cursors(0), 
+                ufs(0), sources(0), numFiles(0), fileMapping(257),
+                detectedLang(Detected_Cpp)
+    { fileMapping.setAutoDelete(TRUE); }
+    int getCurrentTokenLine();
+    CXIndex index;
+    CXTranslationUnit tu;
+    QCString fileName;
+    CXToken *tokens;
+    uint numTokens;
+    CXCursor *cursors;
+    uint curLine;
+    uint curToken;
+    CXUnsavedFile *ufs;
+    QCString *sources;
+    uint numFiles;
+    QDict<uint> fileMapping;
+    DetectedLang detectedLang;
+};
+
+static QCString detab(const QCString &s)
+{
+  static int tabSize = Config_getInt("TAB_SIZE");
+  GrowBuf out;
+  int size = s.length();
+  const char *data = s.data();
+  int i=0;
+  int col=0;
+  const int maxIndent=1000000; // value representing infinity
+  int minIndent=maxIndent;
+  while (i<size)
+  {
+    char c = data[i++];
+    switch(c)
+    {
+      case '\t': // expand tab
+        {
+          int stop = tabSize - (col%tabSize);
+          //printf("expand at %d stop=%d\n",col,stop);
+          col+=stop;
+          while (stop--) out.addChar(' '); 
+        }
+        break;
+      case '\n': // reset colomn counter
+        out.addChar(c);
+        col=0;
+        break;
+      case ' ': // increment column counter
+        out.addChar(c);
+        col++;
+        break;
+      default: // non-whitespace => update minIndent
+        out.addChar(c);
+        if (c<0 && i<size) // multibyte sequence
+        {
+          out.addChar(data[i++]); // >= 2 bytes
+          if (((uchar)c&0xE0)==0xE0 && i<size)
+          {
+            out.addChar(data[i++]); // 3 bytes
+          }
+          if (((uchar)c&0xF0)==0xF0 && i<size)
+          {
+            out.addChar(data[i++]); // 4 byres
+          }
+        }
+        if (col<minIndent) minIndent=col;
+        col++;
+    }
+  }
+  out.addChar(0);
+  //printf("detab refIndent=%d\n",refIndent);
+  return out.get();
+}
+
+/** Callback function called for each include in a translation unit */
+static void inclusionVisitor(CXFile includedFile,
+                             CXSourceLocation* /*inclusionStack*/,
+                             unsigned /*includeLen*/,
+                             CXClientData clientData)
+{
+  QDict<void> *fileDict = (QDict<void> *)clientData;
+  CXString incFileName = clang_getFileName(includedFile);
+  //printf("--- file %s includes %s\n",fileName,clang_getCString(incFileName));
+  fileDict->insert(clang_getCString(incFileName),(void*)0x8);
+  clang_disposeString(incFileName);
+}
+
+/** filter the \a files and only keep those that are found as include files
+ *  within the current translation unit.
+ *  @param[in,out] files The list of files to filter.
+ */ 
+void ClangParser::determineInputFilesInSameTu(QStrList &files)
+{
+  // put the files in this translation unit in a dictionary
+  QDict<void> incFound(257);
+  clang_getInclusions(p->tu,
+      inclusionVisitor,
+      (CXClientData)&incFound
+      );
+  // create a new filtered file list
+  QStrList resultIncludes;
+  QStrListIterator it2(files);
+  for (it2.toFirst();it2.current();++it2)
+  {
+    if (incFound.find(it2.current()))
+    {
+      resultIncludes.append(it2.current());
+    }
+  }
+  // replace the original list
+  files=resultIncludes;
+}
+
+void ClangParser::start(const char *fileName,QStrList &filesInTranslationUnit)
+{
+  static bool clangAssistedParsing = Config_getBool("CLANG_ASSISTED_PARSING");
+  static QStrList &includePath = Config_getList("INCLUDE_PATH");
+  static QStrList clangOptions = Config_getList("CLANG_OPTIONS");
+  if (!clangAssistedParsing) return;
+  //printf("ClangParser::start(%s)\n",fileName);
+  p->fileName = fileName;
+  p->index    = clang_createIndex(0, 0);
+  p->curLine  = 1;
+  p->curToken = 0;
+  char **argv = (char**)malloc(sizeof(char*)*(4+Doxygen::inputPaths.count()+includePath.count()+clangOptions.count()));
+  QDictIterator<void> di(Doxygen::inputPaths);
+  int argc=0;
+  // add include paths for input files
+  for (di.toFirst();di.current();++di,++argc)
+  {
+    QCString inc = QCString("-I")+di.currentKey();
+    argv[argc]=strdup(inc.data());
+    //printf("argv[%d]=%s\n",argc,argv[argc]);
+  }
+  // add external include paths
+  for (uint i=0;i<includePath.count();i++)
+  {
+    QCString inc = QCString("-I")+includePath.at(i);
+    argv[argc++]=strdup(inc.data());
+  }
+  // user specified options
+  for (uint i=0;i<clangOptions.count();i++)
+  {
+    argv[argc++]=strdup(clangOptions.at(i));
+  }
+  // extra options
+  argv[argc++]=strdup("-ferror-limit=0");
+  argv[argc++]=strdup("-x");
+
+  // Since we can be presented with a .h file that can contain C/C++ or
+  // Objective C code and we need to configure the parser before knowing this,
+  // we use the source file to detected the language. Detection will fail if you
+  // pass a bunch of .h files containing ObjC code, and no sources :-(
+  SrcLangExt lang = getLanguageFromFileName(fileName);
+  if (lang==SrcLangExt_ObjC || p->detectedLang!=ClangParser::Private::Detected_Cpp)
+  {
+    QCString fn = fileName;
+    if (p->detectedLang==ClangParser::Private::Detected_Cpp && 
+        (fn.right(4).lower()==".cpp" || fn.right(4).lower()==".cxx" ||
+         fn.right(3).lower()==".cc" || fn.right(2).lower()==".c"))
+    { // fall back to C/C++ once we see an extension that indicates this
+      p->detectedLang = ClangParser::Private::Detected_Cpp;
+    }
+    else if (fn.right(3).lower()==".mm") // switch to Objective C++
+    {
+      p->detectedLang = ClangParser::Private::Detected_ObjCpp;
+    }
+    else if (fn.right(2).lower()==".m") // switch to Objective C
+    {
+      p->detectedLang = ClangParser::Private::Detected_ObjC;
+    }
+  }
+  switch(p->detectedLang)
+  {
+    case ClangParser::Private::Detected_Cpp: 
+      argv[argc++]=strdup("c++"); 
+      break;
+    case ClangParser::Private::Detected_ObjC: 
+      argv[argc++]=strdup("objective-c"); 
+      break;
+    case ClangParser::Private::Detected_ObjCpp: 
+      argv[argc++]=strdup("objective-c++"); 
+      break;
+  }
+
+  // provide the input and and its dependencies as unsaved files so we can
+  // pass the filtered versions
+  argv[argc++]=strdup(fileName);
+  static bool filterSourceFiles = Config_getBool("FILTER_SOURCE_FILES");
+  //printf("source %s ----------\n%s\n-------------\n\n",
+  //    fileName,p->source.data());
+  uint numUnsavedFiles = filesInTranslationUnit.count()+1;
+  p->numFiles = numUnsavedFiles;
+  p->sources = new QCString[numUnsavedFiles];
+  p->ufs     = new CXUnsavedFile[numUnsavedFiles];
+  p->sources[0]      = detab(fileToString(fileName,filterSourceFiles,TRUE));
+  p->ufs[0].Filename = strdup(fileName);
+  p->ufs[0].Contents = p->sources[0].data();
+  p->ufs[0].Length   = p->sources[0].length();
+  QStrListIterator it(filesInTranslationUnit);
+  uint i=1;
+  for (it.toFirst();it.current() && i<numUnsavedFiles;++it,i++)
+  {
+    p->fileMapping.insert(it.current(),new uint(i));
+    p->sources[i]      = detab(fileToString(it.current(),filterSourceFiles,TRUE));
+    p->ufs[i].Filename = strdup(it.current());
+    p->ufs[i].Contents = p->sources[i].data();
+    p->ufs[i].Length   = p->sources[i].length();
+  }
+
+  // let libclang do the actual parsing
+  p->tu = clang_parseTranslationUnit(p->index, 0,
+                                     argv, argc, p->ufs, numUnsavedFiles, 
+                                     CXTranslationUnit_DetailedPreprocessingRecord);
+  // free arguments
+  for (int i=0;i<argc;++i)
+  {
+    free(argv[i]);
+  }
+  free(argv);
+
+  if (p->tu)
+  {
+    // filter out any includes not found by the clang parser
+    determineInputFilesInSameTu(filesInTranslationUnit);
+
+    // show any warnings that the compiler produced
+    for (uint i=0, n=clang_getNumDiagnostics(p->tu); i!=n; ++i) 
+    {
+      CXDiagnostic diag = clang_getDiagnostic(p->tu, i); 
+      CXString string = clang_formatDiagnostic(diag,
+          clang_defaultDiagnosticDisplayOptions()); 
+      err("%s [clang]\n",clang_getCString(string));
+      clang_disposeString(string);
+      clang_disposeDiagnostic(diag);
+    }
+
+    // create a source range for the given file
+    QFileInfo fi(fileName);
+    CXFile f = clang_getFile(p->tu, fileName);
+    CXSourceLocation fileBegin = clang_getLocationForOffset(p->tu, f, 0);
+    CXSourceLocation fileEnd   = clang_getLocationForOffset(p->tu, f, p->ufs[0].Length);
+    CXSourceRange    fileRange = clang_getRange(fileBegin, fileEnd);
+
+    // produce a token stream for the file
+    clang_tokenize(p->tu,fileRange,&p->tokens,&p->numTokens);
+
+    // produce cursors for each token in the stream
+    p->cursors=new CXCursor[p->numTokens];
+    clang_annotateTokens(p->tu,p->tokens,p->numTokens,p->cursors);
+  }
+  else
+  {
+    p->tokens    = 0;
+    p->numTokens = 0;
+    p->cursors   = 0;
+    err("clang: Failed to parse translation unit %s\n",fileName);
+  }
+}
+
+void ClangParser::switchToFile(const char *fileName)
+{
+  if (p->tu)
+  {
+    delete[] p->cursors;
+    clang_disposeTokens(p->tu,p->tokens,p->numTokens);
+    p->tokens    = 0;
+    p->numTokens = 0;
+    p->cursors   = 0;
+
+    QFileInfo fi(fileName);
+    CXFile f = clang_getFile(p->tu, fileName);
+    uint *pIndex=p->fileMapping.find(fileName);
+    if (pIndex && *pIndex<p->numFiles)
+    {
+      uint i=*pIndex;
+      //printf("switchToFile %s: len=%ld\n",fileName,p->ufs[i].Length);
+      CXSourceLocation fileBegin = clang_getLocationForOffset(p->tu, f, 0);
+      CXSourceLocation fileEnd   = clang_getLocationForOffset(p->tu, f, p->ufs[i].Length);
+      CXSourceRange    fileRange = clang_getRange(fileBegin, fileEnd);
+
+      clang_tokenize(p->tu,fileRange,&p->tokens,&p->numTokens);
+      p->cursors=new CXCursor[p->numTokens];
+      clang_annotateTokens(p->tu,p->tokens,p->numTokens,p->cursors);
+
+      p->curLine  = 1;
+      p->curToken = 0;
+    }
+    else
+    {
+      err("clang: Failed to find input file %s in mapping\n",fileName);
+    }
+  }
+}
+
+void ClangParser::finish()
+{
+  static bool clangAssistedParsing = Config_getBool("CLANG_ASSISTED_PARSING");
+  if (!clangAssistedParsing) return;
+  if (p->tu)
+  {
+    //printf("ClangParser::finish()\n");
+    delete[] p->cursors;
+    clang_disposeTokens(p->tu,p->tokens,p->numTokens);
+    clang_disposeTranslationUnit(p->tu);
+    clang_disposeIndex(p->index);
+    p->fileMapping.clear();
+    p->tokens    = 0;
+    p->numTokens = 0;
+    p->cursors   = 0;
+  }
+  for (uint i=0;i<p->numFiles;i++)
+  {
+    free((void *)p->ufs[i].Filename);
+  }
+  delete[] p->ufs;
+  delete[] p->sources;
+  p->ufs       = 0;
+  p->sources   = 0;
+  p->numFiles  = 0;
+  p->tu        = 0;
+}
+
+int ClangParser::Private::getCurrentTokenLine()
+{
+  uint l, c;
+  if (numTokens==0) return 1;
+  // guard against filters that reduce the number of lines
+  if (curToken>=numTokens) curToken=numTokens-1;
+  CXSourceLocation start = clang_getTokenLocation(tu,tokens[curToken]);
+  clang_getSpellingLocation(start, 0, &l, &c, 0);
+  return l;
+}
+
+QCString ClangParser::lookup(uint line,const char *symbol)
+{
+  //printf("ClangParser::lookup(%d,%s)\n",line,symbol);
+  QCString result;
+  if (symbol==0) return result;
+  static bool clangAssistedParsing = Config_getBool("CLANG_ASSISTED_PARSING");
+  if (!clangAssistedParsing) return result;
+
+  int sl = strlen(symbol);
+  uint l = p->getCurrentTokenLine();
+  while (l>=line && p->curToken>0)
+  {
+    if (l==line) // already at the right line
+    {
+      p->curToken--; // linear search to start of the line
+      l = p->getCurrentTokenLine();
+    }
+    else 
+    {
+      p->curToken/=2; // binary search backward
+      l = p->getCurrentTokenLine();
+    }
+  }
+  bool found=FALSE;
+  while (l<=line && p->curToken<p->numTokens && !found)
+  {
+    CXString tokenString = clang_getTokenSpelling(p->tu, p->tokens[p->curToken]);
+    //if (l==line)
+    //{
+    //  printf("try to match symbol %s with token %s\n",symbol,clang_getCString(tokenString));
+    //}
+    const char *ts = clang_getCString(tokenString);
+    int tl = strlen(ts);
+    int startIndex = p->curToken;
+    if (l==line && strncmp(ts,symbol,tl)==0) // found partial match at the correct line
+    {
+      int offset = tl;
+      while (offset<sl) // symbol spans multiple tokens
+      {
+        //printf("found partial match\n");
+        p->curToken++;
+        if (p->curToken>=p->numTokens)
+        {
+          break; // end of token stream
+        }
+        l = p->getCurrentTokenLine();
+        clang_disposeString(tokenString);
+        tokenString = clang_getTokenSpelling(p->tu, p->tokens[p->curToken]);
+        ts = clang_getCString(tokenString);
+        tl = ts ? strlen(ts) : 0;
+        // skip over any spaces in the symbol
+        char c;
+        while (offset<sl && ((c=symbol[offset])==' ' || c=='\t' || c=='\r' || c=='\n'))
+        {
+          offset++;
+        }
+        if (strncmp(ts,symbol+offset,tl)!=0) // next token matches?
+        {
+          //printf("no match '%s'<->'%s'\n",ts,symbol+offset);
+          break; // no match
+        }
+        //printf("partial match '%s'<->'%s'\n",ts,symbol+offset);
+        offset+=tl;
+      }
+      if (offset==sl) // symbol matches the token(s)
+      {
+        CXCursor c = p->cursors[p->curToken];
+        CXString usr = clang_getCursorUSR(c);
+        //printf("found full match %s usr='%s'\n",symbol,clang_getCString(usr));
+        result = clang_getCString(usr);
+        clang_disposeString(usr);
+        found=TRUE;
+      }
+      else // reset token cursor to start of the search
+      {
+        p->curToken = startIndex;
+      }
+    }
+    clang_disposeString(tokenString);
+    p->curToken++;
+    if (p->curToken<p->numTokens)
+    {
+      l = p->getCurrentTokenLine();
+    }
+  }
+  //if (!found)
+  //{
+  //  printf("Did not find symbol %s at line %d :-(\n",symbol,line);
+  //}
+  //else
+  //{
+  //  printf("Found symbol %s usr=%s\n",symbol,result.data());
+  //}
+  return result;
+}
+
+static QCString keywordToType(const char *keyword)
+{
+  static bool init=TRUE;
+  static QDict<void> flowKeywords(47);
+  static QDict<void> typeKeywords(47);
+  if (init)
+  {
+    flowKeywords.insert("break",(void*)0x8);
+    flowKeywords.insert("case",(void*)0x8);
+    flowKeywords.insert("catch",(void*)0x8);
+    flowKeywords.insert("continue",(void*)0x8);
+    flowKeywords.insert("default",(void*)0x8);
+    flowKeywords.insert("do",(void*)0x8);
+    flowKeywords.insert("else",(void*)0x8);
+    flowKeywords.insert("finally",(void*)0x8);
+    flowKeywords.insert("for",(void*)0x8);
+    flowKeywords.insert("foreach",(void*)0x8);
+    flowKeywords.insert("for each",(void*)0x8);
+    flowKeywords.insert("goto",(void*)0x8);
+    flowKeywords.insert("if",(void*)0x8);
+    flowKeywords.insert("return",(void*)0x8);
+    flowKeywords.insert("switch",(void*)0x8);
+    flowKeywords.insert("throw",(void*)0x8);
+    flowKeywords.insert("throws",(void*)0x8);
+    flowKeywords.insert("try",(void*)0x8);
+    flowKeywords.insert("while",(void*)0x8);
+    flowKeywords.insert("@try",(void*)0x8);
+    flowKeywords.insert("@catch",(void*)0x8);
+    flowKeywords.insert("@finally",(void*)0x8);
+
+    typeKeywords.insert("bool",(void*)0x8);
+    typeKeywords.insert("char",(void*)0x8);
+    typeKeywords.insert("double",(void*)0x8);
+    typeKeywords.insert("float",(void*)0x8);
+    typeKeywords.insert("int",(void*)0x8);
+    typeKeywords.insert("long",(void*)0x8);
+    typeKeywords.insert("object",(void*)0x8);
+    typeKeywords.insert("short",(void*)0x8);
+    typeKeywords.insert("signed",(void*)0x8);
+    typeKeywords.insert("unsigned",(void*)0x8);
+    typeKeywords.insert("void",(void*)0x8);
+    typeKeywords.insert("wchar_t",(void*)0x8);
+    typeKeywords.insert("size_t",(void*)0x8);
+    typeKeywords.insert("boolean",(void*)0x8);
+    typeKeywords.insert("id",(void*)0x8);
+    typeKeywords.insert("SEL",(void*)0x8);
+    typeKeywords.insert("string",(void*)0x8);
+    typeKeywords.insert("nullptr",(void*)0x8);
+    init=FALSE;
+  }
+  if (flowKeywords[keyword]) return "keywordflow";
+  if (typeKeywords[keyword]) return "keywordtype";
+  return "keyword";
+}
+
+static void writeLineNumber(CodeOutputInterface &ol,FileDef *fd,uint line)
+{
+  Definition *d = fd ? fd->getSourceDefinition(line) : 0;
+  if (d && d->isLinkable())
+  {
+    g_currentDefinition=d;
+    g_currentLine=line;
+    MemberDef *md = fd->getSourceMember(line);
+    if (md && md->isLinkable())  // link to member
+    {
+      if (g_currentMemberDef!=md) // new member, start search for body
+      {
+        g_searchForBody=TRUE;
+        g_insideBody=FALSE;
+        g_bracketCount=0;
+      }
+      g_currentMemberDef=md;
+      ol.writeLineNumber(md->getReference(),
+                         md->getOutputFileBase(),
+                         md->anchor(),
+                         line);
+    }
+    else // link to compound
+    {
+      g_currentMemberDef=0;
+      ol.writeLineNumber(d->getReference(),
+                         d->getOutputFileBase(),
+                         d->anchor(),
+                         line);
+    }
+  }
+  else // no link
+  {
+    ol.writeLineNumber(0,0,0,line);
+  }
+
+  // set search page target
+  if (Doxygen::searchIndex)
+  {
+    QCString lineAnchor;
+    lineAnchor.sprintf("l%05d",line);
+    ol.setCurrentDoc(fd,lineAnchor,TRUE);
+  }
+
+  //printf("writeLineNumber(%d) g_searchForBody=%d\n",line,g_searchForBody);
+}
+
+static void codifyLines(CodeOutputInterface &ol,FileDef *fd,const char *text,
+                        uint &line,uint &column,const char *fontClass=0)
+{
+  if (fontClass) ol.startFontClass(fontClass);
+  const char *p=text,*sp=p;
+  char c;
+  bool done=FALSE;
+  while (!done)
+  {
+    sp=p;
+    while ((c=*p++) && c!='\n') { column++; }
+    if (c=='\n')
+    {
+      line++;
+      int l = (int)(p-sp-1);
+      column=l+1;
+      char *tmp = (char*)malloc(l+1);
+      memcpy(tmp,sp,l);
+      tmp[l]='\0';
+      ol.codify(tmp);
+      free(tmp);
+      if (fontClass) ol.endFontClass();
+      ol.endCodeLine();
+      ol.startCodeLine(TRUE);
+      writeLineNumber(ol,fd,line);
+      if (fontClass) ol.startFontClass(fontClass);
+    }
+    else
+    {
+      ol.codify(sp);
+      done=TRUE;
+    }
+  }
+  if (fontClass) ol.endFontClass();
+}
+
+static void writeMultiLineCodeLink(CodeOutputInterface &ol,
+                  FileDef *fd,uint &line,uint &column,
+                  const char *ref,const char *file,
+                  const char *anchor,const char *text,
+                 const char *tooltip)
+{
+  bool done=FALSE;
+  char *p=(char *)text;
+  while (!done)
+  {
+    char *sp=p;
+    char c;
+    while ((c=*p++) && c!='\n') { column++; }
+    if (c=='\n')
+    {
+      line++;
+      *(p-1)='\0';
+      //printf("writeCodeLink(%s,%s,%s,%s)\n",ref,file,anchor,sp);
+      ol.writeCodeLink(ref,file,anchor,sp,tooltip);
+      ol.endCodeLine();
+      ol.startCodeLine(TRUE);
+      writeLineNumber(ol,fd,line);
+    }
+    else
+    {
+      //printf("writeCodeLink(%s,%s,%s,%s)\n",ref,file,anchor,sp);
+      ol.writeCodeLink(ref,file,anchor,sp,tooltip);
+      done=TRUE;
+    }
+  }
+}
+
+void ClangParser::linkInclude(CodeOutputInterface &ol,FileDef *fd,
+    uint &line,uint &column,const char *text)
+{
+  QCString incName = text;
+  incName = incName.mid(1,incName.length()-2); // strip ".." or  <..>
+  FileDef *ifd=0;
+  if (!incName.isEmpty())
+  {
+    FileName *fn = Doxygen::inputNameDict->find(incName);
+    if (fn)
+    {
+      bool found=false;
+      FileNameIterator fni(*fn);
+      // for each include name
+      for (fni.toFirst();!found && (ifd=fni.current());++fni)
+      {
+        // see if this source file actually includes the file
+        found = fd->isIncluded(ifd->absFilePath());
+        //printf("      include file %s found=%d\n",ifd->absFilePath().data(),found);
+      }
+    }
+  }
+  if (ifd)
+  {
+    ol.writeCodeLink(ifd->getReference(),ifd->getOutputFileBase(),0,text,ifd->briefDescriptionAsTooltip());
+  }
+  else
+  {
+    codifyLines(ol,ifd,text,line,column,"preprocessor");
+  }
+}
+
+void ClangParser::linkMacro(CodeOutputInterface &ol,FileDef *fd,
+    uint &line,uint &column,const char *text)
+{
+  MemberName *mn=Doxygen::functionNameSDict->find(text);
+  if (mn)
+  {
+    MemberNameIterator mni(*mn);
+    MemberDef *md;
+    for (mni.toFirst();(md=mni.current());++mni)
+    {
+      if (md->isDefine())
+      {
+        writeMultiLineCodeLink(ol,
+            fd,line,column,
+            md->getReference(),
+            md->getOutputFileBase(),
+            md->anchor(),
+            text,
+            md->briefDescriptionAsTooltip()
+            );
+        return;
+      }
+    }
+  }
+  codifyLines(ol,fd,text,line,column);
+}
+
+
+void ClangParser::linkIdentifier(CodeOutputInterface &ol,FileDef *fd,
+    uint &line,uint &column,const char *text,int tokenIndex)
+{
+  CXCursor c = p->cursors[tokenIndex];
+  CXCursor r = clang_getCursorReferenced(c);
+  if (!clang_equalCursors(r, c))
+  {
+    c=r; // link to referenced location
+  }
+  CXCursor t = clang_getSpecializedCursorTemplate(c);
+  if (!clang_Cursor_isNull(t) && !clang_equalCursors(t,c))
+  {
+    c=t; // link to template 
+  }
+  CXString usr = clang_getCursorUSR(c);
+  const char *usrStr = clang_getCString(usr);
+
+  Definition *d = usrStr ? Doxygen::clangUsrMap->find(usrStr) : 0;
+  //CXCursorKind kind = clang_getCursorKind(c);
+  //if (d==0)
+  //{
+  //  printf("didn't find definition for '%s' usr='%s' kind=%d\n",
+  //      text,usrStr,kind);
+  //}
+  //else
+  //{
+  //  printf("found definition for '%s' usr='%s' name='%s'\n",
+  //      text,usrStr,d->name().data());
+  //}
+  if (d && d->isLinkable())
+  {
+    if (g_insideBody &&
+        g_currentMemberDef && d->definitionType()==Definition::TypeMember && 
+        (g_currentMemberDef!=d || g_currentLine<line)) // avoid self-reference
+    {
+      addDocCrossReference(g_currentMemberDef,(MemberDef*)d);
+    }
+    writeMultiLineCodeLink(ol,
+        fd,line,column,
+        d->getReference(),
+        d->getOutputFileBase(),
+        d->anchor(),
+        text,
+        d->briefDescriptionAsTooltip()
+        );
+  }
+  else
+  {
+    codifyLines(ol,fd,text,line,column);
+  }
+  clang_disposeString(usr);
+}
+
+static void detectFunctionBody(const char *s)
+{
+  //printf("punct=%s g_searchForBody=%d g_insideBody=%d g_bracketCount=%d\n",
+  //  s,g_searchForBody,g_insideBody,g_bracketCount);
+
+  if (g_searchForBody && (qstrcmp(s,":")==0 || qstrcmp(s,"{")==0)) // start of 'body' (: is for constructor)
+  {
+    g_searchForBody=FALSE;
+    g_insideBody=TRUE;
+  }
+  else if (g_searchForBody && qstrcmp(s,";")==0) // declaration only
+  {
+    g_searchForBody=FALSE;
+    g_insideBody=FALSE;
+  }
+  if (g_insideBody && qstrcmp(s,"{")==0) // increase scoping level
+  {
+    g_bracketCount++;
+  }
+  if (g_insideBody && qstrcmp(s,"}")==0) // decrease scoping level
+  {
+    g_bracketCount--;
+    if (g_bracketCount<=0) // got outside of function body
+    {
+      g_insideBody=FALSE;
+      g_bracketCount=0;
+    }
+  }
+}
+
+void ClangParser::writeSources(CodeOutputInterface &ol,FileDef *fd)
+{
+  // (re)set global parser state
+  g_currentDefinition=0;
+  g_currentMemberDef=0;
+  g_currentLine=0;
+  g_searchForBody=FALSE;
+  g_insideBody=FALSE;
+  g_bracketCount=0;
+
+  unsigned int line=1,column=1;
+  QCString lineNumber,lineAnchor;
+  ol.startCodeLine(TRUE);
+  writeLineNumber(ol,fd,line);
+  for (unsigned int i=0;i<p->numTokens;i++)
+  {
+    CXSourceLocation start = clang_getTokenLocation(p->tu, p->tokens[i]);
+    unsigned int l, c;
+    clang_getSpellingLocation(start, 0, &l, &c, 0);
+    if (l > line) column = 1;
+    while (line<l) 
+    { 
+      line++; 
+      ol.endCodeLine();
+      ol.startCodeLine(TRUE);
+      writeLineNumber(ol,fd,line);
+    } 
+    while (column<c) { ol.codify(" "); column++; }
+    CXString tokenString = clang_getTokenSpelling(p->tu, p->tokens[i]);
+    char const *s = clang_getCString(tokenString);
+    CXCursorKind cursorKind  = clang_getCursorKind(p->cursors[i]);
+    CXTokenKind tokenKind = clang_getTokenKind(p->tokens[i]);
+    //printf("%d:%d %s cursorKind=%d tokenKind=%d\n",line,column,s,cursorKind,tokenKind);
+    switch (tokenKind)
+    {
+      case CXToken_Keyword: 
+        if (strcmp(s,"operator")==0)
+        {
+          linkIdentifier(ol,fd,line,column,s,i);
+        }
+        else
+        {
+          codifyLines(ol,fd,s,line,column,
+              cursorKind==CXCursor_PreprocessingDirective ? "preprocessor" :
+              keywordToType(s));
+        }
+        break;
+      case CXToken_Literal: 
+        if (cursorKind==CXCursor_InclusionDirective)
+        {
+          linkInclude(ol,fd,line,column,s);
+        }
+        else if (s[0]=='"' || s[0]=='\'') 
+        {
+          codifyLines(ol,fd,s,line,column,"stringliteral");
+        }
+        else 
+        {
+          codifyLines(ol,fd,s,line,column);
+        }
+        break;
+      case CXToken_Comment: 
+        codifyLines(ol,fd,s,line,column,"comment");
+        break;
+      default:  // CXToken_Punctuation or CXToken_Identifier
+        if (tokenKind==CXToken_Punctuation)
+        {
+          detectFunctionBody(s);
+          //printf("punct %s: %d\n",s,cursorKind);
+        }
+        switch (cursorKind)
+        {
+          case CXCursor_PreprocessingDirective:
+            codifyLines(ol,fd,s,line,column,"preprocessor");
+            break;
+          case CXCursor_MacroDefinition:
+            codifyLines(ol,fd,s,line,column,"preprocessor");
+            break;
+          case CXCursor_InclusionDirective:
+            linkInclude(ol,fd,line,column,s);
+            break;
+          case CXCursor_MacroExpansion:
+            linkMacro(ol,fd,line,column,s);
+            break;
+          default:
+            if (tokenKind==CXToken_Identifier ||
+                (tokenKind==CXToken_Punctuation && // for operators
+                 (cursorKind==CXCursor_DeclRefExpr ||
+                  cursorKind==CXCursor_MemberRefExpr ||
+                  cursorKind==CXCursor_CallExpr ||
+                  cursorKind==CXCursor_ObjCMessageExpr)
+                 )
+               )
+            {
+              linkIdentifier(ol,fd,line,column,s,i);
+              if (Doxygen::searchIndex)
+              {
+                ol.addWord(s,FALSE);
+              }
+            }
+            else
+            {
+              codifyLines(ol,fd,s,line,column);
+            }
+            break;
+        }
+    }
+    clang_disposeString(tokenString);
+  }
+  ol.endCodeLine();
+}
+
+ClangParser::ClangParser()
+{
+  p = new Private;
+}
+
+ClangParser::~ClangParser()
+{
+  delete p;
+}
+
+//--------------------------------------------------------------------------
+#else // use stubbed functionality in case libclang support is disabled.
+
+void ClangParser::start(const char *,QStrList &)
+{
+}
+
+void ClangParser::switchToFile(const char *)
+{
+}
+
+void ClangParser::finish()
+{
+}
+
+QCString ClangParser::lookup(uint,const char *)
+{
+  return "";
+}
+
+void ClangParser::writeSources(CodeOutputInterface &,FileDef *)
+{
+}
+
+ClangParser::ClangParser()
+{
+}
+
+ClangParser::~ClangParser()
+{
+}
+
+
+#endif
+//--------------------------------------------------------------------------
+
diff --git a/src/clangparser.h b/src/clangparser.h
new file mode 100644 (file)
index 0000000..214ea50
--- /dev/null
@@ -0,0 +1,67 @@
+#ifndef CLANGPARSER_H
+#define CLANGPARSER_H
+
+#include <qcstring.h>
+#include <qstrlist.h>
+
+class CodeOutputInterface;
+class FileDef;
+
+/** @brief Wrapper for to let libclang assisted parsing. */
+class ClangParser
+{
+  public:
+    /** Returns the one and only instance of the class */
+    static ClangParser *instance();
+    
+    /** Start parsing a file.
+     *  @param[in] fileName The name of the file to parse.
+     *  @param[in,out] filesInTanslationUnit Other files that are
+     *                 part of the input and included by the file.
+     *                 The function will return a subset of the files,
+     *                 only including the onces that were actually found 
+     *                 during parsing.
+     */
+    void start(const char *fileName,QStrList &filesInTranslationUnit);
+
+    /** Switches to another file within the translation unit started
+     *  with start().
+     *  @param[in] The name of the file to switch to.
+     */
+    void switchToFile(const char *fileName);
+
+    /** Finishes parsing a translation unit. Free any resources that
+     *  were needed for parsing.
+     */
+    void finish();
+
+    /** Looks for \a symbol which should be found at \a line and
+     *  returns a clang unique reference to the symbol.
+     */
+    QCString lookup(uint line,const char *symbol);
+
+    /** writes the syntax highlighted source code for a file
+     *  @param[out] ol The output generator list to write to.
+     *  @param[in]  fd The file to write sources for.
+     */
+    void writeSources(CodeOutputInterface &ol,FileDef *fd);
+
+  private:
+    void linkIdentifier(CodeOutputInterface &ol,FileDef *fd,
+                        uint &line,uint &column,
+                        const char *text,int tokenIndex);
+    void linkMacro(CodeOutputInterface &ol,FileDef *fd,
+                   uint &line,uint &column,
+                   const char *text);
+    void linkInclude(CodeOutputInterface &ol,FileDef *fd,
+                   uint &line,uint &column,
+                   const char *text);
+    void determineInputFilesInSameTu(QStrList &filesInTranslationUnit);
+    class Private;
+    Private *p;
+    ClangParser();
+    virtual ~ClangParser();
+    static ClangParser *s_instance;
+};
+
+#endif
index 8517893..1429fdd 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -187,7 +187,7 @@ class ClassDefImpl
 
     bool isGeneric;
 
-    int spec;
+    uint64 spec;
 };
 
 void ClassDefImpl::init(const char *defFileName, const char *name,
@@ -277,11 +277,11 @@ ClassDefImpl::~ClassDefImpl()
 
 // constructs a new class definition
 ClassDef::ClassDef(
-    const char *defFileName,int defLine,
+    const char *defFileName,int defLine,int defColumn,
     const char *nm,CompoundType ct,
     const char *lref,const char *fName,
     bool isSymbol,bool isJavaEnum) 
- : Definition(defFileName,defLine,removeRedundantWhiteSpace(nm),0,0,isSymbol) 
+ : Definition(defFileName,defLine,defColumn,removeRedundantWhiteSpace(nm),0,0,isSymbol)
 {
   visited=FALSE;
   setReference(lref);
@@ -435,6 +435,12 @@ void ClassDef::internalInsertMember(MemberDef *md,
     {
       switch (md->memberType())
       {
+        case MemberType_Service: // UNO IDL
+          addMemberToList(MemberListType_services,md,TRUE);
+          break;
+        case MemberType_Interface: // UNO IDL
+          addMemberToList(MemberListType_interfaces,md,TRUE);
+          break;
         case MemberType_Signal: // Qt specific
           addMemberToList(MemberListType_signals,md,TRUE);
           break;
@@ -535,6 +541,7 @@ void ClassDef::internalInsertMember(MemberDef *md,
                   break;
                 case Public:    
                   addMemberToList(MemberListType_pubTypes,md,TRUE);
+                  isSimple=QCString(md->typeString()).find(")(")==-1;
                   break;
                 case Private:   
                   addMemberToList(MemberListType_priTypes,md,TRUE);
@@ -580,6 +587,12 @@ void ClassDef::internalInsertMember(MemberDef *md,
     {
       switch (md->memberType())
       {
+        case MemberType_Service: // UNO IDL
+          addMemberToList(MemberListType_serviceMembers,md,FALSE);
+          break;
+        case MemberType_Interface: // UNO IDL
+          addMemberToList(MemberListType_interfaceMembers,md,FALSE);
+          break;
         case MemberType_Property:
           addMemberToList(MemberListType_propertyMembers,md,FALSE);
           break;
@@ -908,8 +921,8 @@ void ClassDef::writeBriefDescription(OutputList &ol,bool exampleFlag)
   if (!briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC"))
   {
     ol.startParagraph();
-    ol.parseDoc(briefFile(),briefLine(),this,0,
-                briefDescription(),TRUE,FALSE,0,TRUE,FALSE);
+    ol.generateDoc(briefFile(),briefLine(),this,0,
+                   briefDescription(),TRUE,FALSE,0,TRUE,FALSE);
     ol.pushGeneratorState();
     ol.disable(OutputGenerator::RTF);
     ol.writeString(" \n");
@@ -943,7 +956,7 @@ void ClassDef::writeDetailedDocumentationBody(OutputList &ol)
   // repeat brief description
   if (!briefDescription().isEmpty() && repeatBrief)
   {
-    ol.parseDoc(briefFile(),briefLine(),this,0,briefDescription(),FALSE,FALSE);
+    ol.generateDoc(briefFile(),briefLine(),this,0,briefDescription(),FALSE,FALSE);
   }
   if (!briefDescription().isEmpty() && repeatBrief &&
       !documentation().isEmpty())
@@ -956,7 +969,7 @@ void ClassDef::writeDetailedDocumentationBody(OutputList &ol)
   // write documentation
   if (!documentation().isEmpty())
   {
-    ol.parseDoc(docFile(),docLine(),this,0,documentation(),TRUE,FALSE);
+    ol.generateDoc(docFile(),docLine(),this,0,documentation(),TRUE,FALSE);
   }
   // write type constraints
   writeTypeConstraints(ol,this,m_impl->typeConstraints);
@@ -1034,6 +1047,14 @@ void ClassDef::showUsedFiles(OutputList &ol)
   {
     ol.parseText(theTranslator->trEnumGeneratedFromFiles(m_impl->files.count()==1));
   }
+  else if (m_impl->compType==Service)
+  {
+    ol.parseText(theTranslator->trServiceGeneratedFromFiles(m_impl->files.count()==1));
+  }
+  else if (m_impl->compType==Singleton)
+  {
+    ol.parseText(theTranslator->trSingletonGeneratedFromFiles(m_impl->files.count()==1));
+  }
   else
   {
     ol.parseText(theTranslator->trGeneratedFromFiles(
@@ -1228,7 +1249,7 @@ void ClassDef::writeInheritanceGraph(OutputList &ol)
       }
       else
       {
-        err("error: invalid marker %d in inherits list!\n",entryIndex);
+        err("invalid marker %d in inherits list!\n",entryIndex);
       }
       index=newIndex+matchLen;
     } 
@@ -1537,6 +1558,11 @@ void ClassDef::writeTagFileMarker()
     {
       Doxygen::tagFile << "    <anchor>" << convertToXML(anchor()) << "</anchor>" << endl;
     }
+    QCString idStr = id();
+    if (!idStr.isEmpty())
+    {
+      Doxygen::tagFile << "    <clangid>" << convertToXML(idStr) << "</clangid>" << endl;
+    }
     if (m_impl->tempArgs)
     {
       ArgumentListIterator ali(*m_impl->tempArgs);
@@ -1791,14 +1817,19 @@ void ClassDef::writeDeclarationLink(OutputList &ol,bool &found,const char *heade
     // add the brief description if available
     if (!briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC"))
     {
-      ol.startMemberDescription(anchor());
-      ol.parseDoc(briefFile(),briefLine(),this,0,
-          briefDescription(),FALSE,FALSE,0,TRUE,FALSE);
-      if (isLinkableInProject())
+      DocRoot *rootNode = validatingParseDoc(briefFile(),briefLine(),this,0,
+                                briefDescription(),FALSE,FALSE,0,TRUE,FALSE);
+      if (rootNode && !rootNode->isEmpty())
       {
-        writeMoreLink(ol,anchor());
+        ol.startMemberDescription(anchor());
+        ol.writeDoc(rootNode,this,0);
+        if (isLinkableInProject())
+        {
+          writeMoreLink(ol,anchor());
+        }
+        ol.endMemberDescription();
       }
-      ol.endMemberDescription();
+      delete rootNode;
     }
     ol.endMemberDeclaration(anchor(),0);
   }
@@ -1810,6 +1841,7 @@ void ClassDef::addClassAttributes(OutputList &ol)
   if (isFinal())    sl.append("final");
   if (isSealed())   sl.append("sealed");
   if (isAbstract()) sl.append("abstract");
+  if (getLanguage()==SrcLangExt_IDL && isPublished()) sl.append("published");
 
   ol.pushGeneratorState();
   ol.disableAllBut(OutputGenerator::Html);
@@ -1922,10 +1954,12 @@ void ClassDef::writeDocumentationContents(OutputList &ol,const QCString & /*page
         writeAuthorSection(ol);
         break;
       case LayoutDocEntry::NamespaceNestedNamespaces:
+      case LayoutDocEntry::NamespaceNestedConstantGroups:
       case LayoutDocEntry::NamespaceClasses:
       case LayoutDocEntry::NamespaceInlineClasses:
       case LayoutDocEntry::FileClasses:
       case LayoutDocEntry::FileNamespaces:
+      case LayoutDocEntry::FileConstantGroups:
       case LayoutDocEntry::FileIncludes:
       case LayoutDocEntry::FileIncludeGraph:
       case LayoutDocEntry::FileIncludedByGraph: 
@@ -1979,6 +2013,14 @@ void ClassDef::writeDocumentation(OutputList &ol)
   {
     pageTitle = theTranslator->trEnumReference(displayName());
   }
+  else if (m_impl->compType==Service)
+  {
+    pageTitle = theTranslator->trServiceReference(displayName());
+  }
+  else if (m_impl->compType==Singleton)
+  {
+    pageTitle = theTranslator->trSingletonReference(displayName());
+  }
   else
   {
     pageTitle = theTranslator->trCompoundReference(displayName(),
@@ -2206,7 +2248,7 @@ void ClassDef::writeMemberList(OutputList &ol)
               ol.parseText(" "+theTranslator->trEnumValue());
             else if (md->isTypedef())
               ol.docify(" typedef");
-            else if (md->isFriend() && !strcmp(md->typeString(),"friend class"))
+            else if (md->isFriend() && !qstrcmp(md->typeString(),"friend class"))
               ol.docify(" class");
             //ol.writeString("\n");
           }
@@ -2287,6 +2329,8 @@ void ClassDef::writeMemberList(OutputList &ol)
              md->isFriend() || md->isRelated() || md->isExplicit() ||
              md->isMutable() || (md->isInline() && Config_getBool("INLINE_INFO")) ||
              md->isSignal() || md->isSlot() ||
+             (getLanguage()==SrcLangExt_IDL &&
+              (md->isOptional() || md->isAttribute() || md->isUNOProperty())) ||
              md->isStatic() || lang==SrcLangExt_VHDL
             )
             && memberWritten)
@@ -2314,6 +2358,18 @@ void ClassDef::writeMemberList(OutputList &ol)
             if (md->isStatic())        sl.append("static");
             if (md->isSignal())        sl.append("signal");
             if (md->isSlot())          sl.append("slot");
+// this is the extra member page
+            if (md->isOptional())      sl.append("optional");
+            if (md->isAttribute())     sl.append("attribute");
+            if (md->isUNOProperty())   sl.append("property");
+            if (md->isReadonly())      sl.append("readonly");
+            if (md->isBound())         sl.append("bound");
+            if (md->isRemovable())     sl.append("removable");
+            if (md->isConstrained())   sl.append("constrained");
+            if (md->isTransient())     sl.append("transient");
+            if (md->isMaybeVoid())     sl.append("maybevoid");
+            if (md->isMaybeDefault())  sl.append("maybedefault");
+            if (md->isMaybeAmbiguous())sl.append("maybeambiguous");
           }
           const char *s=sl.first();
           while (s)
@@ -2574,8 +2630,7 @@ bool ClassDef::isBaseClass(ClassDef *bcd, bool followInstances,int level)
   //printf("isBaseClass(cd=%s) looking for %s\n",name().data(),bcd->name().data());
   if (level>256)
   {
-    err("Possible recursive class relation while inside %s and looking for %s\n",qPrint(name()),qPrint(bcd->name()));
-    abort();
+    err("Possible recursive class relation while inside %s and looking for base class %s\n",qPrint(name()),qPrint(bcd->name()));
     return FALSE;
   }
   if (baseClasses())
@@ -2597,6 +2652,31 @@ bool ClassDef::isBaseClass(ClassDef *bcd, bool followInstances,int level)
   return found;
 }
 
+//----------------------------------------------------------------------
+
+bool ClassDef::isSubClass(ClassDef *cd,int level)
+{
+  bool found=FALSE;
+  if (level>256)
+  {
+    err("Possible recursive class relation while inside %s and looking for derived class %s\n",qPrint(name()),qPrint(cd->name()));
+    return FALSE;
+  }
+  if (subClasses())
+  {
+    BaseClassListIterator bcli(*subClasses());
+    for ( ; bcli.current() && !found ; ++bcli)
+    {
+      ClassDef *ccd=bcli.current()->classDef;
+      if (ccd==cd) 
+        found=TRUE;
+      else 
+        found=ccd->isSubClass(cd,level+1);
+    }
+  }
+  return found;
+}
+
 //----------------------------------------------------------------------------
 
 static bool isStandardFunc(MemberDef *md)
@@ -2674,11 +2754,11 @@ void ClassDef::mergeMembers()
                   if (srcCd==dstCd || dstCd->isBaseClass(srcCd,TRUE)) 
                     // member is in the same or a base class
                   {
-                    LockingPtr<ArgumentList> srcAl = srcMd->argumentList();
-                    LockingPtr<ArgumentList> dstAl = dstMd->argumentList();
+                    ArgumentList *srcAl = srcMd->argumentList();
+                    ArgumentList *dstAl = dstMd->argumentList();
                     found=matchArguments2(
-                        srcMd->getOuterScope(),srcMd->getFileDef(),srcAl.pointer(),
-                        dstMd->getOuterScope(),dstMd->getFileDef(),dstAl.pointer(),
+                        srcMd->getOuterScope(),srcMd->getFileDef(),srcAl,
+                        dstMd->getOuterScope(),dstMd->getFileDef(),dstAl,
                         TRUE
                         );
                     //printf("  Yes, matching (%s<->%s): %d\n",
@@ -3134,7 +3214,7 @@ void ClassDef::determineImplUsageRelation()
               cd=getResolvedClass(getNamespaceDef()->name()+"::"+usedClassName,0,&templSpec);
             }
             if (cd==0) cd=getResolvedClass(name()+"::"+usedClassName,0,&templSpec);
-            if (cd==0) cd=getResolvedClass(usedClassName,0,&templSpec); // TODO: also try inbetween scopes!
+            if (cd==0) cd=getResolvedClass(usedClassName,0,&templSpec); // TODO: also try in-between scopes!
             //printf("Search for class %s result=%p\n",usedClassName.data(),cd);
             if (cd) // class exists 
             {
@@ -3196,7 +3276,7 @@ void ClassDef::addUsedInterfaceClasses(MemberDef *md,const char *typeStr)
   while ((i=re.match(type,p,&l))!=-1) // for each class name in the type
   {
     ClassDef *cd=getClass(name()+"::"+type.mid(i,l));
-    if (cd==0) cd=getClass(type.mid(i,l)); // TODO: also try inbetween scopes!
+    if (cd==0) cd=getClass(type.mid(i,l)); // TODO: also try in-between scopes!
     if (cd && cd!=this && !isBaseClass(cd))
     {
       if (m_impl->usesIntfClassDict==0) 
@@ -3292,6 +3372,8 @@ QCString ClassDef::compoundTypeString() const
       case Protocol:  return "protocol";
       case Category:  return "category";
       case Exception: return "exception";
+      case Service:   return "service";
+      case Singleton: return "singleton";
       default:        return "unknown";
     }
   }
@@ -3467,7 +3549,7 @@ Definition *ClassDef::findInnerCompound(const char *name)
 //}
 
 ClassDef *ClassDef::insertTemplateInstance(const QCString &fileName,
-    int startLine, const QCString &templSpec,bool &freshInstance)
+    int startLine, int startColumn, const QCString &templSpec,bool &freshInstance)
 {
   freshInstance = FALSE;
   if (m_impl->templateInstances==0) 
@@ -3478,8 +3560,9 @@ ClassDef *ClassDef::insertTemplateInstance(const QCString &fileName,
   if (templateClass==0)
   {
     Debug::print(Debug::Classes,0,"      New template instance class `%s'`%s'\n",name().data(),templSpec.data());
+    QCString tcname = removeRedundantWhiteSpace(localName()+templSpec);
     templateClass = new ClassDef(
-        fileName,startLine,localName()+templSpec,ClassDef::Class);
+        fileName,startLine,startColumn,tcname,ClassDef::Class);
     templateClass->setTemplateMaster(this);
     templateClass->setOuterScope(getOuterScope());
     templateClass->setHidden(isHidden());
@@ -3500,7 +3583,8 @@ ClassDef *ClassDef::getVariableInstance(const char *templSpec)
   if (templateClass==0)
   {
     Debug::print(Debug::Classes,0,"      New template variable instance class `%s'`%s'\n",qPrint(name()),qPrint(templSpec));
-    templateClass = new ClassDef("<code>",1,name()+templSpec,
+    QCString tcname = removeRedundantWhiteSpace(name()+templSpec);
+    templateClass = new ClassDef("<code>",1,1,tcname,
                         ClassDef::Class,0,0,FALSE);
     templateClass->addMembersToTemplateInstance( this, templSpec );
     templateClass->setTemplateMaster(this);
@@ -3698,8 +3782,8 @@ void ClassDef::addListReferences()
   if (!isLinkableInProject()) return;
   //printf("ClassDef(%s)::addListReferences()\n",name().data());
   {
-    LockingPtr< QList<ListItemInfo> > xrefItems = xrefListItems();
-    addRefItem(xrefItems.pointer(),
+    QList<ListItemInfo> *xrefItems = xrefListItems();
+    addRefItem(xrefItems,
              qualifiedName(),
              lang==SrcLangExt_Fortran ? theTranslator->trType(TRUE,TRUE)
                                       : theTranslator->trClass(TRUE,TRUE),
@@ -4139,13 +4223,13 @@ void ClassDef::writeMemberDeclarations(OutputList &ol,MemberListType lt,const QC
     //static bool optimizeVhdl = Config_getBool("OPTIMIZE_OUTPUT_VHDL");
     if (ml) 
     {
-      ml->writeDeclarations(ol,this,0,0,0,title,subTitle,FALSE,showInline,inheritedFrom); 
+      ml->writeDeclarations(ol,this,0,0,0,title,subTitle,definitionType(),FALSE,showInline,inheritedFrom); 
       if (lt2!=-1)
       {
         MemberList * ml2 = getMemberList((MemberListType)lt2);
         if (ml2)
         {
-          ml2->writeDeclarations(ol,this,0,0,0,0,0,FALSE,showInline,inheritedFrom); 
+          ml2->writeDeclarations(ol,this,0,0,0,0,0,definitionType(),FALSE,showInline,inheritedFrom); 
         }
       }
     }
@@ -4201,7 +4285,7 @@ void ClassDef::writePlainMemberDeclaration(OutputList &ol,
   if (ml) 
   {
     ml->setInGroup(inGroup);
-    ml->writePlainDeclarations(ol,this,0,0,0,inheritedFrom,inheritId); 
+    ml->writePlainDeclarations(ol,this,0,0,0,definitionType(),inheritedFrom,inheritId); 
   }
 }
 
@@ -4310,6 +4394,11 @@ bool ClassDef::isSealed() const
   return m_impl->spec&Entry::Sealed;
 }
 
+bool ClassDef::isPublished() const
+{
+  return m_impl->spec&Entry::Published;
+}
+
 bool ClassDef::isObjectiveC() const 
 { 
   return getLanguage()==SrcLangExt_ObjC; 
@@ -4510,7 +4599,7 @@ bool ClassDef::isGeneric() const
   return m_impl->isGeneric;
 }
 
-void ClassDef::setClassSpecifier(int spec)
+void ClassDef::setClassSpecifier(uint64 spec)
 {
   m_impl->spec = spec;
 }
index 1525dfd..f4d5962 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -48,7 +48,8 @@ class ArgumentList;
 
 /** A class representing of a compound symbol.
  *
- *  A compound can be a class, struct, union, interface, or exception.
+ *  A compound can be a class, struct, union, interface, service, singleton,
+ *  or exception.
  *  \note This class should be renamed to CompoundDef
  */
 class ClassDef : public Definition
@@ -61,7 +62,9 @@ class ClassDef : public Definition
                         Interface, //=Entry::INTERFACE_SEC,
                         Protocol,  //=Entry::PROTOCOL_SEC,
                         Category,  //=Entry::CATEGORY_SEC,
-                        Exception  //=Entry::EXCEPTION_SEC
+                        Exception, //=Entry::EXCEPTION_SEC
+                        Service,   //=Entry::CLASS_SEC
+                        Singleton, //=Entry::CLASS_SEC
                       };
 
     /** Creates a new compound definition.
@@ -69,7 +72,10 @@ class ClassDef : public Definition
      *                   found.
      *  \param startLine line number where the definition of this compound
      *                   starts.
+     *  \param startColumn column number where the definition of this compound
+     *                   starts.
      *  \param name      the name of this compound (including scope)
+     *  \param symId     unique Id for this symbol
      *  \param ct        the kind of Compound
      *  \param ref       the tag file from which this compound is extracted
      *                   or 0 if the compound doesn't come from a tag file
@@ -82,7 +88,7 @@ class ClassDef : public Definition
      *                    I didn't add this to CompoundType to avoid having
      *                    to adapt all translators.
      */
-    ClassDef(const char *fileName,int startLine,
+    ClassDef(const char *fileName,int startLine,int startColumn,
              const char *name,CompoundType ct,
              const char *ref=0,const char *fName=0,
              bool isSymbol=TRUE,bool isJavaEnum=FALSE);
@@ -185,6 +191,11 @@ class ClassDef : public Definition
      */
     bool isBaseClass(ClassDef *bcd,bool followInstances,int level=0);
 
+    /** Returns TRUE iff \a bcd is a direct or indirect sub class of this
+     *  class.
+     */
+    bool isSubClass(ClassDef *bcd,int level=0);
+
     /** returns TRUE iff \a md is a member of this class or of the
      *  the public/protected members of a base class 
      */
@@ -248,6 +259,9 @@ class ClassDef : public Definition
     /** Returns TRUE if this class is marked as sealed */
     bool isSealed() const;
 
+    /** Returns TRUE if this class is marked as published */
+    bool isPublished() const;
+
     /** Returns TRUE if this class represents an Objective-C 2.0 extension (nameless category) */
     bool isExtension() const;
 
@@ -305,14 +319,14 @@ class ClassDef : public Definition
     void setProtection(Protection p);
     void setGroupDefForAllMembers(GroupDef *g,Grouping::GroupPri_t pri,const QCString &fileName,int startLine,bool hasDocs);
     void addInnerCompound(Definition *d);
-    ClassDef *insertTemplateInstance(const QCString &fileName,int startLine,
+    ClassDef *insertTemplateInstance(const QCString &fileName,int startLine,int startColumn,
                                 const QCString &templSpec,bool &freshInstance);
     void addUsedClass(ClassDef *cd,const char *accessName,Protection prot);
     void addUsedByClass(ClassDef *cd,const char *accessName,Protection prot);
     void setIsStatic(bool b);
     void setCompoundType(CompoundType t);
     void setClassName(const char *name);
-    void setClassSpecifier(int spec);
+    void setClassSpecifier(uint64 spec);
 
     void setTemplateArguments(ArgumentList *al);
     void setTemplateBaseClassNames(QDict<int> *templateNames);
@@ -501,7 +515,7 @@ class BaseClassList : public QList<BaseClassDef>
       if (c1==0 || c2==0) 
         return FALSE;
       else
-        return stricmp(c1->name(),c2->name());
+        return qstricmp(c1->name(),c2->name());
     }
 };
 
index fec1cb8..da5bf5a 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -41,12 +41,12 @@ static int compItems(void *item1,void *item2)
   //printf("compItems: %d %s<->%s\n",b,c1->name().data(),c2->name().data());
   if (b) 
   { 
-     return stricmp(c1->name(),
+     return qstricmp(c1->name(),
                     c2->name());
   }
   else
   {
-     return stricmp(c1->className(),
+     return qstricmp(c1->className(),
                     c2->className());
   }
 }
index abe7064..adc781c 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 767978c..f88f91e 100644 (file)
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -129,6 +129,8 @@ CommandMap cmdMap[] =
   { "rtfonly",       CMD_RTFONLY },
   { "endrtfonly",    CMD_ENDRTFONLY },
   { "vhdlflow",      CMD_VHDLFLOW },
+  { "docbookonly",   CMD_DBONLY },
+  { "enddocbookonly",CMD_ENDDBONLY },
   { 0,               0 },
 };
 
index 968b017..c7b7c37 100644 (file)
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -118,7 +118,9 @@ enum CommandType
   CMD_RTFONLY      = 88, 
   CMD_ENDRTFONLY   = 89,
   CMD_PIPE         = 90,
-  CMD_VHDLFLOW     = 91
+  CMD_VHDLFLOW     = 91,
+  CMD_DBONLY       = 92,
+  CMD_ENDDBONLY    = 93
 };
 
 enum HtmlTagType
index 2c4d68a..3825ac1 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -21,6 +21,8 @@
 class CodeOutputInterface;
 class FileDef;
 class MemberDef;
+class QCString;
+class Definition;
 
 void parseCCode(CodeOutputInterface &,const char *,const QCString &, 
             bool ,const char *,FileDef *fd,
index 8e11d59..01636fa 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
 #include "filename.h"
 #include "namespacedef.h"
 
-#define YY_NEVER_INTERACTIVE 1
-  
 // Toggle for some debugging info
 //#define DBG_CTX(x) fprintf x
 #define DBG_CTX(x) do { } while(0)
-  
+
+#define YY_NEVER_INTERACTIVE 1
+
 #define CLASSBLOCK (int *)4
 #define SCOPEBLOCK (int *)8
 #define INNERBLOCK (int *)12
@@ -68,6 +68,7 @@ static const char *  g_inputString;     //!< the code fragment as text
 static int          g_inputPosition;   //!< read offset during parsing 
 static int           g_inputLines;      //!< number of line in the code fragment
 static int          g_yyLineNr;        //!< current line number
+static int          g_yyColNr;         //!< current column number
 static bool          g_needsTermination;
 
 static bool          g_exampleBlock;
@@ -416,7 +417,7 @@ static void popScope()
   }
   else
   {
-    //err("Error: Too many end of scopes found!\n");
+    //err("Too many end of scopes found!\n");
   }
   //printf("popScope() result: `%s'\n",g_classScope.data());
 }
@@ -491,7 +492,6 @@ static void startCodeLine()
     {
       g_currentDefinition = d;
       g_currentMemberDef = g_sourceFileDef->getSourceMember(g_yyLineNr);
-      //printf("->startCodeLine(%s)=%p\n",d->name().data(),g_currentMemberDef);
       g_insideBody = FALSE;
       g_searchingForBody = TRUE;
       g_realScope = d->name();
@@ -525,6 +525,7 @@ static void startCodeLine()
       g_code->writeLineNumber(0,0,0,g_yyLineNr);
     }
   }
+  DBG_CTX((stderr,"startCodeLine(%d)\n",g_yyLineNr));
   g_code->startCodeLine(g_sourceFileDef && g_lineNumbers); 
   if (g_currentFontClass)
   {
@@ -538,6 +539,7 @@ static void startFontClass(const char *s);
 
 static void endCodeLine()
 {
+  DBG_CTX((stderr,"endCodeLine(%d)\n",g_yyLineNr));
   endFontClass();
   g_code->endCodeLine();
 }
@@ -565,10 +567,11 @@ static void codifyLines(const char *text)
   while (!done)
   {
     sp=p;
-    while ((c=*p++) && c!='\n') { }
+    while ((c=*p++) && c!='\n') { g_yyColNr++; }
     if (c=='\n')
     {
       g_yyLineNr++;
+      g_yyColNr=1;
       //*(p-1)='\0';
       int l = (int)(p-sp-1);
       char *tmp = (char*)malloc(l+1);
@@ -653,7 +656,7 @@ static void addUsingDirective(const char *name)
 static void setParameterList(MemberDef *md)
 {
   g_classScope = md->getClassDef() ? md->getClassDef()->name().data() : "";
-  LockingPtr<ArgumentList> al = md->argumentList();
+  ArgumentList *al = md->argumentList();
   if (al==0) return; 
   Argument *a = al->first();
   while (a)
@@ -702,7 +705,7 @@ static ClassDef *stripClassName(const char *s,Definition *d=g_currentDefinition)
 static MemberDef *setCallContextForVar(const QCString &name)
 {
   if (name.isEmpty()) return 0;
-  //fprintf(stderr,"setCallContextForVar(%s) g_classScope=%s\n",name.data(),g_classScope.data());
+  DBG_CTX((stderr,"setCallContextForVar(%s) g_classScope=%s\n",name.data(),g_classScope.data()));
 
   int scopeEnd = name.findRev("::");
   if (scopeEnd!=-1) // name with explicit scope
@@ -741,28 +744,28 @@ static MemberDef *setCallContextForVar(const QCString &name)
   ClassDef *mcd = g_theVarContext.findVariable(name);
   if (mcd) // local variable
   {
-    //fprintf(stderr,"local variable?\n");
+    DBG_CTX((stderr,"local variable?\n"));
     if (mcd!=VariableContext::dummyContext)
     {
-      //fprintf(stderr,"local var `%s' mcd=%s\n",name.data(),mcd->name().data());
+      DBG_CTX((stderr,"local var `%s' mcd=%s\n",name.data(),mcd->name().data()));
       g_theCallContext.setClass(mcd);
     }
   }
   else
   {
-    //fprintf(stderr,"class member? scope=%s\n",g_classScope.data());
+    DBG_CTX((stderr,"class member? scope=%s\n",g_classScope.data()));
     // look for a class member 
     mcd = getClass(g_classScope);
     if (mcd)
     {
-      //fprintf(stderr,"Inside class %s\n",mcd->name().data());
+      DBG_CTX((stderr,"Inside class %s\n",mcd->name().data()));
       MemberDef *md=mcd->getMemberByName(name);
       if (md) 
       {
-        //fprintf(stderr,"Found member %s\n",md->name().data());
+        DBG_CTX((stderr,"Found member %s\n",md->name().data()));
        if (g_scopeStack.top()!=CLASSBLOCK)
        {
-          //fprintf(stderr,"class member `%s' mcd=%s\n",name.data(),mcd->name().data());
+          DBG_CTX((stderr,"class member `%s' mcd=%s\n",name.data(),mcd->name().data()));
          g_theCallContext.setClass(stripClassName(md->typeString(),md->getOuterScope()));
        }
        return md;
@@ -828,50 +831,6 @@ static void updateCallContextForSmartPointer()
   }
 }
 
-static void addDocCrossReference(MemberDef *src,MemberDef *dst)
-{
-  static bool referencedByRelation = Config_getBool("REFERENCED_BY_RELATION");
-  static bool referencesRelation   = Config_getBool("REFERENCES_RELATION");
-  static bool callerGraph          = Config_getBool("CALLER_GRAPH");
-  static bool callGraph            = Config_getBool("CALL_GRAPH");
-
-  //printf("--> addDocCrossReference src=%s,dst=%s\n",src->name().data(),dst->name().data());
-  if (dst->isTypedef() || dst->isEnumerate()) return; // don't add types
-  if ((referencedByRelation || callerGraph || dst->hasCallerGraph()) && 
-      (src->isFunction() || src->isSlot()) 
-     )
-  {
-    dst->addSourceReferencedBy(src);
-    MemberDef *mdDef = dst->memberDefinition();
-    if (mdDef)
-    {
-      mdDef->addSourceReferencedBy(src);
-    }
-    MemberDef *mdDecl = dst->memberDeclaration();
-    if (mdDecl)
-    {
-      mdDecl->addSourceReferencedBy(src);
-    }
-  }
-  if ((referencesRelation || callGraph || src->hasCallGraph()) && 
-      (src->isFunction() || src->isSlot())
-     )
-  {
-    src->addSourceReferences(dst);
-    MemberDef *mdDef = src->memberDefinition();
-    if (mdDef)
-    {
-      mdDef->addSourceReferences(dst);
-    }
-    MemberDef *mdDecl = src->memberDeclaration();
-    if (mdDecl)
-    {
-      mdDecl->addSourceReferences(dst);
-    }
-  }
-
-}
-
 static bool getLinkInScope(const QCString &c,  // scope
                            const QCString &m,  // member
                           const char *memberText, // exact text
@@ -885,7 +844,7 @@ static bool getLinkInScope(const QCString &c,  // scope
   FileDef      *fd;
   NamespaceDef *nd;
   GroupDef     *gd;
-  //fprintf(stderr,"getLinkInScope: trying `%s'::`%s' varOnly=%d\n",c.data(),m.data(),varOnly);
+  DBG_CTX((stderr,"getLinkInScope: trying `%s'::`%s' varOnly=%d\n",c.data(),m.data(),varOnly));
   if (getDefs(c,m,"()",md,cd,fd,nd,gd,FALSE,g_sourceFileDef,FALSE,g_forceTagReference) && 
       md->isLinkable() && (!varOnly || md->isVariable()))
   {
@@ -919,8 +878,6 @@ static bool getLinkInScope(const QCString &c,  // scope
       }
       //printf("d->getReference()=`%s' d->getOutputBase()=`%s' name=`%s' member name=`%s'\n",d->getReference().data(),d->getOutputFileBase().data(),d->name().data(),md->name().data());
      
-      ol.linkableSymbol(g_yyLineNr,md->name(),md,
-                       g_currentMemberDef ? g_currentMemberDef : g_currentDefinition);
       writeMultiLineCodeLink(ol,md->getReference(),
                                md->getOutputFileBase(),
                                md->anchor(),
@@ -981,20 +938,20 @@ static void generateClassOrGlobalLink(CodeOutputInterface &ol,const char *clName
     Definition *d = g_currentDefinition;
     //printf("d=%s g_sourceFileDef=%s\n",d?d->name().data():"<none>",g_sourceFileDef?g_sourceFileDef->name().data():"<none>");
     cd = getResolvedClass(d,g_sourceFileDef,className,&md);
-    //fprintf(stderr,"non-local variable name=%s context=%d cd=%s md=%s!\n",
-    // className.data(),g_theVarContext.count(),cd?cd->name().data():"<none>",
-    //    md?md->name().data():"<none>");
+    DBG_CTX((stderr,"non-local variable name=%s context=%d cd=%s md=%s!\n",
+    className.data(),g_theVarContext.count(),cd?cd->name().data():"<none>",
+        md?md->name().data():"<none>"));
     if (cd==0 && md==0 && (i=className.find('<'))!=-1)
     {
       QCString bareName = className.left(i); //stripTemplateSpecifiersFromScope(className);
-      //fprintf(stderr,"bareName=%s\n",bareName.data());
+      DBG_CTX((stderr,"bareName=%s\n",bareName.data()));
       if (bareName!=className)
       {
        cd=getResolvedClass(d,g_sourceFileDef,bareName,&md); // try unspecialized version
       }
     }
     //printf("md=%s\n",md?md->name().data():"<none>");
-    //fprintf(stderr,"is found as a type %s\n",cd?cd->name().data():"<null>");
+    DBG_CTX((stderr,"is found as a type %s\n",cd?cd->name().data():"<null>"));
     if (cd==0 && md==0) // also see if it is variable or enum or enum value
     {
       if (getLink(g_classScope,clName,ol,clName,varOnly))
@@ -1020,11 +977,11 @@ static void generateClassOrGlobalLink(CodeOutputInterface &ol,const char *clName
       //}
     }
     isLocal=TRUE;
-    //fprintf(stderr,"is a local variable cd=%p!\n",cd);
+    DBG_CTX((stderr,"is a local variable cd=%p!\n",cd));
   }
   if (cd && cd->isLinkable()) // is it a linkable class
   {
-    //fprintf(stderr,"is linkable class %s\n",clName);
+    DBG_CTX((stderr,"is linkable class %s\n",clName));
     if (g_exampleBlock)
     {
       QCString anchor;
@@ -1037,8 +994,6 @@ static void generateClassOrGlobalLink(CodeOutputInterface &ol,const char *clName
        g_anchorCount++;
       }
     }
-    ol.linkableSymbol(g_yyLineNr,cd->name(),cd,
-                      g_currentMemberDef ? g_currentMemberDef : g_currentDefinition);
     writeMultiLineCodeLink(ol,cd->getReference(),cd->getOutputFileBase(),cd->anchor(),clName,cd->briefDescriptionAsTooltip());
     addToSearchIndex(className);
     g_theCallContext.setClass(cd);
@@ -1055,7 +1010,7 @@ static void generateClassOrGlobalLink(CodeOutputInterface &ol,const char *clName
   }
   else // not a class, maybe a global member
   {
-    //fprintf(stderr,"class %s not linkable! cd=%p md=%p typeOnly=%d\n",clName,cd,md,typeOnly);
+    DBG_CTX((stderr,"class %s not linkable! cd=%p md=%p typeOnly=%d\n",clName,cd,md,typeOnly));
     if (!isLocal && (md!=0 || (cd==0 && !typeOnly))) // not a class, see if it is a global enum/variable/typedef.
     {
       if (md==0) // not found as a typedef
@@ -1064,10 +1019,10 @@ static void generateClassOrGlobalLink(CodeOutputInterface &ol,const char *clName
        //printf("setCallContextForVar(%s) md=%p g_currentDefinition=%p\n",clName,md,g_currentDefinition);
        if (md && g_currentDefinition)
        {
-         //fprintf(stderr,"%s accessible from %s? %d md->getOuterScope=%s\n",
-         //    md->name().data(),g_currentDefinition->name().data(),
-         //    isAccessibleFrom(g_currentDefinition,g_sourceFileDef,md),
-         //    md->getOuterScope()->name().data());
+         DBG_CTX((stderr,"%s accessible from %s? %d md->getOuterScope=%s\n",
+             md->name().data(),g_currentDefinition->name().data(),
+             isAccessibleFrom(g_currentDefinition,g_sourceFileDef,md),
+             md->getOuterScope()->name().data()));
        }
             
         if (md && g_currentDefinition && 
@@ -1078,7 +1033,7 @@ static void generateClassOrGlobalLink(CodeOutputInterface &ol,const char *clName
       }
       if (md && (!varOnly || md->isVariable()))
       {
-        //fprintf(stderr,"is a global md=%p g_currentDefinition=%s linkable=%d\n",md,g_currentDefinition?g_currentDefinition->name().data():"<none>",md->isLinkable());
+        DBG_CTX((stderr,"is a global md=%p g_currentDefinition=%s linkable=%d\n",md,g_currentDefinition?g_currentDefinition->name().data():"<none>",md->isLinkable()));
        if (md->isLinkable())
        {
          QCString text;
@@ -1098,8 +1053,6 @@ static void generateClassOrGlobalLink(CodeOutputInterface &ol,const char *clName
          {
            text=clName;
          }
-          ol.linkableSymbol(g_yyLineNr,md->name(),md,
-                           g_currentMemberDef ? g_currentMemberDef : g_currentDefinition);
          writeMultiLineCodeLink(ol,md->getReference(),md->getOutputFileBase(),md->anchor(),text,md->briefDescriptionAsTooltip());
           addToSearchIndex(clName);
          if (g_currentMemberDef)
@@ -1112,9 +1065,7 @@ static void generateClassOrGlobalLink(CodeOutputInterface &ol,const char *clName
     }
     
     // nothing found, just write out the word
-    //fprintf(stderr,"not found!\n");
-    ol.linkableSymbol(g_yyLineNr,clName,0,
-                     g_currentMemberDef?g_currentMemberDef:g_currentDefinition);
+    DBG_CTX((stderr,"not found!\n"));
     codifyLines(clName);
     addToSearchIndex(clName);
   }
@@ -1143,7 +1094,7 @@ static bool generateClassMemberLink(CodeOutputInterface &ol,MemberDef *xmd,const
   }
 
   ClassDef *typeClass = stripClassName(removeAnonymousScopes(xmd->typeString()),xmd->getOuterScope());
-  //fprintf(stderr,"%s -> typeName=%p\n",xmd->typeString(),typeClass);
+  DBG_CTX((stderr,"%s -> typeName=%p\n",xmd->typeString(),typeClass));
   g_theCallContext.setClass(typeClass);
 
   Definition *xd = xmd->getOuterScope()==Doxygen::globalScope ?
@@ -1166,8 +1117,6 @@ static bool generateClassMemberLink(CodeOutputInterface &ol,MemberDef *xmd,const
       }
 
       // write the actual link
-      ol.linkableSymbol(g_yyLineNr,xmd->name(),xmd,
-         g_currentMemberDef ? g_currentMemberDef : g_currentDefinition);
       writeMultiLineCodeLink(ol,xmd->getReference(),
          xmd->getOutputFileBase(),xmd->anchor(),memName,xmd->briefDescriptionAsTooltip());
       addToSearchIndex(memName);
@@ -1287,8 +1236,6 @@ static void generateMemberLink(CodeOutputInterface &ol,const QCString &varName,
     }
   }
   // nothing found -> write result as is
-  ol.linkableSymbol(g_yyLineNr,memName,0,
-                   g_currentMemberDef?g_currentMemberDef:g_currentDefinition);
   codifyLines(memName);
   addToSearchIndex(memName);
   return;
@@ -1315,7 +1262,7 @@ static void generateFunctionLink(CodeOutputInterface &ol,const char *funcName)
   QCString funcWithScope=locFunc;
   QCString funcWithFullScope=locFunc;
   QCString fullScope=locScope;
-  //fprintf(stdout,"*** locScope=%s locFunc=%s\n",locScope.data(),locFunc.data());
+  DBG_CTX((stdout,"*** locScope=%s locFunc=%s\n",locScope.data(),locFunc.data()));
   int len=2;
   int i=locFunc.findRev("::");
   if (g_currentMemberDef && g_currentMemberDef->getClassDef() &&
@@ -1541,8 +1488,6 @@ static void writeObjCMethodCall(ObjCCallCtx *ctx)
          {
            if (ctx->method && ctx->method->isLinkable())
            {
-              g_code->linkableSymbol(g_yyLineNr,ctx->method->name(),ctx->method,
-                            g_currentMemberDef ? g_currentMemberDef : g_currentDefinition);
               writeMultiLineCodeLink(*g_code,
                                     ctx->method->getReference(),
                                     ctx->method->getOutputFileBase(),
@@ -1556,8 +1501,6 @@ static void writeObjCMethodCall(ObjCCallCtx *ctx)
            }
            else
            {
-              g_code->linkableSymbol(g_yyLineNr,pName->data(),0,
-                            g_currentMemberDef ? g_currentMemberDef : g_currentDefinition);
              codifyLines(pName->data());
            }
          }
@@ -1629,8 +1572,6 @@ static void writeObjCMethodCall(ObjCCallCtx *ctx)
            }
            else if (ctx->objectVar && ctx->objectVar->isLinkable()) // object is class variable
            {
-              g_code->linkableSymbol(g_yyLineNr,ctx->objectVar->name(),ctx->objectVar,
-                            g_currentMemberDef ? g_currentMemberDef : g_currentDefinition);
              writeMultiLineCodeLink(*g_code,
                    ctx->objectVar->getReference(),
                    ctx->objectVar->getOutputFileBase(),
@@ -1648,8 +1589,6 @@ static void writeObjCMethodCall(ObjCCallCtx *ctx)
                    ) // object is class name
            {
              ClassDef *cd = ctx->objectType;
-              g_code->linkableSymbol(g_yyLineNr,cd->name(),cd,
-                            g_currentMemberDef ? g_currentMemberDef : g_currentDefinition);
              writeMultiLineCodeLink(*g_code,
                    cd->getReference(),
                    cd->getOutputFileBase(),
@@ -1664,8 +1603,6 @@ static void writeObjCMethodCall(ObjCCallCtx *ctx)
              if (cd && cd->isLinkable())
              {
                if (ctx->objectType==0) ctx->objectType=cd;
-                g_code->linkableSymbol(g_yyLineNr,cd->name(),cd,
-                            g_currentMemberDef ? g_currentMemberDef : g_currentDefinition);
                writeMultiLineCodeLink(*g_code,
                    cd->getReference(),
                    cd->getOutputFileBase(),
@@ -1675,8 +1612,6 @@ static void writeObjCMethodCall(ObjCCallCtx *ctx)
              }
              else
              {
-                g_code->linkableSymbol(g_yyLineNr,pObject->data(),0,
-                            g_currentMemberDef ? g_currentMemberDef : g_currentDefinition);
                codifyLines(pObject->data());
              }
            }
@@ -1739,8 +1674,6 @@ static void writeObjCMethodCall(ObjCCallCtx *ctx)
          QCString *pWord = g_wordDict.find(refId);
          if (pWord)
          {
-            g_code->linkableSymbol(g_yyLineNr,pWord->data(),0,
-                         g_currentMemberDef ? g_currentMemberDef : g_currentDefinition);
             codifyLines(pWord->data());
          }
        }
@@ -1820,7 +1753,7 @@ TEMPLIST "<"[^\"\}\{\(\)\/\n\>]*">"
 SCOPETNAME (((({ID}{TEMPLIST}?){BN}*)?{SEP}{BN}*)*)((~{BN}*)?{ID})
 SCOPEPREFIX ({ID}{TEMPLIST}?{BN}*{SEP}{BN}*)+
 KEYWORD_OBJC ("@public"|"@private"|"@protected"|"@class"|"@implementation"|"@interface"|"@end"|"@selector"|"@protocol"|"@optional"|"@required"|"@throw"|"@synthesize"|"@property")
-KEYWORD ("asm"|"__assume"|"auto"|"class"|"const"|"delete"|"enum"|"explicit"|"extern"|"false"|"friend"|"gcnew"|"gcroot"|"get"|"inline"|"internal"|"mutable"|"namespace"|"new"|"nullptr"|"override"|"operator"|"pin_ptr"|"private"|"protected"|"public"|"raise"|"register"|"remove"|"self"|"set"|"sizeof"|"static"|"struct"|"__super"|"function"|"template"|"generic"|"this"|"true"|"typedef"|"typeid"|"typename"|"union"|"using"|"virtual"|"volatile"|"abstract"|"final"|"import"|"synchronized"|"transient"|{KEYWORD_OBJC})
+KEYWORD ("asm"|"__assume"|"auto"|"class"|"const"|"delete"|"enum"|"explicit"|"extern"|"false"|"friend"|"gcnew"|"gcroot"|"get"|"inline"|"internal"|"mutable"|"namespace"|"new"|"nullptr"|"override"|"operator"|"pin_ptr"|"private"|"protected"|"public"|"raise"|"register"|"remove"|"self"|"sizeof"|"static"|"struct"|"__super"|"function"|"template"|"generic"|"this"|"true"|"typedef"|"typeid"|"typename"|"union"|"using"|"virtual"|"volatile"|"abstract"|"final"|"import"|"synchronized"|"transient"|"alignas"|"alignof"|{KEYWORD_OBJC})
 FLOWKW  ("break"|"case"|"catch"|"continue"|"default"|"do"|"else"|"finally"|"for"|"foreach"|"for each"|"goto"|"if"|"return"|"switch"|"throw"|"throws"|"try"|"while"|"@try"|"@catch"|"@finally")
 TYPEKW  ("bool"|"char"|"double"|"float"|"int"|"long"|"object"|"short"|"signed"|"unsigned"|"void"|"wchar_t"|"size_t"|"boolean"|"id"|"SEL"|"string"|"nullptr")
 CASTKW ("const_cast"|"dynamic_cast"|"reinterpret_cast"|"static_cast")
@@ -1849,6 +1782,8 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
 %x      MemberCall2
 %x      SkipInits
 %x      ClassName
+%x      AlignAs
+%x      AlignAsEnd
 %x      PackageName
 %x      ClassVar
 %x     CppCliTypeModifierFollowup
@@ -1975,8 +1910,6 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                          BEGIN(ObjCParams);
                                        }
 <ObjCParams>{ID}                       {
-                                          g_code->linkableSymbol(g_yyLineNr,yytext,0,
-                                            g_currentMemberDef?g_currentMemberDef:g_currentDefinition);
                                          g_code->codify(yytext);
                                          g_parmName=yytext;
                                          g_theVarContext.addVariable(g_parmType,g_parmName);
@@ -2099,7 +2032,7 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
 
                                          g_code->codify(yytext);
 
-                                         //fprintf(stderr,"g_bodyCurlyCount=%d\n",g_bodyCurlyCount);
+                                         DBG_CTX((stderr,"g_bodyCurlyCount=%d\n",g_bodyCurlyCount));
                                          if (--g_bodyCurlyCount<=0)
                                          {
                                            g_insideBody=FALSE;
@@ -2163,9 +2096,42 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
 <ClassName>{ID}("::"{ID})*             {
                                           g_curClassName=yytext;
                                          addType();
-                                         generateClassOrGlobalLink(*g_code,yytext);
-                                         BEGIN( ClassVar );
+                                          if (g_curClassName=="alignas")
+                                          {
+                                           startFontClass("keyword");
+                                           g_code->codify(yytext);
+                                            endFontClass();
+                                            BEGIN( AlignAs );
+                                          }
+                                          else
+                                          {
+                                           generateClassOrGlobalLink(*g_code,yytext);
+                                           BEGIN( ClassVar );
+                                          }
                                        }
+<AlignAs>"("                            { 
+                                          g_bracketCount=1;
+                                         g_code->codify(yytext);
+                                          BEGIN( AlignAsEnd );
+                                        }
+<AlignAs>\n                             { g_yyLineNr++; 
+                                          codifyLines(yytext);
+                                        }
+<AlignAs>.                              { g_code->codify(yytext); }
+<AlignAsEnd>"("                         { g_code->codify(yytext);
+                                          g_bracketCount++; 
+                                        }
+<AlignAsEnd>")"                         { 
+                                          g_code->codify(yytext);
+                                          if (--g_bracketCount<=0)
+                                          {
+                                            BEGIN(ClassName);
+                                          }
+                                        }
+<AlignAsEnd>\n                          { g_yyLineNr++; 
+                                          codifyLines(yytext); 
+                                        }
+<AlignAsEnd>.                           { g_code->codify(yytext); }
 <ClassName>{ID}("\\"{ID})*             { // PHP namespace
                                           g_curClassName=substitute(yytext,"\\","::");
                                          g_scopeStack.push(CLASSBLOCK);
@@ -2200,7 +2166,7 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                          BEGIN( Bases ); 
                                        }
 <ClassVar>("sealed"|"abstract")/{BN}*(":"|"{") {
-                                         //fprintf(stderr,"***** C++/CLI modifier %s on g_curClassName=%s\n",yytext,g_curClassName.data());
+                                         DBG_CTX((stderr,"***** C++/CLI modifier %s on g_curClassName=%s\n",yytext,g_curClassName.data()));
                                          startFontClass("keyword");
                                          codifyLines(yytext);
                                          endFontClass();
@@ -2241,11 +2207,11 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                             DBG_CTX((stderr,"** scope stack push CLASSBLOCK\n"));
                                            g_scopeStack.push(CLASSBLOCK);
                                            pushScope(g_curClassName);
-                                           //fprintf(stderr,"***** g_curClassName=%s\n",g_curClassName.data());
+                                           DBG_CTX((stderr,"***** g_curClassName=%s\n",g_curClassName.data()));
                                            if (getResolvedClass(g_currentDefinition,g_sourceFileDef,g_curClassName)==0)
                                            {
-                                             //fprintf(stderr,"Adding new class %s\n",g_curClassName.data());
-                                             ClassDef *ncd=new ClassDef("<code>",1,
+                                             DBG_CTX((stderr,"Adding new class %s\n",g_curClassName.data()));
+                                             ClassDef *ncd=new ClassDef("<code>",1,1,
                                                  g_curClassName,ClassDef::Class,0,0,FALSE);
                                              g_codeClassSDict->append(g_curClassName,ncd);
                                              // insert base classes.
@@ -2279,7 +2245,7 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                          endFontClass();
                                        }
 <Bases>{SEP}?({ID}{SEP})*{ID}           { 
-                                         //fprintf(stderr,"%s:addBase(%s)\n",g_curClassName.data(),yytext);
+                                         DBG_CTX((stderr,"%s:addBase(%s)\n",g_curClassName.data(),yytext));
                                          g_curClassBases.inSort(yytext); 
                                          generateClassOrGlobalLink(*g_code,yytext);
                                        }
@@ -2414,14 +2380,14 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                          codifyLines(yytext);
                                          endFontClass();
                                          g_name.resize(0);g_type.resize(0);
-                                         g_inForEachExpression = (strcmp(yytext,"for each")==0 || strcmp(yytext, "foreach")==0);
+                                         g_inForEachExpression = (qstrcmp(yytext,"for each")==0 || qstrcmp(yytext, "foreach")==0);
                                          BEGIN(FuncCall);
                                        }
 <Body>{FLOWKW}/([^a-z_A-Z0-9])                 {
                                          startFontClass("keywordflow");
                                          codifyLines(yytext);
                                          endFontClass();
-                                         if (g_inFunctionTryBlock && (strcmp(yytext,"catch")==0 || strcmp(yytext,"finally")==0))
+                                         if (g_inFunctionTryBlock && (qstrcmp(yytext,"catch")==0 || qstrcmp(yytext,"finally")==0))
                                          {
                                            g_inFunctionTryBlock=FALSE;
                                          }
@@ -2671,8 +2637,6 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                          {
                                            if (!generateClassMemberLink(*g_code,g_theCallContext.getClass(),yytext))
                                            {
-                                              g_code->linkableSymbol(g_yyLineNr,yytext,0,
-                                                               g_currentMemberDef?g_currentMemberDef:g_currentDefinition);
                                              g_code->codify(yytext);
                                              addToSearchIndex(yytext);
                                            }
@@ -2680,8 +2644,6 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                          }
                                          else
                                          {
-                                            g_code->linkableSymbol(g_yyLineNr,yytext,0,
-                                                               g_currentMemberDef?g_currentMemberDef:g_currentDefinition);
                                            g_code->codify(yytext);
                                            addToSearchIndex(yytext);
                                            g_name.resize(0);
@@ -2700,11 +2662,9 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
 <MemberCall>{SCOPENAME}/{B}*           {
                                          if (g_theCallContext.getClass())
                                          {
-                                           //fprintf(stderr,"g_theCallContext.getClass()=%p\n",g_theCallContext.getClass());
+                                           DBG_CTX((stderr,"g_theCallContext.getClass()=%p\n",g_theCallContext.getClass()));
                                            if (!generateClassMemberLink(*g_code,g_theCallContext.getClass(),yytext))
                                            {
-                                              g_code->linkableSymbol(g_yyLineNr,yytext,0,
-                                                               g_currentMemberDef?g_currentMemberDef:g_currentDefinition);
                                              g_code->codify(yytext);
                                              addToSearchIndex(yytext);
                                            }
@@ -2712,7 +2672,7 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                          }
                                          else
                                          {
-                                           //fprintf(stderr,"no class context!\n");
+                                           DBG_CTX((stderr,"no class context!\n"));
                                            g_code->codify(yytext);
                                            addToSearchIndex(yytext);
                                            g_name.resize(0);
@@ -2773,7 +2733,7 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                        }
   /*
 <ObjCMemberCall>{ID}                   {
-                                         if (strcmp(yytext,"self")==0 || strcmp(yytext,"super")==0)
+                                         if (qstrcmp(yytext,"self")==0 || qstrcmp(yytext,"super")==0)
                                          {
                                            // TODO: get proper base class for "super"
                                            g_theCallContext.setClass(getClass(g_curClassName));
@@ -2944,10 +2904,10 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                          }
                                        }
 <MemberCall2,FuncCall>{OPERATOR}        { // operator
-                                         if (strcmp(yytext,"*") && 
-                                             strcmp(yytext,"&") &&
-                                             strcmp(yytext,"^") &&
-                                             strcmp(yytext,"%")) // typically a pointer or reference
+                                         if (qstrcmp(yytext,"*") && 
+                                             qstrcmp(yytext,"&") &&
+                                             qstrcmp(yytext,"^") &&
+                                             qstrcmp(yytext,"%")) // typically a pointer or reference
                                          {
                                            // not a * or &, or C++/CLI's ^ or %
                                            g_parmType.resize(0);g_parmName.resize(0);
@@ -2991,7 +2951,7 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                          if (*yytext==';') g_searchingForBody=FALSE; 
                                          if (!g_type.isEmpty())
                                          {
-                                           //fprintf(stderr,"add variable g_type=%s g_name=%s)\n",g_type.data(),g_name.data());
+                                           DBG_CTX((stderr,"add variable g_type=%s g_name=%s)\n",g_type.data(),g_name.data()));
                                            g_theVarContext.addVariable(g_type,g_name);
                                          }
                                          g_parmType.resize(0);g_parmName.resize(0);
@@ -3025,7 +2985,7 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                          //g_theCallContext.popScope();
                                          g_parmType.resize(0);g_parmName.resize(0);
                                          int index = g_name.findRev("::");
-                                         //fprintf(stderr,"g_name=%s\n",g_name.data());
+                                         DBG_CTX((stderr,"g_name=%s\n",g_name.data()));
                                          if (index!=-1) 
                                          {
                                            QCString scope = g_name.left(index);
@@ -3345,7 +3305,7 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                          if (Config_getBool("STRIP_CODE_COMMENTS"))
                                          {
                                            g_yyLineNr++;
-                                           nextCodeLine();
+                                           //nextCodeLine();
                                          }
                                          else
                                          {
@@ -3470,9 +3430,11 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                          g_theCallContext.popScope();
                                        }
 <*>\n                                  {
+                                         g_yyColNr++;
                                          codifyLines(yytext); 
                                        }
 <*>.                                   {
+                                         g_yyColNr++;
                                          g_code->codify(yytext);
                                        }
   /*
@@ -3632,6 +3594,7 @@ void parseCCode(CodeOutputInterface &od,const char *className,const QCString &s,
   if (g_needsTermination)
   {
     endFontClass();
+    DBG_CTX((stderr,"endCodeLine(%d)\n",g_yyLineNr));
     g_code->endCodeLine();
   }
   if (cleanupSourceDef)
index 5277524..1c1fcb9 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 9d99830..6e7fa30 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
 #define ADDCHAR(c)    g_outBuf->addChar(c)
 #define ADDARRAY(a,s) g_outBuf->addArray(a,s)
   
-enum GuardType
-{
-  Guard_Cond,
-  Guard_CondNot
-}; 
-
 struct CondCtx
 {
   CondCtx(int line,QCString id,bool b) 
@@ -85,9 +79,8 @@ static bool     g_lastEscaped;
 static int      g_lastBlockContext;
 static bool     g_pythonDocString;
 
-static GuardType        guardType;           // kind of guard for conditional section
-
 static SrcLangExt g_lang;
+static bool       isFixedForm; // For Fortran
 
 static void replaceCommentMarker(const char *s,int len)
 {
@@ -180,22 +173,13 @@ static inline void copyToOutput(const char *s,int len)
 
 static void startCondSection(const char *sectId)
 {
+  //printf("startCondSection: skip=%d stack=%d\n",g_skip,g_condStack.count());
   CondParser prs;
   bool expResult = prs.parse(g_fileName,g_lineNr,sectId);
   g_condStack.push(new CondCtx(g_lineNr,sectId,g_skip));
-  if (guardType == Guard_Cond) // found @cond
+  if (!expResult) // not enabled
   {
-    if (!expResult) // not enabled
-    {
-      g_skip=TRUE;
-    }
-  }
-  else if (guardType == Guard_CondNot) // found @notcond
-  {
-    if (expResult) // enabled
-    {
-      g_skip=TRUE;
-    }
+    g_skip=TRUE;
   }
 }
 
@@ -211,6 +195,7 @@ static void endCondSection()
     CondCtx *ctx = g_condStack.pop();
     g_skip=ctx->skip;
   }
+  //printf("endCondSection: skip=%d stack=%d\n",g_skip,g_condStack.count());
 }
 
 /** copies string \a s with length \a len to the output, while 
@@ -270,8 +255,8 @@ void replaceComment(int offset);
                                       BEGIN(CComment);
                                     }
                                    }
-<Scan>"!>"|"!<"|"!!"              {
-                                    if (g_lang!=SrcLangExt_Fortran)
+<Scan>![><!]/.*\n         {
+                                     if (g_lang!=SrcLangExt_Fortran)
                                     {
                                       REJECT;
                                     }
@@ -280,6 +265,52 @@ void replaceComment(int offset);
                                        copyToOutput(yytext,(int)yyleng); 
                                       BEGIN(CComment);
                                     }
+                                  }
+<Scan>[Cc\*][><!]/.*\n    {
+                                     if (g_lang!=SrcLangExt_Fortran)
+                                    {
+                                      REJECT;
+                                    }
+                                    else
+                                    {
+                                       /* check for fixed format; we might have some conditional as part of multilene if like C<5 .and. & */
+                                       if (isFixedForm && (g_col == 0))
+                                       {
+                                         copyToOutput(yytext,(int)yyleng); 
+                                        BEGIN(CComment);
+                                      }
+                                      else
+                                      {
+                                        REJECT;
+                                      }
+                                    }
+                                  }
+<Scan>!.*\n               {
+                                    if (g_lang!=SrcLangExt_Fortran)
+                                    {
+                                      REJECT;
+                                    }
+                                    else
+                                    {
+                                       copyToOutput(yytext,(int)yyleng); 
+                                    }
+                                   }
+<Scan>[Cc\*].*\n                  {
+                                    if (g_lang!=SrcLangExt_Fortran)
+                                    {
+                                      REJECT;
+                                    }
+                                    else
+                                    {
+                                       if (g_col == 0)
+                                       {
+                                         copyToOutput(yytext,(int)yyleng); 
+                                      }
+                                      else
+                                      {
+                                        REJECT;
+                                      }
+                                    }
                                    }
 <Scan>"\""                         { /* start of a string */ 
                                      copyToOutput(yytext,(int)yyleng); 
@@ -294,7 +325,8 @@ void replaceComment(int offset);
 <Scan>\n                           { /* new line */ 
                                      copyToOutput(yytext,(int)yyleng); 
                                    }
-<Scan>("//!"|"///")/.*\n[ \t]*"//"[\/!][^\/] { /* start C++ style special comment block */
+<Scan>"//!"/.*\n[ \t]*"//"[\/!][^\/] | /* start C++ style special comment block */
+<Scan>("///"[/]*)/[^/].*\n[ \t]*"//"[\/!][^\/] { /* start C++ style special comment block */
                                     if (g_mlBrief) 
                                     {
                                       REJECT; // bail out if we do not need to convert
@@ -357,7 +389,7 @@ void replaceComment(int offset);
                                       BEGIN(CComment);
                                     }
                                   }
-<Scan>"!>"|"!<"|"!!"              {
+<Scan>![><!]                      {
                                      if (g_lang!=SrcLangExt_Fortran)
                                     {
                                       REJECT;
@@ -396,16 +428,16 @@ void replaceComment(int offset);
                                     g_lastCommentContext = YY_START;
                                     BEGIN(Verbatim);
                                   }
-<CComment,ReadLine>[\\@]("verbatim"|"latexonly"|"htmlonly"|"xmlonly"|"rtfonly"|"manonly")/[^a-z_A-Z0-9] { /* start of a verbatim block */
+<CComment,ReadLine>[\\@]("verbatim"|"latexonly"|"htmlonly"|"xmlonly"|"docbookonly"|"rtfonly"|"manonly")/[^a-z_A-Z0-9] { /* start of a verbatim block */
                                      copyToOutput(yytext,(int)yyleng); 
                                     g_blockName=&yytext[1];
                                     g_lastCommentContext = YY_START;
                                      BEGIN(Verbatim);
                                    }
-<Scan>.                            { /* any other character */
+<Scan>.                            { /* any ather character */
                                      copyToOutput(yytext,(int)yyleng); 
                                    }
-<Verbatim>[\\@]("endverbatim"|"endlatexonly"|"endhtmlonly"|"endxmlonly"|"endrtfonly"|"endmanonly"|"f$"|"f]"|"f}") { /* end of verbatim block */
+<Verbatim>[\\@]("endverbatim"|"endlatexonly"|"endhtmlonly"|"endxmlonly"|"docbookonly"|"endrtfonly"|"endmanonly"|"f$"|"f]"|"f}") { /* end of verbatim block */
                                      copyToOutput(yytext,(int)yyleng);
                                     if (yytext[1]=='f') // end of formula
                                     {
@@ -549,6 +581,11 @@ void replaceComment(int offset);
                                   }
 <CComment>\n                       { /* new line in comment */
                                      copyToOutput(yytext,(int)yyleng); 
+                                     /* in case of Fortran always end of comment */
+                                    if (g_lang==SrcLangExt_Fortran)
+                                    {
+                                      BEGIN(Scan);
+                                    }
                                    }
 <CComment>"*"+"/"                  { /* end of C comment */
                                      if (g_lang==SrcLangExt_Python)
@@ -583,17 +620,6 @@ void replaceComment(int offset);
                                       BEGIN(Scan);
                                     }
                                   }
-<CComment>"\n"/[ \t]*[^!]         { /* end of Fortran comment */
-                                    if (g_lang!=SrcLangExt_Fortran)
-                                    {
-                                      REJECT;
-                                    }
-                                    else
-                                    {
-                                      copyToOutput(yytext,(int)yyleng);
-                                      BEGIN(Scan);
-                                    }
-                                  }
    /* removed for bug 674842 (bug was introduced in rev 768)
 <CComment>"'"                     {
                                     g_charContext = YY_START;
@@ -679,7 +705,6 @@ void replaceComment(int offset);
                                   }
 <CComment,ReadLine>[\\@]"cond"[ \t]+      { // conditional section
                                     g_condCtx = YY_START; 
-                                     guardType = Guard_Cond;
                                     BEGIN(CondLine);
                                   }
 <CComment,ReadLine>[\\@]"endcond"/[^a-z_A-Z0-9] { // end of conditional section
@@ -727,7 +752,6 @@ void replaceComment(int offset);
 <CondLine>[ \t]*
 <CComment,ReadLine>[\\@]"cond"[ \t\r]*/\n |
 <CondLine>.                       { // forgot section id?
-                                     guardType = Guard_Cond;
                                     if (YY_START!=CondLine) g_condCtx=YY_START;
                                     bool oldSkip=g_skip;
                                     startCondSection(" "); // fake section id causing the section to be hidden unconditionally
@@ -839,6 +863,45 @@ void replaceComment(int offset)
   }
 }
 
+// simplified way to know if this is fixed form
+// duplicate in fortrancode.l
+static bool recognizeFixedForm(const char* contents)
+{
+  int column=0;
+  bool skipLine=FALSE;
+
+  for(int i=0;;i++) {
+    column++;
+
+    switch(contents[i]) {
+      case '\n':
+        column=0;
+        skipLine=FALSE;
+        break;
+      case ' ':
+        break;
+      case '\000':
+        return FALSE;
+      case 'C':
+      case 'c':
+      case '*':
+        if(column==1) return TRUE;
+        if(skipLine) break;
+        return FALSE;
+      case '!':
+        if(column>1 && column<7) return FALSE;
+        skipLine=TRUE;
+        break;
+      default:
+        if(skipLine) break;
+        if(column==7) return TRUE;
+        return FALSE;
+    }
+  }
+  return FALSE;
+}
+
+
 /*! This function does three things:
  *  -# It converts multi-line C++ style comment blocks (that are aligned)
  *     to C style comment blocks (if MULTILINE_CPP_IS_BRIEF is set to NO).
@@ -860,6 +923,13 @@ void convertCppComments(BufStr *inBuf,BufStr *outBuf,const char *fileName)
   g_lineNr   = 1;
   g_condStack.clear();
   g_condStack.setAutoDelete(TRUE);
+
+  isFixedForm = FALSE;
+  if (g_lang==SrcLangExt_Fortran)
+  {
+    isFixedForm = recognizeFixedForm(inBuf->data());
+  }
+
   if (g_lang==SrcLangExt_Markdown)
   {
     BEGIN(CComment);
index 9f90663..e296b89 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 68f6b5f..45f5425 100644 (file)
@@ -1,6 +1,6 @@
 /*****************************************************************************
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -180,6 +180,7 @@ static DocCmdMap docCmdMap[] =
   { "latexonly",       &handleFormatBlock,      FALSE },
   { "htmlonly",        &handleFormatBlock,      FALSE },
   { "xmlonly",         &handleFormatBlock,      FALSE },
+  { "docbookonly",     &handleFormatBlock,      FALSE },
   { "rtfonly",         &handleFormatBlock,      FALSE },
   { "manonly",         &handleFormatBlock,      FALSE },
   { "dot",             &handleFormatBlock,      TRUE  },
@@ -219,6 +220,7 @@ static DocCmdMap docCmdMap[] =
   { "copydoc",         &handleCopyDoc,          TRUE  },
   { "copybrief",       0,                       FALSE },
   { "copydetails",     0,                       TRUE  },
+  { "copyright",       0,                       TRUE  },
   { "date",            0,                       TRUE  },
   { "dotfile",         0,                       TRUE  },
   { "htmlinclude",     0,                       FALSE },
@@ -293,7 +295,7 @@ class DocCmdMapper
       {
        if (m_map.find(p->cmdName)!=0)
        {
-         printf("Error: DocCmdMapper: command %s already added\n",p->cmdName);
+         err("DocCmdMapper: command %s already added\n",p->cmdName);
          exit(1);
        }
        Cmd *cmd = new Cmd;
@@ -314,6 +316,7 @@ class DocCmdMapper
 
 DocCmdMapper *DocCmdMapper::s_instance=0;
   
+bool inInternalDocs = FALSE;
   
 #define YY_NEVER_INTERACTIVE 1
 
@@ -526,7 +529,7 @@ static void addXRefItem(const char *listName,const char *itemTitle,
     QListIterator<ListItemInfo> slii(*docEntry->sli);
     for (slii.toFirst();(lii=slii.current());++slii)
     {
-      if (strcmp(lii->type,listName)==0) 
+      if (qstrcmp(lii->type,listName)==0) 
       {
         //printf("found %s lii->type=%s\n",listName,lii->type);
         break;
@@ -663,7 +666,7 @@ static void stripTrailingWhiteSpace(QCString &s)
   while (i>=0 && ((c = s.at(i))==' ' || c=='\t' || c=='\r')) i--;
   if (i!=(int)len-1) 
   {
-    s.resize(i+2); // string upto and including char at pos i and \0 terminator
+    s.resize(i+2); // string up to and including char at pos i and \0 terminator
   }
 }
 
@@ -867,15 +870,15 @@ ATTR      ({B}+[^>\n]*)?
 DOCNL     "\n"|"\\_linebr"
 LC        "\\"{B}*"\n"
 NW       [^a-z_A-Z0-9]
-FILESCHAR [a-z_A-Z0-9\x80-\xFF\\:\\\/\-\+]
-FILEECHAR [a-z_A-Z0-9\x80-\xFF\-\+]
+FILESCHAR [a-z_A-Z0-9\x80-\xFF\\:\\\/\-\+@&#]
+FILEECHAR [a-z_A-Z0-9\x80-\xFF\-\+@&#]
 FILE      ({FILESCHAR}*{FILEECHAR}+("."{FILESCHAR}*{FILEECHAR}+)*)|("\""[^\n\"]*"\"")
 ID        "$"?[a-z_A-Z\x80-\xFF][a-z_A-Z0-9\x80-\xFF]*
 LABELID   [a-z_A-Z\x80-\xFF][a-z_A-Z0-9\x80-\xFF\-]*
 CITEID    [a-z_A-Z\x80-\xFF][a-z_A-Z0-9\x80-\xFF\-:/]*
 SCOPEID   {ID}({ID}*{BN}*"::"{BN}*)*({ID}?)
 SCOPENAME "$"?(({ID}?{BN}*("::"|"."){BN}*)*)((~{BN}*)?{ID})
-MAILADR   [a-z_A-Z0-9.+\-]+"@"[a-z_A-Z0-9\-]+("."[a-z_A-Z0-9\-]+)+[a-z_A-Z0-9\-]+ 
+MAILADDR   [a-z_A-Z0-9.+\-]+"@"[a-z_A-Z0-9\-]+("."[a-z_A-Z0-9\-]+)+[a-z_A-Z0-9\-]+ 
 RCSTAG    "$"{ID}":"[^\n$]+"$"
 
 %option noyywrap
@@ -937,7 +940,7 @@ RCSTAG    "$"{ID}":"[^\n$]+"$"
    *   words and whitespace and other characters (#,?!, etc).
    *   grouping commands (e.g. @{ and @})
    *   language switch (e.g. \~english or \~).
-   *   mail adress (e.g. dimitri@stack.nl).
+   *   mail address (e.g. dimitri@stack.nl).
    *   quoted text, such as "foo@bar"
    *   XML commands, <summary></summary><remarks></remarks>
    */
@@ -948,7 +951,7 @@ RCSTAG    "$"{ID}":"[^\n$]+"$"
 <Comment>{CMD}{CMD}"~"[a-z_A-Z]*       { // escaped command
                                          addOutput(yytext);
                                        }
-<Comment>{MAILADR}                     { // mail adress
+<Comment>{MAILADDR}                    { // mail address
                                          addOutput(yytext);
                                        }
 <Comment>"\""[^"\n]*"\""               { // quoted text
@@ -1018,9 +1021,11 @@ RCSTAG    "$"{ID}":"[^\n$]+"$"
                                          BEGIN(HtmlComment);
                                        }
 <Comment>{B}*{CMD}"endinternal"{B}*    {
-                                         warn(yyFileName,yyLineNr,
-                                               "warning: found \\endinternal without matching \\internal"
+                                          if (!inInternalDocs)
+                                           warn(yyFileName,yyLineNr,
+                                               "found \\endinternal without matching \\internal"
                                               );
+                                          inInternalDocs = FALSE;
                                        }
 <Comment>{B}*{CMD}[a-z_A-Z]+{B}*       { // potentially interesting command
                                           // the {B}* in the front was added for bug620924
@@ -1074,7 +1079,7 @@ RCSTAG    "$"{ID}":"[^\n$]+"$"
 <Comment>{B}*{CMD}"~"[a-z_A-Z]*                { // language switch command
                                           QCString langId = QString(yytext).stripWhiteSpace().data()+2;
                                          if (!langId.isEmpty() &&
-                                             stricmp(Config_getEnum("OUTPUT_LANGUAGE"),langId)!=0)
+                                             qstricmp(Config_getEnum("OUTPUT_LANGUAGE"),langId)!=0)
                                          { // enable language specific section
                                            BEGIN(SkipLang);
                                          }
@@ -1160,6 +1165,9 @@ RCSTAG    "$"{ID}":"[^\n$]+"$"
 <Comment>"--"                           { // ndash
                                           addOutput(insidePre || Doxygen::markdownSupport ? yytext : "&ndash;");
                                         }
+<Comment>"-#"{B}+                       { // numbered item
+                                          addOutput(yytext);
+                                        }
 <Comment>("."+)[a-z_A-Z0-9\)]          { // . at start or in the middle of a word, or ellipsis
                                          addOutput(yytext);
                                        }
@@ -1181,11 +1189,23 @@ RCSTAG    "$"{ID}":"[^\n$]+"$"
                                          {
                                            // see bug 613024, we need to put the newlines after ending the XRef section.
                                            setOutput(OutputDoc);
-                                           addOutput("\n\n");
+                                            int i;
+                                            for (i=0;i<yyleng;)
+                                            {
+                                              if (yytext[i]=='\n') addOutput('\n'),i++;
+                                              else if (strcmp(yytext+i,"\\_linebr")==0) addOutput('\n'),i+=8;
+                                              else i++;
+                                            }
                                          }
                                          else if (inContext!=OutputBrief)
                                          {
-                                           addOutput("\n\n");
+                                            int i;
+                                            for (i=0;i<yyleng;)
+                                            {
+                                              if (yytext[i]=='\n') addOutput('\n'),i++;
+                                              else if (strcmp(yytext+i,"\\_linebr")==0) addOutput('\n'),i+=8;
+                                              else i++;
+                                            }
                                            setOutput(OutputDoc);
                                          }
                                          else // inContext==OutputBrief
@@ -1265,7 +1285,7 @@ RCSTAG    "$"{ID}":"[^\n$]+"$"
                                         }
 <EnumDocArg1>{DOCNL}                   { // missing argument
                                          warn(yyFileName,yyLineNr,
-                                               "warning: missing argument after \\enum."
+                                               "missing argument after \\enum."
                                               );
                                          addOutput('\n');
                                          if (*yytext=='\n') yyLineNr++;
@@ -1286,7 +1306,7 @@ RCSTAG    "$"{ID}":"[^\n$]+"$"
                                         }
 <NameSpaceDocArg1>{DOCNL}              { // missing argument
                                          warn(yyFileName,yyLineNr,
-                                               "warning: missing argument after "
+                                               "missing argument after "
                                               "\\namespace."
                                               );
                                          addOutput('\n');
@@ -1308,7 +1328,7 @@ RCSTAG    "$"{ID}":"[^\n$]+"$"
                                         }
 <PackageDocArg1>{DOCNL}                        { // missing argument
                                          warn(yyFileName,yyLineNr,
-                                               "warning: missing argument after "
+                                               "missing argument after "
                                               "\\package."
                                               );
                                          addOutput('\n');
@@ -1339,7 +1359,7 @@ RCSTAG    "$"{ID}":"[^\n$]+"$"
                                         }
 <ClassDocArg1,CategoryDocArg1>{DOCNL}  {
                                          warn(yyFileName,yyLineNr,
-                                               "warning: missing argument after "
+                                               "missing argument after "
                                               "\\%s.",YY_START==ClassDocArg1?"class":"category"
                                               );
                                          addOutput('\n');
@@ -1400,7 +1420,7 @@ RCSTAG    "$"{ID}":"[^\n$]+"$"
                                         }
 <GroupDocArg1>{DOCNL}                  { // missing argument!
                                          warn(yyFileName,yyLineNr,
-                                               "warning: missing group name after %s",
+                                               "missing group name after %s",
                                               current->groupDocCmd()
                                               );
                                          addOutput('\n');
@@ -1421,7 +1441,7 @@ RCSTAG    "$"{ID}":"[^\n$]+"$"
                                             ) // defgroup requires second argument
                                          {
                                            warn(yyFileName,yyLineNr,
-                                                 "warning: missing title after "
+                                                 "missing title after "
                                                 "\\defgroup %s", current->name.data()
                                                 );
                                          }
@@ -1441,7 +1461,7 @@ RCSTAG    "$"{ID}":"[^\n$]+"$"
                                         }
 <PageDocArg1>{DOCNL}                   {
                                          warn(yyFileName,yyLineNr,
-                                               "warning: missing argument after "
+                                               "missing argument after "
                                               "\\page."
                                               );
                                          if (*yytext=='\n') yyLineNr++;
@@ -1487,7 +1507,7 @@ RCSTAG    "$"{ID}":"[^\n$]+"$"
                                         }
 <XRefItemParam1>{DOCNL}                        { // missing arguments
                                          warn(yyFileName,yyLineNr,
-                                              "warning: Missing first argument of \\xrefitem"
+                                              "Missing first argument of \\xrefitem"
                                              );
                                          if (*yytext=='\n') yyLineNr++;
                                          addOutput('\n');
@@ -1507,7 +1527,7 @@ RCSTAG    "$"{ID}":"[^\n$]+"$"
                                        }
 <XRefItemParam2>{DOCNL}                        { // missing argument
                                          warn(yyFileName,yyLineNr,
-                                             "warning: Missing second argument of \\xrefitem"
+                                             "Missing second argument of \\xrefitem"
                                              );
                                          if (*yytext=='\n') yyLineNr++;
                                          addOutput('\n');
@@ -1528,7 +1548,7 @@ RCSTAG    "$"{ID}":"[^\n$]+"$"
                                        }
 <XRefItemParam3>{DOCNL}                        { // missing argument
                                          warn(yyFileName,yyLineNr,
-                                             "warning: Missing third argument of \\xrefitem"
+                                             "Missing third argument of \\xrefitem"
                                              );
                                          if (*yytext=='\n') yyLineNr++;
                                          addOutput('\n');
@@ -1555,7 +1575,7 @@ RCSTAG    "$"{ID}":"[^\n$]+"$"
                                        }
 <RelatesParam1>{DOCNL}                 { // missing argument
                                          warn(yyFileName,yyLineNr,
-                                             "warning: Missing argument of \\relates or \\memberof command"
+                                             "Missing argument of \\relates or \\memberof command"
                                              );
                                          if (*yytext=='\n') yyLineNr++;
                                          addOutput('\n');
@@ -1590,7 +1610,7 @@ RCSTAG    "$"{ID}":"[^\n$]+"$"
                                        }
 <SectionLabel>{DOCNL}                  { // missing argument
                                          warn(yyFileName,yyLineNr,
-                                             "warning: \\section command has no label"
+                                             "\\section command has no label"
                                              );
                                          if (*yytext=='\n') yyLineNr++;
                                          addOutput('\n');
@@ -1598,7 +1618,7 @@ RCSTAG    "$"{ID}":"[^\n$]+"$"
                                        }
 <SectionLabel>.                                { // invalid character for section label
                                          warn(yyFileName,yyLineNr,
-                                             "warning: Invalid or missing section label"
+                                             "Invalid or missing section label"
                                              );
                                          BEGIN(Comment);
                                        }
@@ -1644,7 +1664,7 @@ RCSTAG    "$"{ID}":"[^\n$]+"$"
                                        }
 <SubpageLabel>{DOCNL}                  { // missing argument
                                          warn(yyFileName,yyLineNr,
-                                             "warning: \\subpage command has no label"
+                                             "\\subpage command has no label"
                                              );
                                          if (*yytext=='\n') yyLineNr++;
                                          addOutput('\n');
@@ -1674,7 +1694,7 @@ RCSTAG    "$"{ID}":"[^\n$]+"$"
                                        }
 <AnchorLabel>{DOCNL}                   { // missing argument
                                          warn(yyFileName,yyLineNr,
-                                             "warning: \\anchor command has no label"
+                                             "\\anchor command has no label"
                                              );
                                          if (*yytext=='\n') yyLineNr++;
                                          addOutput('\n');
@@ -1682,7 +1702,7 @@ RCSTAG    "$"{ID}":"[^\n$]+"$"
                                        }
 <AnchorLabel>.                         { // invalid character for anchor label
                                          warn(yyFileName,yyLineNr,
-                                             "warning: Invalid or missing anchor label"
+                                             "Invalid or missing anchor label"
                                              );
                                          BEGIN(Comment);
                                        }
@@ -1690,7 +1710,7 @@ RCSTAG    "$"{ID}":"[^\n$]+"$"
 
   /* ----- handle arguments of the preformatted block commands ------- */
 
-<FormatBlock>{CMD}("endverbatim"|"endlatexonly"|"endhtmlonly"|"endxmlonly"|"endrtfonly"|"endmanonly"|"enddot"|"endcode"|"endmsc"|"endvhdlflow")/{NW} { // possible ends
+<FormatBlock>{CMD}("endverbatim"|"endlatexonly"|"endhtmlonly"|"endxmlonly"|"enddocbookonly"|"endrtfonly"|"endmanonly"|"enddot"|"endcode"|"endmsc"|"endvhdlflow")/{NW} { // possible ends
                                          addOutput(yytext);
                                          if (&yytext[4]==blockName) // found end of the block
                                          {
@@ -1714,7 +1734,7 @@ RCSTAG    "$"{ID}":"[^\n$]+"$"
                                          if (g_commentCount<0 && blockName!="verbatim")
                                          {
                                            warn(yyFileName,yyLineNr,
-                                                "warning: found */ without matching /* while inside a \\%s block! Perhaps a missing \\end%s?\n",blockName.data(),blockName.data());
+                                                "found */ without matching /* while inside a \\%s block! Perhaps a missing \\end%s?\n",blockName.data(),blockName.data());
                                          }
                                        }
 <FormatBlock>.                         {
@@ -1722,7 +1742,7 @@ RCSTAG    "$"{ID}":"[^\n$]+"$"
                                        }
 <FormatBlock><<EOF>>                   {
                                           warn(yyFileName,yyLineNr,
-                                           "warning: reached end of comment while inside a @%s block; check for missing @end%s tag!",
+                                           "reached end of comment while inside a @%s block; check for missing @end%s tag!",
                                            blockName.data(),blockName.data()
                                          );                            
                                          yyterminate();
@@ -1752,7 +1772,7 @@ RCSTAG    "$"{ID}":"[^\n$]+"$"
                                         }
 <GuardExpr>\n                           {
                                          warn(yyFileName,yyLineNr,
-                                               "warning: invalid expression '%s' for guard",g_guardExpr.data());
+                                               "invalid expression '%s' for guard",g_guardExpr.data());
                                           unput(*yytext);
                                           BEGIN(GuardParam);
                                         }
@@ -1803,7 +1823,7 @@ RCSTAG    "$"{ID}":"[^\n$]+"$"
                                          if (guards.isEmpty())
                                          {
                                            warn(yyFileName,yyLineNr,
-                                               "warning: found @endif without matching start command");
+                                               "found @endif without matching start command");
                                          }
                                          else
                                          {
@@ -1815,7 +1835,7 @@ RCSTAG    "$"{ID}":"[^\n$]+"$"
                                          if (guards.isEmpty())
                                          {
                                            warn(yyFileName,yyLineNr,
-                                               "warning: found @else without matching start command");
+                                               "found @else without matching start command");
                                          }
                                          else
                                          {
@@ -1832,7 +1852,7 @@ RCSTAG    "$"{ID}":"[^\n$]+"$"
                                          if (guards.isEmpty())
                                          {
                                            warn(yyFileName,yyLineNr,
-                                               "warning: found @elseif without matching start command");
+                                               "found @elseif without matching start command");
                                          }
                                          else
                                          {
@@ -1939,7 +1959,7 @@ RCSTAG    "$"{ID}":"[^\n$]+"$"
                                          if (!inGroupParamFound)
                                          {
                                            warn(yyFileName,yyLineNr,
-                                               "warning: Missing group name for \\ingroup command"
+                                               "Missing group name for \\ingroup command"
                                                );
                                          }
                                          if (*yytext=='\n') yyLineNr++;
@@ -2020,7 +2040,7 @@ RCSTAG    "$"{ID}":"[^\n$]+"$"
                                        }
 <InheritParam>{DOCNL}                  { // missing argument
                                          warn(yyFileName,yyLineNr,
-                                             "warning: \\inherit command has no argument"
+                                             "\\inherit command has no argument"
                                              );
                                          if (*yytext=='\n') yyLineNr++;
                                          addOutput('\n');
@@ -2028,7 +2048,7 @@ RCSTAG    "$"{ID}":"[^\n$]+"$"
                                        }
 <InheritParam>.                                { // invalid character for anchor label
                                          warn(yyFileName,yyLineNr,
-                                             "warning: Invalid or missing name for \\inherit command"
+                                             "Invalid or missing name for \\inherit command"
                                              );
                                          BEGIN(Comment);
                                        }
@@ -2043,7 +2063,7 @@ RCSTAG    "$"{ID}":"[^\n$]+"$"
                                        }
 <ExtendsParam>{DOCNL}                  { // missing argument
                                          warn(yyFileName,yyLineNr,
-                                             "warning: \\extends or \\implements command has no argument"
+                                             "\\extends or \\implements command has no argument"
                                              );
                                          if (*yytext=='\n') yyLineNr++;
                                          addOutput('\n');
@@ -2057,7 +2077,7 @@ RCSTAG    "$"{ID}":"[^\n$]+"$"
 <SkipLang>[\\@]"~"[a-zA-Z]*        { /* language switch */
                                      QCString langId = &yytext[2];
                                     if (langId.isEmpty() ||
-                                        stricmp(Config_getEnum("OUTPUT_LANGUAGE"),langId)==0)
+                                        qstricmp(Config_getEnum("OUTPUT_LANGUAGE"),langId)==0)
                                     { // enable language specific section
                                       BEGIN(Comment);
                                     }
@@ -2079,7 +2099,7 @@ RCSTAG    "$"{ID}":"[^\n$]+"$"
                                        }
 <CiteLabel>{DOCNL}                     { // missing argument
                                          warn(yyFileName,yyLineNr,
-                                             "warning: \\cite command has no label"
+                                             "\\cite command has no label"
                                              );
                                          if (*yytext=='\n') yyLineNr++;
                                          addOutput('\n');
@@ -2087,7 +2107,7 @@ RCSTAG    "$"{ID}":"[^\n$]+"$"
                                        }
 <CiteLabel>.                           { // invalid character for cite label
                                          warn(yyFileName,yyLineNr,
-                                             "warning: Invalid or missing cite label"
+                                             "Invalid or missing cite label"
                                              );
                                          BEGIN(Comment);
                                        }
@@ -2406,7 +2426,12 @@ static bool handleSubpage(const QCString &s)
      )
   {
     warn(yyFileName,yyLineNr,
-       "warning: found \\subpage command in a comment block that is not marked as a page!");
+       "found \\subpage command in a comment block that is not marked as a page!");
+  }
+  if (g_spaceBeforeCmd) 
+  {
+    addOutput(' ');
+    g_spaceBeforeCmd=FALSE;
   }
   addOutput("@"+s+" ");
   BEGIN(SubpageLabel);
@@ -2467,7 +2492,7 @@ static bool handleElseIf(const QCString &)
   if (guards.isEmpty())
   {
     warn(yyFileName,yyLineNr,
-       "warning: found \\else without matching start command");
+       "found \\else without matching start command");
   }
   else
   {
@@ -2482,7 +2507,7 @@ static bool handleElse(const QCString &)
   if (guards.isEmpty())
   {
     warn(yyFileName,yyLineNr,
-       "warning: found \\else without matching start command");
+       "found \\else without matching start command");
   }
   else
   {
@@ -2496,13 +2521,18 @@ static bool handleEndIf(const QCString &)
   if (guards.isEmpty())
   {
     warn(yyFileName,yyLineNr,
-       "warning: found \\endif without matching start command");
+       "found \\endif without matching start command");
   }
   else
   {
     delete guards.pop();
   }
   enabledSectionFound=FALSE;
+  if (g_spaceBeforeCmd) 
+  {
+    addOutput(' ');
+    g_spaceBeforeCmd=FALSE;
+  }
   BEGIN( GuardParamEnd );
   return FALSE;
 }
@@ -2561,6 +2591,7 @@ static bool handleInternal(const QCString &)
   {
     // re-enabled for bug640828
     addOutput("\\internal "); 
+    inInternalDocs = TRUE;
   }
   return FALSE;
 }
@@ -2658,7 +2689,7 @@ static void checkFormula()
 {
   if (YY_START==ReadFormulaShort || YY_START==ReadFormulaLong)
   {
-    warn(yyFileName,yyLineNr,"warning: End of comment block while inside formula.");
+    warn(yyFileName,yyLineNr,"End of comment block while inside formula.");
   }
 }
 
@@ -2794,14 +2825,14 @@ void groupLeaveFile(const char *fileName,int line)
 {
   //if (g_memberGroupId!=DOX_NOGROUP)
   //{
-  //  warn(fileName,line,"warning: end of file while inside a member group\n");
+  //  warn(fileName,line,"end of file while inside a member group\n");
   //}
   g_memberGroupId=DOX_NOGROUP;
   g_memberGroupRelates.resize(0);
   g_memberGroupDocs.resize(0);
   if (!g_autoGroupStack.isEmpty())
   {
-    warn(fileName,line,"warning: end of file while inside a group\n");
+    warn(fileName,line,"end of file while inside a group\n");
   }
 }
 
@@ -2809,7 +2840,7 @@ void groupEnterCompound(const char *fileName,int line,const char *name)
 {
   if (g_memberGroupId!=DOX_NOGROUP)
   {
-    warn(fileName,line,"warning: try to put compound %s inside a member group\n",name);
+    warn(fileName,line,"try to put compound %s inside a member group\n",name);
   }
   g_memberGroupId=DOX_NOGROUP;
   g_memberGroupRelates.resize(0);
@@ -2832,7 +2863,7 @@ void groupLeaveCompound(const char *,int,const char * /*name*/)
   //printf("groupLeaveCompound(%s)\n",name);
   //if (g_memberGroupId!=DOX_NOGROUP)
   //{
-  //  warn(fileName,line,"warning: end of compound %s while inside a member group\n",name);
+  //  warn(fileName,line,"end of compound %s while inside a member group\n",name);
   //}
   g_memberGroupId=DOX_NOGROUP;
   g_memberGroupRelates.resize(0);
@@ -2849,7 +2880,7 @@ static int findExistingGroup(int &groupId,const MemberGroupInfo *info)
   {
     if (g_compoundName==mi->compoundName &&  // same file or scope
        !mi->header.isEmpty() &&             // not a nameless group
-       stricmp(mi->header,info->header)==0  // same header name
+       qstricmp(mi->header,info->header)==0  // same header name
        )
     {
       //printf("Found it!\n");
index d8e2589..d623c5f 100644 (file)
     <xsd:attribute name="required" type="DoxBool" use="optional"/>
     <!-- Objective-C 2.0 property accessor -->
     <xsd:attribute name="accessor" type="DoxAccessor" use="optional"/>
+    <!-- UNO IDL -->
+    <xsd:attribute name="attribute" type="DoxBool" use="optional"/>
+    <xsd:attribute name="property" type="DoxBool" use="optional"/>
+    <xsd:attribute name="readonly" type="DoxBool" use="optional"/>
+    <xsd:attribute name="bound" type="DoxBool" use="optional"/>
+    <xsd:attribute name="removable" type="DoxBool" use="optional"/>
+    <xsd:attribute name="contrained" type="DoxBool" use="optional"/>
+    <xsd:attribute name="transient" type="DoxBool" use="optional"/>
+    <xsd:attribute name="maybevoid" type="DoxBool" use="optional"/>
+    <xsd:attribute name="maybedefault" type="DoxBool" use="optional"/>
+    <xsd:attribute name="maybeambiguous" type="DoxBool" use="optional"/>
+
   </xsd:complexType>
 
   <xsd:complexType name="descriptionType" mixed="true">
   <xsd:complexType name="locationType">
     <xsd:attribute name="file" type="xsd:string" />
     <xsd:attribute name="line" type="xsd:integer" />
+    <xsd:attribute name="column" type="xsd:integer" use="optional"/>
     <xsd:attribute name="bodyfile" type="xsd:string" />
     <xsd:attribute name="bodystart" type="xsd:integer" />
     <xsd:attribute name="bodyend" type="xsd:integer" />
       <xsd:enumeration value="friend" />
       <xsd:enumeration value="dcop" />
       <xsd:enumeration value="slot" />
+      <xsd:enumeration value="interface" />
+      <xsd:enumeration value="service" />
     </xsd:restriction>
   </xsd:simpleType>
 
       <xsd:enumeration value="protocol" />
       <xsd:enumeration value="category" />
       <xsd:enumeration value="exception" />
+      <xsd:enumeration value="service" />
+      <xsd:enumeration value="singleton" />
+      <xsd:enumeration value="module" />
+      <xsd:enumeration value="type" />
       <xsd:enumeration value="file" />
       <xsd:enumeration value="namespace" />
       <xsd:enumeration value="group" />
index 7d0a9d4..8ec3633 100644 (file)
 "    <xsd:attribute name=\"required\" type=\"DoxBool\" use=\"optional\"/>\n"
 "    <!-- Objective-C 2.0 property accessor -->\n"
 "    <xsd:attribute name=\"accessor\" type=\"DoxAccessor\" use=\"optional\"/>\n"
+"    <!-- UNO IDL -->\n"
+"    <xsd:attribute name=\"attribute\" type=\"DoxBool\" use=\"optional\"/>\n"
+"    <xsd:attribute name=\"property\" type=\"DoxBool\" use=\"optional\"/>\n"
+"    <xsd:attribute name=\"readonly\" type=\"DoxBool\" use=\"optional\"/>\n"
+"    <xsd:attribute name=\"bound\" type=\"DoxBool\" use=\"optional\"/>\n"
+"    <xsd:attribute name=\"removable\" type=\"DoxBool\" use=\"optional\"/>\n"
+"    <xsd:attribute name=\"contrained\" type=\"DoxBool\" use=\"optional\"/>\n"
+"    <xsd:attribute name=\"transient\" type=\"DoxBool\" use=\"optional\"/>\n"
+"    <xsd:attribute name=\"maybevoid\" type=\"DoxBool\" use=\"optional\"/>\n"
+"    <xsd:attribute name=\"maybedefault\" type=\"DoxBool\" use=\"optional\"/>\n"
+"    <xsd:attribute name=\"maybeambiguous\" type=\"DoxBool\" use=\"optional\"/>\n"
+"\n"
 "  </xsd:complexType>\n"
 "\n"
 "  <xsd:complexType name=\"descriptionType\" mixed=\"true\">\n"
 "  <xsd:complexType name=\"locationType\">\n"
 "    <xsd:attribute name=\"file\" type=\"xsd:string\" />\n"
 "    <xsd:attribute name=\"line\" type=\"xsd:integer\" />\n"
+"    <xsd:attribute name=\"column\" type=\"xsd:integer\" use=\"optional\"/>\n"
 "    <xsd:attribute name=\"bodyfile\" type=\"xsd:string\" />\n"
 "    <xsd:attribute name=\"bodystart\" type=\"xsd:integer\" />\n"
 "    <xsd:attribute name=\"bodyend\" type=\"xsd:integer\" />\n"
 "      <xsd:enumeration value=\"friend\" />\n"
 "      <xsd:enumeration value=\"dcop\" />\n"
 "      <xsd:enumeration value=\"slot\" />\n"
+"      <xsd:enumeration value=\"interface\" />\n"
+"      <xsd:enumeration value=\"service\" />\n"
 "    </xsd:restriction>\n"
 "  </xsd:simpleType>\n"
 "\n"
 "      <xsd:enumeration value=\"protocol\" />\n"
 "      <xsd:enumeration value=\"category\" />\n"
 "      <xsd:enumeration value=\"exception\" />\n"
+"      <xsd:enumeration value=\"service\" />\n"
+"      <xsd:enumeration value=\"singleton\" />\n"
+"      <xsd:enumeration value=\"module\" />\n"
+"      <xsd:enumeration value=\"type\" />\n"
 "      <xsd:enumeration value=\"file\" />\n"
 "      <xsd:enumeration value=\"namespace\" />\n"
 "      <xsd:enumeration value=\"group\" />\n"
index 2cadc1e..c99a232 100644 (file)
@@ -1,5 +1,5 @@
 /**
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -75,7 +75,7 @@ bool CondParser::parse(const char *fileName,int lineNr,const char *expr)
   }
   if (m_err)
   {
-    warn(fileName,lineNr,"Warning: problem evaluating expression '%s': %s",
+    warn(fileName,lineNr,"problem evaluating expression '%s': %s",
         expr,m_err.data());
   }
   //printf("expr='%s' answer=%d\n",expr,answer);
index 74a05cf..a4dfee8 100644 (file)
@@ -2,7 +2,7 @@
 #define CONDPARSER_H
 
 /**
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 5ed8bc4..7d37516 100644 (file)
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -42,7 +42,8 @@ class ConfigOption
       O_String,    //<! A single item
       O_Int,       //<! An integer value
       O_Bool,      //<! A boolean value
-      O_Obsolete   //<! An obsolete option
+      O_Obsolete,  //<! An obsolete option
+      O_Disabled   //<! Disabled compile time option
     };
     enum 
     { 
@@ -67,6 +68,7 @@ class ConfigOption
     QCString dependsOn() const { return m_dependency; }
     void addDependency(const char *dep) { m_dependency = dep; }
     void setEncoding(const QCString &e) { m_encoding = e; }
+    void setUserComment(const QCString &u) { m_userComment = u; }
 
   protected:
     virtual void writeTemplate(FTextStream &t,bool sl,bool upd) = 0;
@@ -75,7 +77,7 @@ class ConfigOption
     virtual void writeXML(FTextStream&) {}
     virtual void init() {}
 
-    QCString convertToComment(const QCString &s);
+    QCString convertToComment(const QCString &s, const QCString &u);
     void writeBoolValue(FTextStream &t,bool v);
     void writeIntValue(FTextStream &t,int i);
     void writeStringValue(FTextStream &t,QCString &s);
@@ -86,6 +88,7 @@ class ConfigOption
     QCString m_doc;
     QCString m_dependency;
     QCString m_encoding;
+    QCString m_userComment;
     OptionType m_kind;
 };
 
@@ -135,9 +138,13 @@ class ConfigList : public ConfigOption
       if (!sl)
       {
         t << endl;
-        t << convertToComment(m_doc);
+        t << convertToComment(m_doc, m_userComment);
         t << endl;
       }
+      else if (!m_userComment.isEmpty())
+      {
+        t << convertToComment("", m_userComment);
+      }
       t << m_name << m_spaces.left(MAX_OPTION_LENGTH-m_name.length()) << "=";
       writeStringList(t,m_value);
       t << "\n";
@@ -175,9 +182,13 @@ class ConfigEnum : public ConfigOption
       if (!sl)
       {
         t << endl;
-        t << convertToComment(m_doc);
+        t << convertToComment(m_doc, m_userComment);
         t << endl;
       }
+      else if (!m_userComment.isEmpty())
+      {
+        t << convertToComment("", m_userComment);
+      }
       t << m_name << m_spaces.left(MAX_OPTION_LENGTH-m_name.length()) << "=";
       writeStringValue(t,m_value);
       t << "\n";
@@ -216,9 +227,13 @@ class ConfigString : public ConfigOption
       if (!sl)
       {
         t << endl;
-        t << convertToComment(m_doc);
+        t << convertToComment(m_doc, m_userComment);
         t << endl;
       }
+      else if (!m_userComment.isEmpty())
+      {
+        t << convertToComment("", m_userComment);
+      }
       t << m_name << m_spaces.left(MAX_OPTION_LENGTH-m_name.length()) << "=";
       writeStringValue(t,m_value);
       t << "\n";
@@ -259,9 +274,13 @@ class ConfigInt : public ConfigOption
       if (!sl)
       {
         t << endl;
-        t << convertToComment(m_doc);
+        t << convertToComment(m_doc, m_userComment);
         t << endl;
       }
+      else if (!m_userComment.isEmpty())
+      {
+        t << convertToComment("", m_userComment);
+      }
       t << m_name << m_spaces.left(MAX_OPTION_LENGTH-m_name.length()) << "=";
       if (upd && !m_valueString.isEmpty())
       {
@@ -306,9 +325,13 @@ class ConfigBool : public ConfigOption
       if (!sl)
       {
         t << endl;
-        t << convertToComment(m_doc);
+        t << convertToComment(m_doc, m_userComment);
         t << endl;
       }
+      else if (!m_userComment.isEmpty())
+      {
+        t << convertToComment("", m_userComment);
+      }
       t << m_name << m_spaces.left(MAX_OPTION_LENGTH-m_name.length()) << "=";
       if (upd && !m_valueString.isEmpty())
       {
@@ -333,7 +356,19 @@ class ConfigBool : public ConfigOption
 class ConfigObsolete : public ConfigOption
 {
   public:
-    ConfigObsolete(const char *name,OptionType t) : ConfigOption(t)  
+    ConfigObsolete(const char *name) : ConfigOption(O_Obsolete)  
+    { m_name = name; }
+    void writeTemplate(FTextStream &,bool,bool) {}
+    void substEnvVars() {}
+    void writeXML(FTextStream&);
+};
+
+/** Section marker for compile time optional options
+ */
+class ConfigDisabled : public ConfigOption
+{
+  public:
+    ConfigDisabled(const char *name) : ConfigOption(O_Disabled)  
     { m_name = name; }
     void writeTemplate(FTextStream &,bool,bool) {}
     void substEnvVars() {}
@@ -515,11 +550,19 @@ class Config
     /*! Adds an option that has become obsolete. */
     ConfigOption *addObsolete(const char *name)
     {
-      ConfigObsolete *option = new ConfigObsolete(name,ConfigOption::O_Obsolete);
+      ConfigObsolete *option = new ConfigObsolete(name);
       m_dict->insert(name,option);
       m_obsolete->append(option);
       return option;
     }
+    /*! Adds an option that has been disabled at compile time. */
+    ConfigOption *addDisabled(const char *name)
+    {
+      ConfigDisabled *option = new ConfigDisabled(name);
+      m_dict->insert(name,option);
+      m_disabled->append(option);
+      return option;
+    }
     /*! @} */
 
     /*! Writes a template configuration to stream \a t. If \a shortIndex
@@ -570,12 +613,29 @@ class Config
      */
     void create();
 
+    /*! Append user comment
+     */
+    void appendUserComment(const QCString &u)
+    {
+      m_userComment += u;
+    }
+    /*! Take the user comment and reset it internally
+     *  \returns user comment
+     */
+    QCString takeUserComment()
+    {
+      QCString result=m_userComment;
+      m_userComment.resize(0);
+      return result;
+    }
+
   protected:
 
     Config()
     { 
       m_options  = new QList<ConfigOption>;
       m_obsolete = new QList<ConfigOption>;
+      m_disabled = new QList<ConfigOption>;
       m_dict     = new QDict<ConfigOption>(257);
       m_options->setAutoDelete(TRUE);
       m_obsolete->setAutoDelete(TRUE);
@@ -586,14 +646,17 @@ class Config
     {
       delete m_options;
       delete m_obsolete;
+      delete m_disabled;
       delete m_dict;
     }
 
   private:
     QList<ConfigOption> *m_options;
     QList<ConfigOption> *m_obsolete;
+    QList<ConfigOption> *m_disabled;
     QDict<ConfigOption> *m_dict;
     static Config *m_instance;
+    QCString m_userComment;
     bool m_initialized;
 };
 
index 0422411..58717ab 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -77,11 +77,11 @@ static QCString configStringRecode(
 
 /* -----------------------------------------------------------------
  */
-QCString ConfigOption::convertToComment(const QCString &s)
+QCString ConfigOption::convertToComment(const QCString &s, const QCString &u)
 {
+  //printf("convertToComment(%s)=%s\n",s.data(),u.data());
   QCString result;
-  if (s.isEmpty()) return result;
-  else
+  if (!s.isEmpty())
   {
     QCString tmp=s.stripWhiteSpace();
     char *p=tmp.data();
@@ -101,6 +101,11 @@ QCString ConfigOption::convertToComment(const QCString &s)
     }
     result+='\n';
   }
+  if (!u.isEmpty())
+  {
+    if (!result.isEmpty()) result+='\n';
+    result+= u;
+  }
   return result;
 }
 
@@ -175,7 +180,7 @@ void ConfigInt::convertStrToVal()
     int val = m_valueString.toInt(&ok);
     if (!ok || val<m_minVal || val>m_maxVal)
     {
-      config_warn("warning: argument `%s' for option %s is not a valid number in the range [%d..%d]!\n"
+      config_warn("Warning: argument `%s' for option %s is not a valid number in the range [%d..%d]!\n"
                 "Using the default: %d!\n",m_valueString.data(),m_name.data(),m_minVal,m_maxVal,m_value);
     }
     m_value=val;
@@ -197,7 +202,7 @@ void ConfigBool::convertStrToVal()
     }
     else
     {
-      config_warn("warning: argument `%s' for option %s is not a valid boolean value\n"
+      config_warn("Warning: argument `%s' for option %s is not a valid boolean value\n"
                 "Using the default: %s!\n",m_valueString.data(),m_name.data(),m_value?"YES":"NO");
     }
   }
@@ -377,6 +382,12 @@ void ConfigObsolete::writeXML(FTextStream &t)
        "id='" << convertToXML(name()) << "'/>" << endl;
 }
 
+void ConfigDisabled::writeXML(FTextStream &t)
+{
+  t << "    <option type='disabled' "
+       "id='" << convertToXML(name()) << "'/>" << endl;
+}
+
 
 /* -----------------------------------------------------------------
  *
@@ -459,7 +470,7 @@ static QCString configStringRecode(
   void *cd = portable_iconv_open(outputEncoding,inputEncoding);
   if (cd==(void *)(-1)) 
   {
-    fprintf(stderr,"error: unsupported character conversion: '%s'->'%s'\n",
+    fprintf(stderr,"Error: unsupported character conversion: '%s'->'%s'\n",
         inputEncoding.data(),outputEncoding.data());
     exit(1);
   }
@@ -476,7 +487,7 @@ static QCString configStringRecode(
   }
   else
   {
-    fprintf(stderr,"error: failed to translate characters from %s to %s: %s\n",
+    fprintf(stderr,"Error: failed to translate characters from %s to %s: %s\n",
         inputEncoding.data(),outputEncoding.data(),strerror(errno));
     exit(1);
   }
@@ -497,7 +508,7 @@ static FILE *tryPath(const char *path,const char *fileName)
   if (fi.exists() && fi.isFile())
   {
     FILE *f=portable_fopen(absName,"r");
-    if (!f) config_err("error: could not open file %s for reading\n",absName.data());
+    if (!f) config_err("Error: could not open file %s for reading\n",absName.data());
     return f;
   }
   return 0;
@@ -508,8 +519,14 @@ static void substEnvVarsInString(QCString &s);
 
 static FILE *findFile(const char *fileName)
 {
-  if(portable_isAbsolutePath(fileName))
+  if (fileName==0)
+  {
+    return 0;
+  }
+  if (portable_isAbsolutePath(fileName))
+  {
     return tryPath(NULL, fileName);
+  }
   substEnvVarsInStrList(includePathList);
   char *s=includePathList.first();
   while (s) // try each of the include paths
@@ -525,7 +542,7 @@ static FILE *findFile(const char *fileName)
 static void readIncludeFile(const char *incName)
 {
   if (includeDepth==MAX_INCLUDE_DEPTH) {
-    config_err("error: maximum include depth (%d) reached, %s is not included. Aborting...\n",
+    config_err("Error: maximum include depth (%d) reached, %s is not included. Aborting...\n",
        MAX_INCLUDE_DEPTH,incName);
     exit(1);
   } 
@@ -534,7 +551,7 @@ static void readIncludeFile(const char *incName)
   substEnvVarsInString(inc);
   inc = inc.stripWhiteSpace();
   uint incLen = inc.length();
-  if (inc.at(0)=='"' && inc.at(incLen-1)=='"') // strip quotes
+  if (incLen>0 && inc.at(0)=='"' && inc.at(incLen-1)=='"') // strip quotes
   {
     inc=inc.mid(1,incLen-2);
   }
@@ -565,7 +582,7 @@ static void readIncludeFile(const char *incName)
   } 
   else
   {
-    config_err("error: @INCLUDE = %s: not found!\n",inc.data());
+    config_err("Error: @INCLUDE = %s: not found!\n",inc.data());
     exit(1);
   }
 }
@@ -589,18 +606,20 @@ static void readIncludeFile(const char *incName)
 %%
 
 <*>\0x0d
-<Start,GetString,GetStrList,GetBool,SkipInvalid>"#"     { BEGIN(SkipComment); }
+<Start,GetString,GetStrList,GetBool,SkipInvalid>"##".*"\n" { config->appendUserComment(yytext);}
+<Start,GetString,GetStrList,GetBool,SkipInvalid>"#"       { BEGIN(SkipComment); }
 <Start>[a-z_A-Z][a-z_A-Z0-9]*[ \t]*"="  { QCString cmd=yytext;
                                            cmd=cmd.left(cmd.length()-1).stripWhiteSpace(); 
                                           ConfigOption *option = config->get(cmd);
                                           if (option==0) // oops not known
                                           {
-                                            config_err("warning: ignoring unsupported tag `%s' at line %d, file %s\n",
+                                            config_err("Warning: ignoring unsupported tag `%s' at line %d, file %s\n",
                                                 yytext,yyLineNr,yyFileName.data()); 
                                             BEGIN(SkipInvalid);
                                           }
                                           else // known tag
                                           {
+                                             option->setUserComment(config->takeUserComment());
                                             option->setEncoding(encoding);
                                             switch(option->kind())
                                             {
@@ -635,11 +654,17 @@ static void readIncludeFile(const char *incName)
                                                 BEGIN(GetString);
                                                 break;
                                               case ConfigOption::O_Obsolete:
-                                                config_err("warning: Tag `%s' at line %d of file %s has become obsolete.\n"
+                                                config_err("Warning: Tag `%s' at line %d of file %s has become obsolete.\n"
                                                            "To avoid this warning please remove this line from your configuration "
                                                            "file or upgrade it using \"doxygen -u\"\n", cmd.data(),yyLineNr,yyFileName.data()); 
                                                 BEGIN(SkipInvalid);
                                                 break;
+                                              case ConfigOption::O_Disabled:
+                                                config_err("Warning: Tag `%s' at line %d of file %s belongs to an option that was not enabled at compile time.\n"
+                                                           "To avoid this warning please remove this line from your configuration "
+                                                           "file, upgrade it using \"doxygen -u\", or recompile doxygen with this feature enabled.\n", cmd.data(),yyLineNr,yyFileName.data()); 
+                                                BEGIN(SkipInvalid);
+                                                break;
                                             }
                                           }
                                        }
@@ -648,12 +673,13 @@ static void readIncludeFile(const char *incName)
                                          ConfigOption *option = config->get(cmd);
                                          if (option==0) // oops not known
                                          {
-                                           config_err("warning: ignoring unsupported tag `%s' at line %d, file %s\n",
+                                           config_err("Warning: ignoring unsupported tag `%s' at line %d, file %s\n",
                                                yytext,yyLineNr,yyFileName.data()); 
                                            BEGIN(SkipInvalid);
                                          }
                                          else // known tag
                                          {
+                                            option->setUserComment(config->takeUserComment());
                                            switch(option->kind())
                                            {
                                              case ConfigOption::O_Info:
@@ -669,16 +695,22 @@ static void readIncludeFile(const char *incName)
                                              case ConfigOption::O_String:
                                              case ConfigOption::O_Int:
                                              case ConfigOption::O_Bool:
-                                               config_err("warning: operator += not supported for `%s'. Ignoring line at line %d, file %s\n",
+                                               config_err("Warning: operator += not supported for `%s'. Ignoring line at line %d, file %s\n",
                                                    yytext,yyLineNr,yyFileName.data()); 
                                                BEGIN(SkipInvalid);
                                                break;
                                               case ConfigOption::O_Obsolete:
-                                                config_err("warning: Tag `%s' at line %d of file %s has become obsolete.\n"
+                                                config_err("Warning: Tag `%s' at line %d of file %s has become obsolete.\n"
                                                            "To avoid this warning please update your configuration "
                                                            "file using \"doxygen -u\"\n", cmd.data(),yyLineNr,yyFileName.data()); 
                                                 BEGIN(SkipInvalid);
                                                 break;
+                                              case ConfigOption::O_Disabled:
+                                                config_err("Warning: Tag `%s' at line %d of file %s belongs to an option that was not enabled at compile time.\n"
+                                                           "To avoid this warning please remove this line from your configuration "
+                                                           "file, upgrade it using \"doxygen -u\", or recompile doxygen with this feature enabled.\n", cmd.data(),yyLineNr,yyFileName.data()); 
+                                                BEGIN(SkipInvalid);
+                                                break;
                                             }
                                           }
                                        }
@@ -711,7 +743,7 @@ static void readIncludeFile(const char *incName)
                                          }
                                        }
 
-<Start>[a-z_A-Z0-9]+                   { config_err("warning: ignoring unknown tag `%s' at line %d, file %s\n",yytext,yyLineNr,yyFileName.data()); }
+<Start>[a-z_A-Z0-9]+                   { config_err("Warning: ignoring unknown tag `%s' at line %d, file %s\n",yytext,yyLineNr,yyFileName.data()); }
 <GetString,GetBool,SkipInvalid>\n      { yyLineNr++; BEGIN(Start); }
 <GetStrList>\n                         { 
                                          yyLineNr++; 
@@ -752,7 +784,7 @@ static void readIncludeFile(const char *incName)
                                          }
                                          if (*yytext=='\n')
                                          {
-                                           config_err("warning: Missing end quote (\") on line %d, file %s\n",yyLineNr,yyFileName.data());
+                                           config_err("Warning: Missing end quote (\") on line %d, file %s\n",yyLineNr,yyFileName.data());
                                            yyLineNr++;
                                          }
                                          BEGIN(lastState);
@@ -771,7 +803,7 @@ static void readIncludeFile(const char *incName)
                                          else 
                                          {
                                            *b=FALSE; 
-                                           config_warn("warning: Invalid value `%s' for "
+                                           config_warn("Warning: Invalid value `%s' for "
                                                 "boolean tag in line %d, file %s; use YES or NO\n",
                                                 bs.data(),yyLineNr,yyFileName.data());
                                          }
@@ -798,6 +830,8 @@ void Config::writeTemplate(FTextStream &t,bool sl,bool upd)
     t << "# This file describes the settings to be used by the documentation system\n";
     t << "# doxygen (www.doxygen.org) for a project.\n";
     t << "#\n";
+    t << "# All text after a double hash (##) is considered a comment and is placed\n";
+    t << "# in front of the TAG it is preceding .\n";
     t << "# All text after a hash (#) is considered a comment and will be ignored.\n";
     t << "# The format is:\n";
     t << "#       TAG = value [value, ...]\n";
@@ -811,6 +845,12 @@ void Config::writeTemplate(FTextStream &t,bool sl,bool upd)
     option->writeTemplate(t,sl,upd);
     option = m_options->next();
   }
+  /* print last lines of user comment that were at the end of the file */
+  if (m_userComment)
+  {
+    t << "\n";
+    t << m_userComment;
+  }
 }
 
 void Config::writeXML(FTextStream &t)
@@ -1044,15 +1084,15 @@ void Config::check()
   {
     if (warnFormat.find("$file")==-1)
     {
-      config_err("warning: warning format does not contain a $file tag!\n");
+      config_err("Warning: warning format does not contain a $file tag!\n");
     }
     if (warnFormat.find("$line")==-1)
     {
-      config_err("warning: warning format does not contain a $line tag!\n");
+      config_err("Warning: warning format does not contain a $line tag!\n");
     }
     if (warnFormat.find("$text")==-1)
     {
-      config_err("warning: warning format foes not contain a $text tag!\n");
+      config_err("Warning: warning format foes not contain a $text tag!\n");
     }
   }
 
@@ -1073,7 +1113,7 @@ void Config::check()
   if (paperType!="a4" && paperType!="a4wide" && paperType!="letter" && 
       paperType!="legal" && paperType!="executive")
   {
-    config_err("error: Unknown page type specified");
+    config_err("Error: Unknown page type specified\n");
   }
   
   QCString &outputLanguage=Config_getEnum("OUTPUT_LANGUAGE");
@@ -1113,7 +1153,7 @@ void Config::check()
     QFileInfo fi(headerFile);
     if (!fi.exists())
     {
-      config_err("error: tag HTML_HEADER: header file `%s' "
+      config_err("Error: tag HTML_HEADER: header file `%s' "
          "does not exist\n",headerFile.data());
       exit(1);
     }
@@ -1125,11 +1165,26 @@ void Config::check()
     QFileInfo fi(footerFile);
     if (!fi.exists())
     {
-      config_err("error: tag HTML_FOOTER: footer file `%s' "
+      config_err("Error: tag HTML_FOOTER: footer file `%s' "
          "does not exist\n",footerFile.data());
       exit(1);
     }
   }
+  // Test to see if MathJax code file is valid
+  if (Config_getBool("USE_MATHJAX"))
+  {
+    QCString &MathJaxCodefile = Config_getString("MATHJAX_CODEFILE");
+    if (!MathJaxCodefile.isEmpty())
+    {
+      QFileInfo fi(MathJaxCodefile);
+      if (!fi.exists())
+      {
+        config_err("Error: tag MATHJAX_CODEFILE file `%s' "
+           "does not exist\n",MathJaxCodefile.data());
+        exit(1);
+      }
+    }
+  }
   // Test to see if LaTeX header is valid
   QCString &latexHeaderFile = Config_getString("LATEX_HEADER");
   if (!latexHeaderFile.isEmpty())
@@ -1137,7 +1192,7 @@ void Config::check()
     QFileInfo fi(latexHeaderFile);
     if (!fi.exists())
     {
-      config_err("error: tag LATEX_HEADER: header file `%s' "
+      config_err("Error: tag LATEX_HEADER: header file `%s' "
          "does not exist\n",latexHeaderFile.data());
       exit(1);
     }
@@ -1148,7 +1203,7 @@ void Config::check()
   while (s)
   {
     QFileInfo fi(s);
-    if (!fi.exists()) config_err("warning: tag INCLUDE_PATH: include path `%s' "
+    if (!fi.exists()) config_err("Warning: tag INCLUDE_PATH: include path `%s' "
                          "does not exist\n",s);
     s=includePath.next();
   }
@@ -1164,7 +1219,7 @@ void Config::check()
     alias=alias.stripWhiteSpace();
     if (alias.find(re1)!=0 && alias.find(re2)!=0)
     {
-      config_err("Illegal alias format `%s'. Use \"name=value\" or \"name(n)=value\", where n is the number of arguments\n",
+      config_err("Error: Illegal alias format `%s'. Use \"name=value\" or \"name(n)=value\", where n is the number of arguments\n",
          alias.data());
     }
     s=aliasList.next();
@@ -1173,19 +1228,19 @@ void Config::check()
   // check if GENERATE_TREEVIEW and GENERATE_HTMLHELP are both enabled
   if (Config_getBool("GENERATE_TREEVIEW") && Config_getBool("GENERATE_HTMLHELP"))
   {
-    config_err("When enabling GENERATE_HTMLHELP the tree view (GENERATE_TREEVIEW) should be disabled. I'll do it for you.\n");
+    config_err("Error: When enabling GENERATE_HTMLHELP the tree view (GENERATE_TREEVIEW) should be disabled. I'll do it for you.\n");
     Config_getBool("GENERATE_TREEVIEW")=FALSE;
   }
   if (Config_getBool("SEARCHENGINE") && Config_getBool("GENERATE_HTMLHELP"))
   {
-    config_err("When enabling GENERATE_HTMLHELP the search engine (SEARCHENGINE) should be disabled. I'll do it for you.\n");
+    config_err("Error: When enabling GENERATE_HTMLHELP the search engine (SEARCHENGINE) should be disabled. I'll do it for you.\n");
     Config_getBool("SEARCHENGINE")=FALSE;
   }
 
   // check if SEPARATE_MEMBER_PAGES and INLINE_GROUPED_CLASSES are both enabled
   if (Config_getBool("SEPARATE_MEMBER_PAGES") && Config_getBool("INLINE_GROUPED_CLASSES"))
   {
-    config_err("When enabling INLINE_GROUPED_CLASSES the SEPARATE_MEMBER_PAGES option should be disabled. I'll do it for you.\n");
+    config_err("Error: When enabling INLINE_GROUPED_CLASSES the SEPARATE_MEMBER_PAGES option should be disabled. I'll do it for you.\n");
     Config_getBool("SEPARATE_MEMBER_PAGES")=FALSE;
   }
     
@@ -1201,6 +1256,14 @@ void Config::check()
   //  config_err("Invalid value for DOT_IMAGE_FORMAT: `%s'. Using the default.\n",dotImageFormat.data());
   //  dotImageFormat = "png";
   //}
+
+  QCString &dotFontName=Config_getString("DOT_FONTNAME");
+  if (dotFontName=="FreeSans" || dotFontName=="FreeSans.ttf")
+  {
+    config_err("Warning: doxygen no longer ships with the FreeSans font.\n"
+               "You may want to clear or change DOT_FONTPATH.\n"
+               "Otherwise you run the risk that the wrong font is being used for dot generated graphs.\n");
+  }
   
   
   // check dot path
@@ -1217,7 +1280,7 @@ void Config::check()
       QFileInfo dp(dotPath+"/dot"+portable_commandExtension());
       if (!dp.exists() || !dp.isFile())
       {
-       config_err("warning: the dot tool could not be found at %s\n",dotPath.data());
+       config_err("Warning: the dot tool could not be found at %s\n",dotPath.data());
        dotPath="";
       }
       else
@@ -1242,7 +1305,7 @@ void Config::check()
     QFileInfo dp(mscgenPath+"/mscgen"+portable_commandExtension());
     if (!dp.exists() || !dp.isFile())
     {
-      config_err("warning: the mscgen tool could not be found at %s\n",mscgenPath.data());
+      config_err("Warning: the mscgen tool could not be found at %s\n",mscgenPath.data());
       mscgenPath="";
     }
     else
@@ -1275,7 +1338,7 @@ void Config::check()
       QFileInfo fi(s);
       if (!fi.exists())
       {
-       config_err("warning: tag INPUT: input source `%s' does not exist\n",s);
+       config_err("Warning: tag INPUT: input source `%s' does not exist\n",s);
       }
       s=inputSources.next();
     }
@@ -1290,7 +1353,7 @@ void Config::check()
     filePatternList.append("*.cxx");
     filePatternList.append("*.cpp");
     filePatternList.append("*.c++");
-    filePatternList.append("*.d");
+    //filePatternList.append("*.d");
     filePatternList.append("*.java");
     filePatternList.append("*.ii");
     filePatternList.append("*.ixx");
@@ -1366,14 +1429,14 @@ void Config::check()
       Config_getString("GENERATE_TAGFILE").isEmpty()
      )
   {
-    config_err("warning: No output formats selected! Set at least one of the main GENERATE_* options to YES.\n");
+    config_err("Warning: No output formats selected! Set at least one of the main GENERATE_* options to YES.\n");
   }
 
   // check HTMLHELP creation requirements
   if (!Config_getBool("GENERATE_HTML") && 
       Config_getBool("GENERATE_HTMLHELP"))
   {
-    config_err("warning: GENERATE_HTMLHELP=YES requires GENERATE_HTML=YES.\n");
+    config_err("Warning: GENERATE_HTMLHELP=YES requires GENERATE_HTML=YES.\n");
   }
 
   // check QHP creation requirements
@@ -1381,13 +1444,13 @@ void Config::check()
   {
     if (Config_getString("QHP_NAMESPACE").isEmpty())
     {
-      config_err("error: GENERATE_QHP=YES requires QHP_NAMESPACE to be set. Using 'org.doxygen.doc' as default!.\n");
+      config_err("Error: GENERATE_QHP=YES requires QHP_NAMESPACE to be set. Using 'org.doxygen.doc' as default!.\n");
       Config_getString("QHP_NAMESPACE")="org.doxygen.doc";
     }
 
     if (Config_getString("QHP_VIRTUAL_FOLDER").isEmpty())
     {
-      config_err("error: GENERATE_QHP=YES requires QHP_VIRTUAL_FOLDER to be set. Using 'doc' as default!\n");
+      config_err("Error: GENERATE_QHP=YES requires QHP_VIRTUAL_FOLDER to be set. Using 'doc' as default!\n");
       Config_getString("QHP_VIRTUAL_FOLDER")="doc";
     }
   }
@@ -1438,7 +1501,7 @@ void Config::check()
   if (!mathJaxFormat.isEmpty() && mathJaxFormat!="HTML-CSS" &&
        mathJaxFormat!="NativeMML" && mathJaxFormat!="SVG")
   {
-    config_err("error: Unsupported value for MATHJAX_FORMAT: Should be one of HTML-CSS, NativeMML, or SVG\n");
+    config_err("Error: Unsupported value for MATHJAX_FORMAT: Should be one of HTML-CSS, NativeMML, or SVG\n");
     Config_getEnum("MATHJAX_FORMAT")="HTML-CSS";
   }
 
@@ -1484,7 +1547,7 @@ void Config::check()
     if (!b6) s6="  EXTRACT_PACKAGE        = YES (was NO)\n"; else s6="";
 
 
-    config_err("warning: enabling OPTIMIZE_OUTPUT_VHDL assumes the following settings:\n"
+    config_err("Warning: enabling OPTIMIZE_OUTPUT_VHDL assumes the following settings:\n"
               "%s%s%s%s%s%s",s1,s2,s3,s4,s5,s6
              );
 
@@ -1506,6 +1569,24 @@ void Config::init()
     option->init();
     option = m_options->next();
   }
+
+  // sanity check if all depends relations are valid
+  option = m_options->first();
+  while (option)
+  {
+    QCString depName = option->dependsOn();
+    if (!depName.isEmpty())
+    {
+      ConfigOption * opt = Config::instance()->get(depName);
+      if (opt==0)
+      {
+        config_err("Warning: Config option '%s' has invalid depends relation on unknown option '%s'\n",
+            option->name().data(),depName.data());
+        exit(1);
+      }
+    }
+    option = m_options->next();
+  }
 }
 
 void Config::create()
@@ -1547,7 +1628,7 @@ static QCString configFileToString(const char *name)
     QFileInfo fi(name);
     if (!fi.exists() || !fi.isFile())
     {
-      config_err("error: file `%s' not found\n",name);
+      config_err("Error: file `%s' not found\n",name);
       return "";
     }
     f.setName(name);
@@ -1568,7 +1649,7 @@ static QCString configFileToString(const char *name)
   }
   if (!fileOpened)  
   {
-    config_err("error: cannot open file `%s' for reading\n",name);
+    config_err("Error: cannot open file `%s' for reading\n",name);
   }
   return "";
 }
index a75ff80..0b67283 100644 (file)
@@ -49,9 +49,9 @@ The default language is English, other supported languages are:
 Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, 
 Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, 
 Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English 
-messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, 
-Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak
-Slovene, Spanish, Swedish, Ukrainian, and Vietnamese. 
+messages), Korean, Korean-en, Latvian, Lithuanian, Norwegian, Macedonian, 
+Persian, Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic
+Slovak, Slovene, Spanish, Swedish, Ukrainian, and Vietnamese. 
 '>
       <value name='Afrikaans'/>
       <value name='Arabic'/>
@@ -76,6 +76,7 @@ Slovene, Spanish, Swedish, Ukrainian, and Vietnamese.
       <value name='Japanese-en'/>
       <value name='Korean'/>
       <value name='Korean-en'/>
+      <value name='Latvian'/>
       <value name='Norwegian'/>
       <value name='Macedonian'/>
       <value name='Persian'/>
@@ -261,10 +262,10 @@ can mix doxygen, HTML, and XML commands with Markdown formatting.
 Disable only in case of backward compatibilities issues. 
 ' defval='1'/>
     <option type='bool' id='AUTOLINK_SUPPORT' docs='
-When enabled doxygen tries to link words that correspond to documented classes, 
-or namespaces to their corresponding documentation. Such a link can be 
-prevented in individual cases by by putting a % sign in front of the word or 
-globally by setting AUTOLINK_SUPPORT to NO.
+When enabled doxygen tries to link words that correspond to documented 
+classes, or namespaces to their corresponding documentation. Such a link can 
+be prevented in individual cases by by putting a % sign in front of the word 
+or globally by setting AUTOLINK_SUPPORT to NO.
 ' defval='1'/>
     <option type='bool' id='BUILTIN_STL_SUPPORT' docs='
 If you use STL classes (i.e. std::string, std::vector, etc.) but do not want 
@@ -312,11 +313,12 @@ section (for LaTeX and RTF).
 ' defval='0'/>
     <option type='bool' id='INLINE_SIMPLE_STRUCTS' docs='
 When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and 
-unions with only public data fields will be shown inline in the documentation 
-of the scope in which they are defined (i.e. file, namespace, or group 
-documentation), provided this scope is documented. If set to NO (the default), 
-structs, classes, and unions are shown on a separate page (for HTML and Man 
-pages) or section (for LaTeX and RTF).' defval='0'/>
+unions with only public data fields or simple typedef fields will be shown 
+inline in the documentation of the scope in which they are defined (i.e. file, 
+namespace, or group documentation), provided this scope is documented. If set 
+to NO (the default), structs, classes, and unions are shown on a separate 
+page (for HTML and Man pages) or section (for LaTeX and RTF).
+' defval='0'/>
     <option type='bool' id='TYPEDEF_HIDES_STRUCT' docs='
 When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum 
 is documented as struct, union, or enum with the name of the typedef. So 
@@ -326,30 +328,15 @@ namespace, or class. And the struct will be named TypeS. This can typically
 be useful for C code in case the coding convention dictates that all compound 
 types are typedef&apos;ed and only the typedef is referenced, never the tag name. 
 ' defval='0'/>
-    <option type='int' id='SYMBOL_CACHE_SIZE' docs='
-The SYMBOL_CACHE_SIZE determines the size of the internal cache use to 
-determine which symbols to keep in memory and which to flush to disk. 
-When the cache is full, less often used symbols will be written to disk. 
-For small to medium size projects (&lt;1000 input files) the default value is 
-probably good enough. For larger projects a too small cache size can cause 
-doxygen to be busy swapping symbols to and from disk most of the time 
-causing a significant performance penalty. 
-If the system has enough physical memory increasing the cache will improve the 
-performance by keeping more symbols in memory. Note that the value works on 
-a logarithmic scale so increasing the size by one will roughly double the 
-memory usage. The cache size is given by this formula: 
-2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, 
-corresponding to a cache size of 2^16 = 65536 symbols. 
-' minval='0' maxval='9' defval='0'/>
     <option type='int' id='LOOKUP_CACHE_SIZE' docs='
-Similar to the SYMBOL_CACHE_SIZE the size of the symbol lookup cache can be 
-set using LOOKUP_CACHE_SIZE. This cache is used to resolve symbols give
-their name and scope. Since this can be an expensive process and often the 
-same symbol appear multiple times in the code, doxygen keeps a cache of 
-pre-resolved symbols. If the cache is too small doxygen will become slower
-If the cache is too large, memory is wasted. The cache size is given by this 
-formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range is 0..9, the default is 0, 
-corresponding to a cache size of 2^16 = 65536 symbols. 
+The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This 
+cache is used to resolve symbols given their name and scope. Since this ca
+be an expensive process and often the same symbol appear multiple times in 
+the code, doxygen keeps a cache of pre-resolved symbols. If the cache is too 
+small doxygen will become slower. If the cache is too large, memory is wasted
+The cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid 
+range is 0..9, the default is 0, corresponding to a cache size of 2^16 = 65536 
+symbols. 
 ' minval='0' maxval='9' defval='0'/>
   </group>
   <group name='Build' docs='Build related configuration options'>
@@ -357,7 +344,7 @@ corresponding to a cache size of 2^16 = 65536 symbols.
 If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in 
 documentation are documented, even if no documentation was available. 
 Private class members and static file members will be hidden unless 
-the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES 
+the EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES 
 ' defval='0'/>
     <option type='bool' id='EXTRACT_PRIVATE' docs='
 If the EXTRACT_PRIVATE tag is set to YES all private members of a class 
@@ -734,8 +721,10 @@ invoke to filter for each input file. Doxygen will invoke the filter program
 by executing (via popen()) the command &lt;filter&gt; &lt;input-file&gt;, where &lt;filter&gt; 
 is the value of the INPUT_FILTER tag, and &lt;input-file&gt; is the name of an 
 input file. Doxygen will then use the output that the filter program writes 
-to standard output.  If FILTER_PATTERNS is specified, this tag will be 
-ignored. 
+to standard output.  If FILTER_PATTERNS is specified, this tag will be ignored. 
+Note that the filter must not add or remove lines; it is applied before the 
+code is scanned, but not when the output code is generated. If lines are added 
+or removed, the anchors will not be placed correctly.
 ' defval=''/>
     <option type='list' id='FILTER_PATTERNS' format='string' docs='
 The FILTER_PATTERNS tag can be used to specify filters on a per file pattern 
@@ -760,9 +749,9 @@ FILTER_SOURCE_FILES is enabled.
 ' depends='FILTER_SOURCE_FILES'/>
     <option type='string' id='USE_MDFILE_AS_MAINPAGE' format='string' docs='
 If the USE_MD_FILE_AS_MAINPAGE tag refers to the name of a markdown file that 
-is part of the input, its contents will be placed on the main page (index.html). 
-This can be useful if you have a project on for instance GitHub and want reuse 
-the introduction page also for the doxygen output.
+is part of the input, its contents will be placed on the main page 
+(index.html). This can be useful if you have a project on for instance GitHub 
+and want reuse the introduction page also for the doxygen output.
 ' defval=''/>
   </group>
   <group name='Source Browser' docs='configuration options related to source browsing'>
@@ -809,6 +798,18 @@ If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen
 will generate a verbatim copy of the header file for each class for 
 which an include is specified. Set to NO to disable this. 
 ' defval='1'/>
+     <option type='bool' id='CLANG_ASSISTED_PARSING' setting='USE_LIBCLANG' docs='
+If CLANG_ASSISTED_PARSING is set to YES, then doxygen will use the clang parser 
+for more acurate parsing at the cost of reduced performance. This can be 
+particularly helpful with template rich C++ code for which doxygen&apos;s built-in 
+parser lacks the necessairy type information.
+' defval='0'/>
+     <option type='list' id='CLANG_OPTIONS' setting='USE_LIBCLANG' docs='
+If clang assisted parsing is enabled you can provide the compiler with command 
+line options that you would normally use when invoking the compiler. Note that 
+the include paths will already be set by doxygen for the files and directories 
+specified at INPUT and INCLUDE_PATH.
+' defval='' depends='CLANG_ASSISTED_PARSING'/>
   </group>
   <group name='Index' docs='configuration options related to the alphabetical class index'>
     <option type='bool' id='ALPHABETICAL_INDEX' docs='
@@ -820,13 +821,13 @@ contains a lot of classes, structs, unions or interfaces.
 If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then 
 the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns 
 in which this list will be split (can be a number in the range [1..20]) 
-' minval='1' maxval='20' defval='5'/>
+' minval='1' maxval='20' defval='5' depends='ALPHABETICAL_INDEX'/>
     <option type='list' id='IGNORE_PREFIX' format='string' docs='
 In case all classes in a project start with a common prefix, all 
 classes will be put under the same header in the alphabetical index. 
 The IGNORE_PREFIX tag can be used to specify one or more prefixes that 
 should be ignored while generating the index headers. 
-'>
+' depends='ALPHABETICAL_INDEX'>
     </option>
   </group>
   <group name='HTML' docs='configuration options related to the HTML output'>
@@ -882,7 +883,7 @@ the output directory.
 The HTML_EXTRA_FILES tag can be used to specify one or more extra images or 
 other source files which should be copied to the HTML output directory. Note 
 that these files will be copied to the base HTML output directory. Use the 
-$relpath$ marker in the HTML_HEADER and/or HTML_FOOTER files to load these 
+$relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these 
 files. In the HTML_STYLESHEET file, use the file name only. Also note that 
 the files will be copied as-is; there are no commands or markers available.
 ' depends='GENERATE_HTML'/>
@@ -907,7 +908,7 @@ the luminance component of the colors in the HTML output. Values below
 the output darker. The value divided by 100 is the actual gamma applied, 
 so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2, 
 and 100 does not change the gamma.
-' minval='40' maxval='240' defval='80'/>
+' minval='40' maxval='240' defval='80' depends='GENERATE_HTML'/>
     <option type='bool' id='HTML_TIMESTAMP' docs='
 If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML 
 page will contain the date and time when the page was generated. Setting 
@@ -927,7 +928,7 @@ visible (unless a fully collapsed tree already exceeds this amount).
 So setting the number of entries 1 will produce a full collapsed tree by 
 default. 0 is a special value representing an infinite number of entries 
 and will result in a full expanded tree by default.
-' minval='0' maxval='9999' defval='100'/>
+' minval='0' maxval='9999' defval='100' depends='GENERATE_HTML'/>
     <option type='bool' id='GENERATE_DOCSET' docs='
 If the GENERATE_DOCSET tag is set to YES, additional index files 
 will be generated that can be used as input for Apple&apos;s Xcode 3 
@@ -1111,13 +1112,13 @@ rendering instead of using prerendered bitmaps. Use this if you do not
 have LaTeX installed or if you want to formulas look prettier in the HTML 
 output. When enabled you may also need to install MathJax separately and 
 configure the path to it using the MATHJAX_RELPATH option.
-' defval='0'/> 
+' defval='0' depends='GENERATE_HTML'/> 
     <option type='enum' id='MATHJAX_FORMAT' defval='HTML-CSS' docs='
 When MathJax is enabled you can set the default output format to be used for 
-thA MathJax output. Supported types are HTML-CSS, NativeMML (i.e. MathML) and 
+the MathJax output. Supported types are HTML-CSS, NativeMML (i.e. MathML) and 
 SVG. The default value is HTML-CSS, which is slower, but has the best 
 compatibility. 
-'>
+' depends='USE_MATHJAX'>
       <value name="HTML-CSS"/>
       <value name="NativeMML"/>
       <value name="SVG"/>
@@ -1131,12 +1132,17 @@ MATHJAX_RELPATH should be ../mathjax. The default value points to
 the MathJax Content Delivery Network so you can quickly see the result without 
 installing MathJax.  However, it is strongly recommended to install a local 
 copy of MathJax from http://www.mathjax.org before deployment.
-' defval='http://cdn.mathjax.org/mathjax/latest'/>
+' defval='http://cdn.mathjax.org/mathjax/latest' depends='USE_MATHJAX'/>
     <option type='list' id='MATHJAX_EXTENSIONS' format='string' docs='
 The MATHJAX_EXTENSIONS tag can be used to specify one or MathJax extension 
 names that should be enabled during MathJax rendering. 
 ' depends='USE_MATHJAX'>
     </option>
+    <option type='string' id='MATHJAX_CODEFILE' format='string' docs='
+The MATHJAX_CODEFILE tag can be used to specify a file with javascript 
+pieces of code that will be used on startup of the MathJax code. 
+' depends='USE_MATHJAX'>
+    </option>
     <option type='bool' id='SEARCHENGINE' docs='
 When the SEARCHENGINE tag is enabled doxygen will generate a search box 
 for the HTML output. The underlying search engine uses javascript 
@@ -1161,8 +1167,8 @@ script for searching. Instead the search results are written to an XML file
 which needs to be processed by an external indexer. Doxygen will invoke an 
 external search engine pointed to by the SEARCHENGINE_URL option to obtain 
 the search results. Doxygen ships with an example indexer (doxyindexer) and 
-search engine (doxysearch.cgi) which are based on the open source search engine 
-library Xapian. See the manual for configuration details. 
+search engine (doxysearch.cgi) which are based on the open source search 
+engine library Xapian. See the manual for configuration details. 
 ' defval='0' depends='SEARCHENGINE'/>
     <option type='string' id='SEARCHENGINE_URL' docs='
 The SEARCHENGINE_URL should point to a search engine hosted by a web server 
@@ -1176,14 +1182,19 @@ When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed
 search data is written to a file for indexing by an external tool. With the 
 SEARCHDATA_FILE tag the name of this file can be specified.
 ' defval='searchdata.xml' depends='SEARCHENGINE'/>
+    <option type='string' id='EXTERNAL_SEARCH_ID' docs='
+When SERVER_BASED_SEARCH AND EXTERNAL_SEARCH are both enabled the 
+EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is 
+useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple 
+projects and redirect the results back to the right project.
+' defval='' depends='SEARCHENGINE'/>
     <option type='list' id='EXTRA_SEARCH_MAPPINGS' docs='
-The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through other 
-doxygen projects that are not otherwise connected via tags files, but are 
-all added to the same search index. Each project needs to have a tag file set 
-via GENERATE_TAGFILE. The search mapping then maps the name of the tag file 
-to a relative location where the documentation can be found,  similar to the 
-TAGFILES option but without actually processing the tag file. 
-The format is: EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ... 
+The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen 
+projects other than the one defined by this configuration file, but that are 
+all added to the same external search index. Each project needs to have a 
+unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id 
+of to a relative location where the documentation can be found. 
+The format is: EXTRA_SEARCH_MAPPINGS = id1=loc1 id2=loc2 ... 
 ' defval='0' depends='SEARCHENGINE'/>
   </group>
   <group name='LaTeX' docs='configuration options related to the LaTeX output'>
@@ -1216,10 +1227,9 @@ save some trees in general.
     <option type='enum' id='PAPER_TYPE' defval='a4' docs='
 The PAPER_TYPE tag can be used to set the paper type that is used 
 by the printer. Possible values are: a4, letter, legal and 
-executive. If left blank a4wide will be used. 
+executive. If left blank a4 will be used. 
 ' depends='GENERATE_LATEX'>
       <value name='a4'/>
-      <value name='a4wide'/>
       <value name='letter'/>
       <value name='legal'/>
       <value name='executive'/>
@@ -1241,6 +1251,12 @@ the generated latex document. The footer should contain everything after
 the last chapter. If it is left blank doxygen will generate a 
 standard footer. Notice: only use this tag if you know what you are doing! 
 ' defval='' depends='GENERATE_LATEX'/>
+    <option type='list' id='LATEX_EXTRA_FILES' format='file' docs='
+The LATEX_EXTRA_FILES tag can be used to specify one or more extra images 
+or other source files which should be copied to the LaTeX output directory. 
+Note that the files will be copied as-is; there are no commands or markers 
+available. 
+' depends='GENERATE_LATEX'/>
     <option type='bool' id='PDF_HYPERLINKS' docs='
 If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated 
 is prepared for conversion to pdf (using ps2pdf). The pdf file will 
@@ -1273,7 +1289,7 @@ such as SOURCE_BROWSER.
 The LATEX_BIB_STYLE tag can be used to specify the style to use for the 
 bibliography, e.g. plainnat, or ieeetr. The default style is &quot;plain&quot;. See 
 http://en.wikipedia.org/wiki/BibTeX for more info.
-' defval='plain'/>
+' defval='plain' depends='GENERATE_LATEX'/>
   </group>
   <group name='RTF' docs='configuration options related to the RTF output'>
     <option type='bool' id='GENERATE_RTF' docs='
@@ -1359,6 +1375,17 @@ and cross-referencing information) to the XML output. Note that
 enabling this will significantly increase the size of the XML output. 
 ' defval='1' depends='GENERATE_XML'/>
   </group>
+  <group name='Docbook' docs='configuration options related to the DOCBOOK output'>
+    <option type='bool' id='GENERATE_DOCBOOK' docs='
+If the GENERATE_DOCBOOK tag is set to YES Doxygen will generate DOCBOOK files 
+that can be used to generate PDF.
+' defval='0'/>
+    <option type='string' id='DOCBOOK_OUTPUT' format='dir' docs='
+The DOCBOOK_OUTPUT tag is used to specify where the DOCBOOK pages will be put. 
+If a relative path is entered the value of OUTPUT_DIRECTORY will be put in 
+front of it. If left blank docbook will be used as the default path.
+' defval='docbook' depends='GENERATE_DOCBOOK'/>
+  </group>
   <group name='DEF' docs='configuration options for the AutoGen Definitions output'>
     <option type='bool' id='GENERATE_AUTOGEN_DEF' docs='
 If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will 
@@ -1368,6 +1395,19 @@ documentation. Note that this feature is still experimental
 and incomplete at the moment. 
 ' defval='0'/>
   </group>
+<!--
+  <group name='Sqlite3' docs='configuration options related to Sqlite3 output'>
+    <option type='bool' id='GENERATE_SQLITE3' docs='
+If the GENERATE_SQLITE3 tag is set to YES doxygen will generate an  
+sqlite database with symbols found by doxygen stored in tables.
+' defval='0'/>
+    <option type='string' id='SQLITE3_OUTPUT' format='dir' docs='
+The SQLITE3_OUTPUT tag is used to specify where the Sqlite3 database will be put. 
+If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+put in front of it. If left blank sqlite3 will be used as the default path. 
+' defval='' depends='GENERATE_SQLITE3'/>
+  </group>
+-->
   <group name='PerlMod' docs='configuration options related to the Perl module output'>
     <option type='bool' id='GENERATE_PERLMOD' docs='
 If the GENERATE_PERLMOD tag is set to YES Doxygen will 
@@ -1419,7 +1459,7 @@ pointed to by INCLUDE_PATH will be searched when a #include is found.
 The INCLUDE_PATH tag can be used to specify one or more directories that 
 contain include files that are not input files but should be processed by 
 the preprocessor. 
-' depends='ENABLE_PREPROCESSING'>
+' depends='SEARCH_INCLUDES'>
     </option>
     <option type='list' id='INCLUDE_FILE_PATTERNS' format='string' docs='
 You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard 
@@ -1481,6 +1521,11 @@ If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed
 in the modules index. If set to NO, only the current project&apos;s groups will 
 be listed. 
 ' defval='1'/>
+    <option type='bool' id='EXTERNAL_PAGES' docs='
+If the EXTERNAL_PAGES tag is set to YES all external pages will be listed 
+in the related pages index. If set to NO, only the current project&apos;s 
+pages will be listed. 
+' defval='1'/>
     <option type='string' id='PERL_PATH' format='dir' docs='
 The PERL_PATH should be the absolute path and name of the perl script 
 interpreter (i.e. the result of `which perl&apos;). 
@@ -1519,7 +1564,7 @@ allowed to run in parallel. When set to 0 (the default) doxygen will
 base this on the number of processors available in the system. You can set it 
 explicitly to a value larger than 0 to get control over the balance 
 between CPU load and processing speed.  
-' defval='0' minval='0' maxval='32'/>
+' defval='0' minval='0' maxval='32' depends='HAVE_DOT'/>
     <option type='string' id='DOT_FONTNAME' format='string' docs='
 By default doxygen will use the Helvetica font for all dot files that 
 doxygen generates. When you want a differently looking font you can specify 
@@ -1563,7 +1608,7 @@ If the UML_LOOK tag is enabled, the fields and methods are shown inside
 the class node. If there are many fields or methods and many nodes the 
 graph may become too big to be useful. The UML_LIMIT_NUM_FIELDS 
 threshold limits the number of items for each type to make the size more 
-managable. Set this to 0 for no limit. Note that the threshold may be 
+manageable. Set this to 0 for no limit. Note that the threshold may be 
 exceeded by 50% before the limit is enforced.
 ' defval='10' minval='0' maxval='100' depends='HAVE_DOT'/>
     <option type='bool' id='TEMPLATE_RELATIONS' docs='
@@ -1699,5 +1744,6 @@ the various graphs.
     <option type='obsolete' id='USE_INLINE_TREES'/>
     <option type='obsolete' id='SHOW_DIRECTORIES'/>
     <option type='obsolete' id='HTML_ALIGN_MEMBERS'/>
+    <option type='obsolete' id='SYMBOL_CACHE_SIZE'/>
   </group>
 </doxygenconfig>
index 5af201f..495f290 100755 (executable)
@@ -1,6 +1,6 @@
 # python script to generate configoptions.cpp from config.xml
 #
-# Copyright (C) 1997-2012 by Dimitri van Heesch.
+# Copyright (C) 1997-2013 by Dimitri van Heesch.
 #
 # Permission to use, copy, modify, and distribute this software and its
 # documentation under the terms of the GNU General Public License is hereby 
@@ -29,11 +29,14 @@ def parseOption(node):
        defval  = node.getAttribute('defval')
        adefval = node.getAttribute('altdefval')
        depends = node.getAttribute('depends')
+       setting = node.getAttribute('setting')
        # replace \ by \\, replace " by \", and '  ' by a newline with end string and start string at next line
         docC    = doc.strip().replace('\\','\\\\').replace('"','\\"').replace('  ','\\n"\n                 "')
+       if len(setting)>0:
+               print "#if %s" % (setting)
        print "  //----"
         if type=='bool':
-               if len(adefval)>0:
+               if len(adefval)>0:
                        enabled = adefval
                elif defval=='1':
                        enabled = "TRUE"
@@ -94,6 +97,10 @@ def parseOption(node):
                        print "  cl->setWidgetType(ConfigList::FileAndDir);"
        elif type=='obsolete':
                print "  cfg->addObsolete(\"%s\");" % (name)
+       if len(setting)>0:
+               print "#else"
+               print "  cfg->addDisabled(\"%s\");" % (name)
+               print "#endif"
                
 
 
@@ -121,6 +128,7 @@ def main():
         print "#include \"configoptions.h\""
         print "#include \"config.h\""
         print "#include \"portable.h\""
+        print "#include \"settings.h\""
         print ""
         print "void addConfigOptions(Config *cfg)"
         print "{"
index 846142c..11a7f43 100644 (file)
@@ -6,6 +6,7 @@
 #include "configoptions.h"
 #include "config.h"
 #include "portable.h"
+#include "settings.h"
 
 void addConfigOptions(Config *cfg)
 {
@@ -90,9 +91,9 @@ void addConfigOptions(Config *cfg)
                  "Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional,\n"
                  "Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German,\n"
                  "Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English\n"
-                 "messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian,\n"
-                 "Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak,\n"
-                 "Slovene, Spanish, Swedish, Ukrainian, and Vietnamese.",
+                 "messages), Korean, Korean-en, Latvian, Lithuanian, Norwegian, Macedonian,\n"
+                 "Persian, Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic,\n"
+                 "Slovak, Slovene, Spanish, Swedish, Ukrainian, and Vietnamese.",
                  "English"
                 );
   ce->addValue("Afrikaans");
@@ -118,6 +119,7 @@ void addConfigOptions(Config *cfg)
   ce->addValue("Japanese-en");
   ce->addValue("Korean");
   ce->addValue("Korean-en");
+  ce->addValue("Latvian");
   ce->addValue("Norwegian");
   ce->addValue("Macedonian");
   ce->addValue("Persian");
@@ -365,10 +367,10 @@ void addConfigOptions(Config *cfg)
   //----
   cb = cfg->addBool(
                  "AUTOLINK_SUPPORT",
-                 "When enabled doxygen tries to link words that correspond to documented classes,\n"
-                 "or namespaces to their corresponding documentation. Such a link can be\n"
-                 "prevented in individual cases by by putting a % sign in front of the word or\n"
-                 "globally by setting AUTOLINK_SUPPORT to NO.",
+                 "When enabled doxygen tries to link words that correspond to documented\n"
+                 "classes, or namespaces to their corresponding documentation. Such a link can\n"
+                 "be prevented in individual cases by by putting a % sign in front of the word\n"
+                 "or globally by setting AUTOLINK_SUPPORT to NO.",
                  TRUE
                 );
   //----
@@ -440,11 +442,11 @@ void addConfigOptions(Config *cfg)
   cb = cfg->addBool(
                  "INLINE_SIMPLE_STRUCTS",
                  "When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and\n"
-                 "unions with only public data fields will be shown inline in the documentation\n"
-                 "of the scope in which they are defined (i.e. file, namespace, or group\n"
-                 "documentation), provided this scope is documented. If set to NO (the default),\n"
-                 "structs, classes, and unions are shown on a separate page (for HTML and Man\n"
-                 "pages) or section (for LaTeX and RTF).",
+                 "unions with only public data fields or simple typedef fields will be shown\n"
+                 "inline in the documentation of the scope in which they are defined (i.e. file,\n"
+                 "namespace, or group documentation), provided this scope is documented. If set\n"
+                 "to NO (the default), structs, classes, and unions are shown on a separate\n"
+                 "page (for HTML and Man pages) or section (for LaTeX and RTF).",
                  FALSE
                 );
   //----
@@ -461,33 +463,15 @@ void addConfigOptions(Config *cfg)
                 );
   //----
   ci = cfg->addInt(
-                 "SYMBOL_CACHE_SIZE",
-                 "The SYMBOL_CACHE_SIZE determines the size of the internal cache use to\n"
-                 "determine which symbols to keep in memory and which to flush to disk.\n"
-                 "When the cache is full, less often used symbols will be written to disk.\n"
-                 "For small to medium size projects (<1000 input files) the default value is\n"
-                 "probably good enough. For larger projects a too small cache size can cause\n"
-                 "doxygen to be busy swapping symbols to and from disk most of the time\n"
-                 "causing a significant performance penalty.\n"
-                 "If the system has enough physical memory increasing the cache will improve the\n"
-                 "performance by keeping more symbols in memory. Note that the value works on\n"
-                 "a logarithmic scale so increasing the size by one will roughly double the\n"
-                 "memory usage. The cache size is given by this formula:\n"
-                 "2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0,\n"
-                 "corresponding to a cache size of 2^16 = 65536 symbols.",
-                 0,9,0
-                );
-  //----
-  ci = cfg->addInt(
                  "LOOKUP_CACHE_SIZE",
-                 "Similar to the SYMBOL_CACHE_SIZE the size of the symbol lookup cache can be\n"
-                 "set using LOOKUP_CACHE_SIZE. This cache is used to resolve symbols given\n"
-                 "their name and scope. Since this can be an expensive process and often the\n"
-                 "same symbol appear multiple times in the code, doxygen keeps a cache of\n"
-                 "pre-resolved symbols. If the cache is too small doxygen will become slower.\n"
-                 "If the cache is too large, memory is wasted. The cache size is given by this\n"
-                 "formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range is 0..9, the default is 0,\n"
-                 "corresponding to a cache size of 2^16 = 65536 symbols.",
+                 "The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This\n"
+                 "cache is used to resolve symbols given their name and scope. Since this can\n"
+                 "be an expensive process and often the same symbol appear multiple times in\n"
+                 "the code, doxygen keeps a cache of pre-resolved symbols. If the cache is too\n"
+                 "small doxygen will become slower. If the cache is too large, memory is wasted.\n"
+                 "The cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid\n"
+                 "range is 0..9, the default is 0, corresponding to a cache size of 2^16 = 65536\n"
+                 "symbols.",
                  0,9,0
                 );
   //---------------------------------------------------------------------------
@@ -500,7 +484,7 @@ void addConfigOptions(Config *cfg)
                  "If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in\n"
                  "documentation are documented, even if no documentation was available.\n"
                  "Private class members and static file members will be hidden unless\n"
-                 "the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES",
+                 "the EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES",
                  FALSE
                 );
   //----
@@ -1032,8 +1016,10 @@ void addConfigOptions(Config *cfg)
                  "is the value of the INPUT_FILTER tag, and <input-file> is the name of an\n"
                  "input file. Doxygen will then use the output that the filter program writes\n"
                  "to standard output.\n"
-                 "If FILTER_PATTERNS is specified, this tag will be\n"
-                 "ignored."
+                 "If FILTER_PATTERNS is specified, this tag will be ignored.\n"
+                 "Note that the filter must not add or remove lines; it is applied before the\n"
+                 "code is scanned, but not when the output code is generated. If lines are added\n"
+                 "or removed, the anchors will not be placed correctly."
                 );
   cs->setWidgetType(ConfigString::File);
   //----
@@ -1070,9 +1056,9 @@ void addConfigOptions(Config *cfg)
   cs = cfg->addString(
                  "USE_MDFILE_AS_MAINPAGE",
                  "If the USE_MD_FILE_AS_MAINPAGE tag refers to the name of a markdown file that\n"
-                 "is part of the input, its contents will be placed on the main page (index.html).\n"
-                 "This can be useful if you have a project on for instance GitHub and want reuse\n"
-                 "the introduction page also for the doxygen output."
+                 "is part of the input, its contents will be placed on the main page\n"
+                 "(index.html). This can be useful if you have a project on for instance GitHub\n"
+                 "and want reuse the introduction page also for the doxygen output."
                 );
   //---------------------------------------------------------------------------
   cfg->addInfo("Source Browser","configuration options related to source browsing");
@@ -1147,6 +1133,32 @@ void addConfigOptions(Config *cfg)
                  "which an include is specified. Set to NO to disable this.",
                  TRUE
                 );
+#if USE_LIBCLANG
+  //----
+  cb = cfg->addBool(
+                 "CLANG_ASSISTED_PARSING",
+                 "If CLANG_ASSISTED_PARSING is set to YES, then doxygen will use the clang parser\n"
+                 "for more acurate parsing at the cost of reduced performance. This can be\n"
+                 "particularly helpful with template rich C++ code for which doxygen's built-in\n"
+                 "parser lacks the necessairy type information.",
+                 FALSE
+                );
+#else
+  cfg->addDisabled("CLANG_ASSISTED_PARSING");
+#endif
+#if USE_LIBCLANG
+  //----
+  cl = cfg->addList(
+                 "CLANG_OPTIONS",
+                 "If clang assisted parsing is enabled you can provide the compiler with command\n"
+                 "line options that you would normally use when invoking the compiler. Note that\n"
+                 "the include paths will already be set by doxygen for the files and directories\n"
+                 "specified at INPUT and INCLUDE_PATH."
+                );
+  cl->addDependency("CLANG_ASSISTED_PARSING");
+#else
+  cfg->addDisabled("CLANG_OPTIONS");
+#endif
   //---------------------------------------------------------------------------
   cfg->addInfo("Index","configuration options related to the alphabetical class index");
   //---------------------------------------------------------------------------
@@ -1167,6 +1179,7 @@ void addConfigOptions(Config *cfg)
                  "in which this list will be split (can be a number in the range [1..20])",
                  1,20,5
                 );
+  ci->addDependency("ALPHABETICAL_INDEX");
   //----
   cl = cfg->addList(
                  "IGNORE_PREFIX",
@@ -1175,6 +1188,7 @@ void addConfigOptions(Config *cfg)
                  "The IGNORE_PREFIX tag can be used to specify one or more prefixes that\n"
                  "should be ignored while generating the index headers."
                 );
+  cl->addDependency("ALPHABETICAL_INDEX");
   //---------------------------------------------------------------------------
   cfg->addInfo("HTML","configuration options related to the HTML output");
   //---------------------------------------------------------------------------
@@ -1261,7 +1275,7 @@ void addConfigOptions(Config *cfg)
                  "The HTML_EXTRA_FILES tag can be used to specify one or more extra images or\n"
                  "other source files which should be copied to the HTML output directory. Note\n"
                  "that these files will be copied to the base HTML output directory. Use the\n"
-                 "$relpath$ marker in the HTML_HEADER and/or HTML_FOOTER files to load these\n"
+                 "$relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these\n"
                  "files. In the HTML_STYLESHEET file, use the file name only. Also note that\n"
                  "the files will be copied as-is; there are no commands or markers available."
                 );
@@ -1300,6 +1314,7 @@ void addConfigOptions(Config *cfg)
                  "and 100 does not change the gamma.",
                  40,240,80
                 );
+  ci->addDependency("GENERATE_HTML");
   //----
   cb = cfg->addBool(
                  "HTML_TIMESTAMP",
@@ -1331,6 +1346,7 @@ void addConfigOptions(Config *cfg)
                  "and will result in a full expanded tree by default.",
                  0,9999,100
                 );
+  ci->addDependency("GENERATE_HTML");
   //----
   cb = cfg->addBool(
                  "GENERATE_DOCSET",
@@ -1630,11 +1646,12 @@ void addConfigOptions(Config *cfg)
                  "configure the path to it using the MATHJAX_RELPATH option.",
                  FALSE
                 );
+  cb->addDependency("GENERATE_HTML");
   //----
   ce = cfg->addEnum(
                  "MATHJAX_FORMAT",
                  "When MathJax is enabled you can set the default output format to be used for\n"
-                 "thA MathJax output. Supported types are HTML-CSS, NativeMML (i.e. MathML) and\n"
+                 "the MathJax output. Supported types are HTML-CSS, NativeMML (i.e. MathML) and\n"
                  "SVG. The default value is HTML-CSS, which is slower, but has the best\n"
                  "compatibility.",
                  "HTML-CSS"
@@ -1642,6 +1659,7 @@ void addConfigOptions(Config *cfg)
   ce->addValue("HTML-CSS");
   ce->addValue("NativeMML");
   ce->addValue("SVG");
+  ce->addDependency("USE_MATHJAX");
   //----
   cs = cfg->addString(
                  "MATHJAX_RELPATH",
@@ -1656,6 +1674,7 @@ void addConfigOptions(Config *cfg)
                  "copy of MathJax from http://www.mathjax.org before deployment."
                 );
   cs->setDefaultValue("http://cdn.mathjax.org/mathjax/latest");
+  cs->addDependency("USE_MATHJAX");
   //----
   cl = cfg->addList(
                  "MATHJAX_EXTENSIONS",
@@ -1664,6 +1683,13 @@ void addConfigOptions(Config *cfg)
                 );
   cl->addDependency("USE_MATHJAX");
   //----
+  cs = cfg->addString(
+                 "MATHJAX_CODEFILE",
+                 "The MATHJAX_CODEFILE tag can be used to specify a file with javascript\n"
+                 "pieces of code that will be used on startup of the MathJax code."
+                );
+  cs->addDependency("USE_MATHJAX");
+  //----
   cb = cfg->addBool(
                  "SEARCHENGINE",
                  "When the SEARCHENGINE tag is enabled doxygen will generate a search box\n"
@@ -1697,8 +1723,8 @@ void addConfigOptions(Config *cfg)
                  "which needs to be processed by an external indexer. Doxygen will invoke an\n"
                  "external search engine pointed to by the SEARCHENGINE_URL option to obtain\n"
                  "the search results. Doxygen ships with an example indexer (doxyindexer) and\n"
-                 "search engine (doxysearch.cgi) which are based on the open source search engine\n"
-                 "library Xapian. See the manual for configuration details.",
+                 "search engine (doxysearch.cgi) which are based on the open source search\n"
+                 "engine library Xapian. See the manual for configuration details.",
                  FALSE
                 );
   cb->addDependency("SEARCHENGINE");
@@ -1723,16 +1749,23 @@ void addConfigOptions(Config *cfg)
   cs->setWidgetType(ConfigString::File);
   cs->addDependency("SEARCHENGINE");
   //----
+  cs = cfg->addString(
+                 "EXTERNAL_SEARCH_ID",
+                 "When SERVER_BASED_SEARCH AND EXTERNAL_SEARCH are both enabled the\n"
+                 "EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is\n"
+                 "useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple\n"
+                 "projects and redirect the results back to the right project."
+                );
+  cs->addDependency("SEARCHENGINE");
+  //----
   cl = cfg->addList(
                  "EXTRA_SEARCH_MAPPINGS",
-                 "The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through other\n"
-                 "doxygen projects that are not otherwise connected via tags files, but are\n"
-                 "all added to the same search index. Each project needs to have a tag file set\n"
-                 "via GENERATE_TAGFILE. The search mapping then maps the name of the tag file\n"
-                 "to a relative location where the documentation can be found,\n"
-                 "similar to the\n"
-                 "TAGFILES option but without actually processing the tag file.\n"
-                 "The format is: EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ..."
+                 "The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen\n"
+                 "projects other than the one defined by this configuration file, but that are\n"
+                 "all added to the same external search index. Each project needs to have a\n"
+                 "unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id\n"
+                 "of to a relative location where the documentation can be found.\n"
+                 "The format is: EXTRA_SEARCH_MAPPINGS = id1=loc1 id2=loc2 ..."
                 );
   cl->addDependency("SEARCHENGINE");
   //---------------------------------------------------------------------------
@@ -1792,11 +1825,10 @@ void addConfigOptions(Config *cfg)
                  "PAPER_TYPE",
                  "The PAPER_TYPE tag can be used to set the paper type that is used\n"
                  "by the printer. Possible values are: a4, letter, legal and\n"
-                 "executive. If left blank a4wide will be used.",
+                 "executive. If left blank a4 will be used.",
                  "a4"
                 );
   ce->addValue("a4");
-  ce->addValue("a4wide");
   ce->addValue("letter");
   ce->addValue("legal");
   ce->addValue("executive");
@@ -1829,6 +1861,16 @@ void addConfigOptions(Config *cfg)
   cs->setWidgetType(ConfigString::File);
   cs->addDependency("GENERATE_LATEX");
   //----
+  cl = cfg->addList(
+                 "LATEX_EXTRA_FILES",
+                 "The LATEX_EXTRA_FILES tag can be used to specify one or more extra images\n"
+                 "or other source files which should be copied to the LaTeX output directory.\n"
+                 "Note that the files will be copied as-is; there are no commands or markers\n"
+                 "available."
+                );
+  cl->addDependency("GENERATE_LATEX");
+  cl->setWidgetType(ConfigList::File);
+  //----
   cb = cfg->addBool(
                  "PDF_HYPERLINKS",
                  "If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated\n"
@@ -1884,6 +1926,7 @@ void addConfigOptions(Config *cfg)
                  "http://en.wikipedia.org/wiki/BibTeX for more info."
                 );
   cs->setDefaultValue("plain");
+  cs->addDependency("GENERATE_LATEX");
   //---------------------------------------------------------------------------
   cfg->addInfo("RTF","configuration options related to the RTF output");
   //---------------------------------------------------------------------------
@@ -2033,6 +2076,27 @@ void addConfigOptions(Config *cfg)
                 );
   cb->addDependency("GENERATE_XML");
   //---------------------------------------------------------------------------
+  cfg->addInfo("Docbook","configuration options related to the DOCBOOK output");
+  //---------------------------------------------------------------------------
+
+  //----
+  cb = cfg->addBool(
+                 "GENERATE_DOCBOOK",
+                 "If the GENERATE_DOCBOOK tag is set to YES Doxygen will generate DOCBOOK files\n"
+                 "that can be used to generate PDF.",
+                 FALSE
+                );
+  //----
+  cs = cfg->addString(
+                 "DOCBOOK_OUTPUT",
+                 "The DOCBOOK_OUTPUT tag is used to specify where the DOCBOOK pages will be put.\n"
+                 "If a relative path is entered the value of OUTPUT_DIRECTORY will be put in\n"
+                 "front of it. If left blank docbook will be used as the default path."
+                );
+  cs->setDefaultValue("docbook");
+  cs->setWidgetType(ConfigString::Dir);
+  cs->addDependency("GENERATE_DOCBOOK");
+  //---------------------------------------------------------------------------
   cfg->addInfo("DEF","configuration options for the AutoGen Definitions output");
   //---------------------------------------------------------------------------
 
@@ -2137,7 +2201,7 @@ void addConfigOptions(Config *cfg)
                  "contain include files that are not input files but should be processed by\n"
                  "the preprocessor."
                 );
-  cl->addDependency("ENABLE_PREPROCESSING");
+  cl->addDependency("SEARCH_INCLUDES");
   cl->setWidgetType(ConfigList::Dir);
   //----
   cl = cfg->addList(
@@ -2225,6 +2289,14 @@ void addConfigOptions(Config *cfg)
                  TRUE
                 );
   //----
+  cb = cfg->addBool(
+                 "EXTERNAL_PAGES",
+                 "If the EXTERNAL_PAGES tag is set to YES all external pages will be listed\n"
+                 "in the related pages index. If set to NO, only the current project's\n"
+                 "pages will be listed.",
+                 TRUE
+                );
+  //----
   cs = cfg->addString(
                  "PERL_PATH",
                  "The PERL_PATH should be the absolute path and name of the perl script\n"
@@ -2283,6 +2355,7 @@ void addConfigOptions(Config *cfg)
                  "between CPU load and processing speed.",
                  0,32,0
                 );
+  ci->addDependency("HAVE_DOT");
   //----
   cs = cfg->addString(
                  "DOT_FONTNAME",
@@ -2355,7 +2428,7 @@ void addConfigOptions(Config *cfg)
                  "the class node. If there are many fields or methods and many nodes the\n"
                  "graph may become too big to be useful. The UML_LIMIT_NUM_FIELDS\n"
                  "threshold limits the number of items for each type to make the size more\n"
-                 "managable. Set this to 0 for no limit. Note that the threshold may be\n"
+                 "manageable. Set this to 0 for no limit. Note that the threshold may be\n"
                  "exceeded by 50% before the limit is enforced.",
                  0,100,10
                 );
@@ -2577,4 +2650,6 @@ void addConfigOptions(Config *cfg)
   cfg->addObsolete("SHOW_DIRECTORIES");
   //----
   cfg->addObsolete("HTML_ALIGN_MEMBERS");
+  //----
+  cfg->addObsolete("SYMBOL_CACHE_SIZE");
 }
index 8bf94d5..179d751 100644 (file)
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 767ea66..60e4722 100644 (file)
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index fda1f04..f72e99d 100644 (file)
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index c8b35e5..f47e7c0 100644 (file)
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -34,7 +34,7 @@
 int cppExpYYerror(const char *s)
 {
   warn(g_constExpFileName,g_constExpLineNr,
-       "warning: preprocessing issue while doing constant expression evaluation: %s",s);
+       "preprocessing issue while doing constant expression evaluation: %s",s);
   return 0;
 }
 
index 69b8be4..7efb4f8 100644 (file)
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 7289ce0..3f3ac3a 100644 (file)
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 246bbe9..bfb5cd0 100644 (file)
@@ -830,7 +830,9 @@ DBusXMLScanner::~DBusXMLScanner()
 
 void DBusXMLScanner::parseInput(const char * fileName,
                                 const char * /* fileBuf */,
-                                Entry * root)
+                                Entry *root,
+                                bool /*sameTranslationUnit*/,
+                                QStrList & /*filesInSameTranslationUnit*/)
 {
     QFile inputFile(fileName);
 
index e3eff03..a0ead5a 100644 (file)
@@ -29,9 +29,13 @@ class DBusXMLScanner : public ParserInterface
 public:
     DBusXMLScanner();
     virtual ~DBusXMLScanner();
+    void startTranslationUnit(const char *) {}
+    void finishTranslationUnit() {}
     void parseInput(const char *fileName,
                     const char *fileBuf,
-                    Entry *root);
+                    Entry *root,
+                    bool sameTranslationUnit,
+                    QStrList &filesInSameTranslationUnit);
 
     bool needsPreprocessing(const QCString &extension);
 
index da1233b..c962214 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index c3d78de..bcac588 100644 (file)
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 9486bad..3d8cb87 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index dd3f6f8..3e4ad4a 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 9c6f209..1dbabdb 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index ce870d9..fa945f6 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -408,7 +408,7 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                          g_curArgTypeName+=*yytext;
                                        }
 
-<ReadFuncArgDef,CopyArgString>"->"|">="|">>"   {
+<ReadFuncArgDef,CopyArgString>"<="|"->"|">="|">>"|"<<" {
                                          g_curArgDefValue+=yytext;
                                        }
 <ReadFuncArgDef,CopyArgString,CopyRawString>.          {
index fedb4a0..4e0e5b8 100644 (file)
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -96,6 +96,8 @@ void generateDEFForMember(MemberDef *md,
     case MemberType_Variable:    memType="variable";  break;
     case MemberType_Typedef:     memType="typedef";   break;
     case MemberType_Enumeration: memType="enum";      break;
+    case MemberType_Interface:   memType="interface"; break;
+    case MemberType_Service:     memType="service";   break;
     case MemberType_Function:    memType="function";  isFunc=TRUE; break;
     case MemberType_Signal:      memType="signal";    isFunc=TRUE; break;
     case MemberType_Friend:      memType="friend";    isFunc=TRUE; break;
@@ -140,7 +142,7 @@ void generateDEFForMember(MemberDef *md,
   if (isFunc) //function
   {
     ArgumentList *declAl = new ArgumentList;
-    LockingPtr<ArgumentList> defAl = md->argumentList();
+    ArgumentList *defAl = md->argumentList();
     stringToArgumentList(md->argsString(),declAl);
     QCString fcnPrefix = "  " + memPrefix + "param-";
 
@@ -216,7 +218,7 @@ void generateDEFForMember(MemberDef *md,
   // TODO: exceptions, const volatile
   if (md->memberType()==MemberType_Enumeration) // enum
   {
-    LockingPtr<MemberList> enumList = md->enumFieldList();
+    MemberList *enumList = md->enumFieldList();
     if (enumList!=0)
     {
       MemberListIterator emli(*enumList);
@@ -244,8 +246,8 @@ void generateDEFForMember(MemberDef *md,
 
   //printf("md->getReferencesMembers()=%p\n",md->getReferencesMembers());
 
-  LockingPtr<MemberSDict> mdict = md->getReferencesMembers();
-  if (!mdict.isNull())
+  MemberSDict *mdict = md->getReferencesMembers();
+  if (mdict)
   {
     MemberSDict::Iterator mdi(*mdict);
     MemberDef *rmd;
@@ -278,7 +280,7 @@ void generateDEFForMember(MemberDef *md,
     } /* for (mdi.toFirst...) */
   }
   mdict = md->getReferencedByMembers();
-  if (!mdict.isNull())
+  if (mdict)
   {
     MemberSDict::Iterator mdi(*mdict);
     MemberDef *rmd;
@@ -428,6 +430,8 @@ void generateDEFForClass(ClassDef *cd,FTextStream &t)
   if (numMembers>0)
   {
     generateDEFClassSection(cd,t,cd->getMemberList(MemberListType_pubTypes),"public-type");
+    generateDEFClassSection(cd,t,cd->getMemberList(MemberListType_interfaces),"interfaces");
+    generateDEFClassSection(cd,t,cd->getMemberList(MemberListType_services),"services");
     generateDEFClassSection(cd,t,cd->getMemberList(MemberListType_pubMethods),"public-func");
     generateDEFClassSection(cd,t,cd->getMemberList(MemberListType_pubAttribs),"public-attrib");
     generateDEFClassSection(cd,t,cd->getMemberList(MemberListType_pubSlots),"public-slot");
@@ -566,13 +570,13 @@ void generateDEF()
       dir.setPath(QDir::currentDirPath());
       if (!dir.mkdir(outputDirectory))
       {
-        err("error: tag OUTPUT_DIRECTORY: Output directory `%s' does not "
+        err("tag OUTPUT_DIRECTORY: Output directory `%s' does not "
             "exist and cannot be created\n",outputDirectory.data());
         exit(1);
       }
-      else if (!Config_getBool("QUIET"))
+      else
       {
-        err("notice: Output directory `%s' does not exist. "
+        msg("Notice: Output directory `%s' does not exist. "
             "I have created it for you.\n", outputDirectory.data());
       }
       dir.cd(outputDirectory);
index 5b26cd0..290a415 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index e5dd154..76a64e1 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -22,6 +22,7 @@ Define::Define()
 { 
   fileDef=0; 
   lineNr=1;
+  columnNr=1;
   nargs=-1;
   undef=FALSE; 
   varArgs=FALSE;
@@ -34,6 +35,7 @@ Define::Define(const Define &d)
 { 
   //name=d.name; definition=d.definition; fileName=d.fileName; 
   lineNr=d.lineNr; 
+  lineNr=d.columnNr;
   nargs=d.nargs; 
   undef=d.undef; 
   varArgs=d.varArgs;
index c5b5274..843ecec 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -40,6 +40,7 @@ class Define
     QCString anchor;
     FileDef *fileDef;
     int lineNr;
+    int columnNr;
     int nargs;
     bool undef;
     bool varArgs;
@@ -55,7 +56,7 @@ class DefineList : public QList<Define>
    ~DefineList() {}
     int compareItems(QCollection::Item i1,QCollection::Item i2) 
     {
-      return stricmp(((Define *)i1)->name,((Define *)i2)->name); 
+      return qstricmp(((Define *)i1)->name,((Define *)i2)->name); 
     }
 };
 
@@ -68,7 +69,7 @@ class DefineName : public QList<Define>
     const char *nameString() const { return name; }
     int compareItems(QCollection::Item i1,QCollection::Item i2) 
     {
-      return stricmp(((Define *)i1)->name,((Define *)i2)->name); 
+      return qstricmp(((Define *)i1)->name,((Define *)i2)->name); 
     }
     
   private:
@@ -83,7 +84,7 @@ class DefineNameList : public QList<DefineName>
    ~DefineNameList() {}
     int compareItems(QCollection::Item i1,QCollection::Item i2)
     {
-      return stricmp(((DefineName *)i1)->nameString(),
+      return qstricmp(((DefineName *)i1)->nameString(),
                     ((DefineName *)i2)->nameString());
     }
 };
index 2833be7..fe1afb7 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -84,6 +84,8 @@ class DefinitionImpl
     QCString defFileExt;
 
     SrcLangExt lang;
+
+    QCString id; // clang unique id
 };
 
 DefinitionImpl::DefinitionImpl() 
@@ -277,12 +279,13 @@ void Definition::removeFromMap(Definition *d)
   }
 }
 
-Definition::Definition(const char *df,int dl,
+Definition::Definition(const char *df,int dl,int dc,
                        const char *name,const char *b,
                        const char *d,bool isSymbol)
 {
   m_name = name;
   m_defLine = dl;
+  m_defColumn = dc;
   m_impl = new DefinitionImpl;
   m_impl->init(df,name);
   m_isSymbol = isSymbol;
@@ -295,7 +298,7 @@ Definition::Definition(const char *df,int dl,
   }
 }
 
-Definition::Definition(const Definition &d) : DefinitionIntf(), LockableObj()
+Definition::Definition(const Definition &d) : DefinitionIntf()
 {
   m_name = d.m_name;
   m_defLine = d.m_defLine;
@@ -393,10 +396,25 @@ void Definition::setName(const char *name)
   m_name = name;
 }
 
+void Definition::setId(const char *id)
+{
+  if (id==0) return;
+  m_impl->id = id;
+  if (Doxygen::clangUsrMap) 
+  {
+    //printf("Definition::setId '%s'->'%s'\n",id,m_name.data());
+    Doxygen::clangUsrMap->insert(id,this);
+  }
+}
+
+QCString Definition::id() const
+{
+  return m_impl->id;
+}
+
 void Definition::addSectionsToDefinition(QList<SectionInfo> *anchorList)
 {
   if (!anchorList) return;
-  makeResident();
   //printf("%s: addSectionsToDefinition(%d)\n",name().data(),anchorList->count());
   SectionInfo *si=anchorList->first();
   while (si)
@@ -425,7 +443,6 @@ void Definition::addSectionsToDefinition(QList<SectionInfo> *anchorList)
 
 bool Definition::hasSections() const
 {
-  makeResident();
   //printf("Definition::hasSections(%s) #sections=%d\n",name().data(),
   //    m_impl->sectionDict ? m_impl->sectionDict->count() : 0);
   if (m_impl->sectionDict==0) return FALSE;
@@ -446,7 +463,6 @@ bool Definition::hasSections() const
 
 void Definition::addSectionsToIndex()
 {
-  makeResident();
   if (m_impl->sectionDict==0) return;
   //printf("Definition::addSectionsToIndex()\n");
   SDict<SectionInfo>::Iterator li(*m_impl->sectionDict);
@@ -496,7 +512,6 @@ void Definition::addSectionsToIndex()
 
 void Definition::writeDocAnchorsToTagFile()
 {
-  makeResident();
   if (!Config_getString("GENERATE_TAGFILE").isEmpty() && m_impl->sectionDict)
   {
     //printf("%s: writeDocAnchorsToTagFile(%d)\n",name().data(),m_sectionDict->count());
@@ -590,7 +605,6 @@ void Definition::_setDocumentation(const char *d,const char *docFile,int docLine
 void Definition::setDocumentation(const char *d,const char *docFile,int docLine,bool stripWhiteSpace)
 {
   if (d==0) return;
-  makeResident();
   _setDocumentation(d,docFile,docLine,stripWhiteSpace,FALSE);
 }
 
@@ -659,7 +673,6 @@ void Definition::_setBriefDescription(const char *b,const char *briefFile,int br
 void Definition::setBriefDescription(const char *b,const char *briefFile,int briefLine) 
 { 
   if (b==0) return;
-  makeResident();
   _setBriefDescription(b,briefFile,briefLine);
 }
 
@@ -684,7 +697,6 @@ void Definition::_setInbodyDocumentation(const char *doc,const char *inbodyFile,
 void Definition::setInbodyDocumentation(const char *d,const char *inbodyFile,int inbodyLine)
 {
   if (d==0) return;
-  makeResident();
   _setInbodyDocumentation(d,inbodyFile,inbodyLine);
 }
 
@@ -797,12 +809,12 @@ bool readCodeFragment(const char *fileName,
         }
         // copy until end of line
         result+=c;
+        startLine=lineNr;
         if (c==':') 
         {
           result+=cn;
           if (cn=='\n') lineNr++;
         }
-        startLine=lineNr;
         const int maxLineLength=4096;
         char lineStr[maxLineLength];
         do 
@@ -851,6 +863,7 @@ bool readCodeFragment(const char *fileName,
     }
   }
   result = transcodeCharacterStringToUTF8(result);
+  //fprintf(stderr,"readCodeFragement(%d-%d)=%s\n",startLine,endLine,result.data());
   return found;
 }
 
@@ -859,7 +872,6 @@ void Definition::writeSourceDef(OutputList &ol,const char *)
 {
   static bool sourceBrowser = Config_getBool("SOURCE_BROWSER");
   static bool latexSourceCode = Config_getBool("LATEX_SOURCE_CODE");
-  makeResident();
   ol.pushGeneratorState();
   //printf("Definition::writeSourceRef %d %p\n",bodyLine,bodyDef);
   if (sourceBrowser && 
@@ -983,7 +995,7 @@ void Definition::writeSourceDef(OutputList &ol,const char *)
     }
     else
     {
-      err("error: translation error: invalid markers in trDefinedInSourceFile()\n");
+      err("translation error: invalid markers in trDefinedInSourceFile()\n");
     }
   }
   ol.popGeneratorState();
@@ -992,7 +1004,6 @@ void Definition::writeSourceDef(OutputList &ol,const char *)
 void Definition::setBodySegment(int bls,int ble) 
 {
   //printf("setBodySegment(%d,%d) for %s\n",bls,ble,name().data());
-  makeResident();
   if (m_impl->body==0) m_impl->body = new BodyInfo;
   m_impl->body->startLine=bls; 
   m_impl->body->endLine=ble; 
@@ -1000,7 +1011,6 @@ void Definition::setBodySegment(int bls,int ble)
 
 void Definition::setBodyDef(FileDef *fd)         
 {
-  makeResident();
   if (m_impl->body==0) m_impl->body = new BodyInfo;
   m_impl->body->fileDef=fd; 
 }
@@ -1008,11 +1018,11 @@ void Definition::setBodyDef(FileDef *fd)
 /*! Write code of this definition into the documentation */
 void Definition::writeInlineCode(OutputList &ol,const char *scopeName)
 {
-  makeResident();
+  static bool inlineSources = Config_getBool("INLINE_SOURCES");
   ol.pushGeneratorState();
   //printf("Source Fragment %s: %d-%d bodyDef=%p\n",name().data(),
   //        m_startBodyLine,m_endBodyLine,m_bodyDef);
-  if (Config_getBool("INLINE_SOURCES") && 
+  if (inlineSources && 
       m_impl->body && m_impl->body->startLine!=-1 && 
       m_impl->body->endLine>=m_impl->body->startLine && m_impl->body->fileDef)
   {
@@ -1030,13 +1040,6 @@ void Definition::writeInlineCode(OutputList &ol,const char *scopeName)
       MemberDef *thisMd = 0;
       if (definitionType()==TypeMember) thisMd = (MemberDef *)this;
 
-      // vhdl  parser can' t start at an arbitrary point in the source code
-      if(this->getLanguage()==SrcLangExt_VHDL)
-      {
-        if (thisMd) VhdlDocGen::writeCodeFragment(ol,actualStart,codeFragment,thisMd);
-        return;
-      }
-
       ol.startCodeFragment();
       pIntf->parseCode(ol,               // codeOutIntf
                        scopeName,        // scope
@@ -1048,7 +1051,7 @@ void Definition::writeInlineCode(OutputList &ol,const char *scopeName)
                        actualEnd,        // endLine
                        TRUE,             // inlineFragment
                        thisMd,           // memberDef
-                       FALSE             // show line numbers
+                       TRUE              // show line numbers
                       );
       ol.endCodeFragment();
     }
@@ -1062,9 +1065,6 @@ void Definition::writeInlineCode(OutputList &ol,const char *scopeName)
 void Definition::_writeSourceRefList(OutputList &ol,const char *scopeName,
     const QCString &text,MemberSDict *members,bool /*funcOnly*/)
 {
-  LockingPtr<Definition> lock(this,this); // since this can be a memberDef 
-                                          // accessing other memberDefs prevent
-                                          // it from being flushed to disk
   static bool latexSourceCode = Config_getBool("LATEX_SOURCE_CODE"); 
   static bool sourceBrowser   = Config_getBool("SOURCE_BROWSER");
   static bool refLinkSource   = Config_getBool("REFERENCES_LINK_SOURCE");
@@ -1183,7 +1183,6 @@ void Definition::_writeSourceRefList(OutputList &ol,const char *scopeName,
 
 void Definition::writeSourceReffedBy(OutputList &ol,const char *scopeName)
 {
-  makeResident();
   if (Config_getBool("REFERENCED_BY_RELATION"))
   {
     _writeSourceRefList(ol,scopeName,theTranslator->trReferencedBy(),m_impl->sourceRefByDict,FALSE);
@@ -1192,7 +1191,6 @@ void Definition::writeSourceReffedBy(OutputList &ol,const char *scopeName)
 
 void Definition::writeSourceRefs(OutputList &ol,const char *scopeName)
 {
-  makeResident();
   if (Config_getBool("REFERENCES_RELATION"))
   {
     _writeSourceRefList(ol,scopeName,theTranslator->trReferences(),m_impl->sourceRefsDict,TRUE);
@@ -1203,7 +1201,6 @@ bool Definition::hasDocumentation() const
 { 
   static bool extractAll    = Config_getBool("EXTRACT_ALL"); 
   //static bool sourceBrowser = Config_getBool("SOURCE_BROWSER");
-  makeResident();
   bool hasDocs = 
          (m_impl->details    && !m_impl->details->doc.isEmpty())    || // has detailed docs
          (m_impl->brief      && !m_impl->brief->doc.isEmpty())      || // has brief description
@@ -1217,7 +1214,6 @@ bool Definition::hasDocumentation() const
 
 bool Definition::hasUserDocumentation() const
 {
-  makeResident();
   bool hasDocs = 
          (m_impl->details    && !m_impl->details->doc.isEmpty()) ||
          (m_impl->brief      && !m_impl->brief->doc.isEmpty())   ||
@@ -1225,11 +1221,11 @@ bool Definition::hasUserDocumentation() const
   return hasDocs;
 }
 
+
 void Definition::addSourceReferencedBy(MemberDef *md)
 {
   if (md)
   {
-    makeResident();
     QCString name  = md->name();
     QCString scope = md->getScopeString();
 
@@ -1251,11 +1247,13 @@ void Definition::addSourceReferencedBy(MemberDef *md)
 
 void Definition::addSourceReferences(MemberDef *md)
 {
+  QCString name  = md->name();
+  QCString scope = md->getScopeString();
+
   if (md)
   {
     QCString name  = md->name();
     QCString scope = md->getScopeString();
-    makeResident();
 
     if (!scope.isEmpty())
     {
@@ -1280,14 +1278,13 @@ Definition *Definition::findInnerCompound(const char *)
 
 void Definition::addInnerCompound(Definition *)
 {
-  err("error: Definition::addInnerCompound() called\n");
+  err("Definition::addInnerCompound() called\n");
 }
 
 QCString Definition::qualifiedName() const
 {
   //static int count=0;
   //count++;
-  makeResident();
   if (!m_impl->qualifiedName.isEmpty()) 
   {
     //count--;
@@ -1326,7 +1323,6 @@ QCString Definition::qualifiedName() const
 
 void Definition::setOuterScope(Definition *d) 
 {
-  makeResident();
   //printf("%s::setOuterScope(%s)\n",name().data(),d?d->name().data():"<none>");
   if (m_impl->outerScope!=d)
   { 
@@ -1338,13 +1334,11 @@ void Definition::setOuterScope(Definition *d)
 
 QCString Definition::localName() const
 {
-  makeResident();
   return m_impl->localName;
 }
 
 void Definition::makePartOfGroup(GroupDef *gd)
 {
-  makeResident();
   if (m_impl->partOfGroups==0) m_impl->partOfGroups = new GroupList;
   m_impl->partOfGroups->append(gd);
 }
@@ -1354,7 +1348,6 @@ void Definition::setRefItems(const QList<ListItemInfo> *sli)
   //printf("%s::setRefItems()\n",name().data());
   if (sli)
   {
-    makeResident();
     // deep copy the list
     if (m_impl->xrefListItems==0) 
     {
@@ -1373,10 +1366,9 @@ void Definition::setRefItems(const QList<ListItemInfo> *sli)
 void Definition::mergeRefItems(Definition *d)
 {
   //printf("%s::mergeRefItems()\n",name().data());
-  LockingPtr< QList<ListItemInfo> > xrefList = d->xrefListItems();
+  QList<ListItemInfo> *xrefList = d->xrefListItems();
   if (xrefList!=0)
   {
-    makeResident();
     // deep copy the list
     if (m_impl->xrefListItems==0) 
     {
@@ -1397,14 +1389,13 @@ void Definition::mergeRefItems(Definition *d)
 
 int Definition::_getXRefListId(const char *listName) const
 {
-  makeResident();
   if (m_impl->xrefListItems)
   {
     QListIterator<ListItemInfo> slii(*m_impl->xrefListItems);
     ListItemInfo *lii;
     for (slii.toFirst();(lii=slii.current());++slii)
     {
-      if (strcmp(lii->type,listName)==0)
+      if (qstrcmp(lii->type,listName)==0)
       {
         return lii->itemId;
       }
@@ -1413,16 +1404,14 @@ int Definition::_getXRefListId(const char *listName) const
   return -1;
 }
 
-LockingPtr< QList<ListItemInfo> > Definition::xrefListItems() const
+QList<ListItemInfo> *Definition::xrefListItems() const
 {
-  makeResident();
-  return LockingPtr< QList<ListItemInfo> >(this,m_impl->xrefListItems);
+  return m_impl->xrefListItems;
 }
 
 
 QCString Definition::convertNameToFile(const char *name,bool allowDots) const
 {
-  makeResident();
   if (!m_impl->ref.isEmpty())
   {
     return name;
@@ -1435,7 +1424,6 @@ QCString Definition::convertNameToFile(const char *name,bool allowDots) const
 
 QCString Definition::pathFragment() const
 {
-  makeResident();
   QCString result;
   if (m_impl->outerScope && m_impl->outerScope!=Doxygen::globalScope)
   {
@@ -1472,7 +1460,6 @@ QCString Definition::pathFragment() const
  */
 QCString Definition::navigationPathAsString() const
 {
-  makeResident();
   QCString result;
   Definition *outerScope = getOuterScope();
   QCString locName = localName();
@@ -1489,12 +1476,12 @@ QCString Definition::navigationPathAsString() const
   {
     if (definitionType()==Definition::TypeGroup && ((const GroupDef*)this)->groupTitle())
     {
-      result+="<a class=\"el\" href=\"$relpath$"+getOutputFileBase()+Doxygen::htmlFileExtension+"\">"+
+      result+="<a class=\"el\" href=\"$relpath^"+getOutputFileBase()+Doxygen::htmlFileExtension+"\">"+
               ((const GroupDef*)this)->groupTitle()+"</a>";
     }
     else if (definitionType()==Definition::TypePage && !((const PageDef*)this)->title().isEmpty())
     {
-      result+="<a class=\"el\" href=\"$relpath$"+getOutputFileBase()+Doxygen::htmlFileExtension+"\">"+
+      result+="<a class=\"el\" href=\"$relpath^"+getOutputFileBase()+Doxygen::htmlFileExtension+"\">"+
               ((const PageDef*)this)->title()+"</a>";
     }
     else if (definitionType()==Definition::TypeClass)
@@ -1504,13 +1491,13 @@ QCString Definition::navigationPathAsString() const
       {
         name = name.left(name.length()-2);
       }
-      result+="<a class=\"el\" href=\"$relpath$"+getOutputFileBase()+Doxygen::htmlFileExtension;
+      result+="<a class=\"el\" href=\"$relpath^"+getOutputFileBase()+Doxygen::htmlFileExtension;
       if (!anchor().isEmpty()) result+="#"+anchor();
       result+="\">"+name+"</a>";
     }
     else
     {
-      result+="<a class=\"el\" href=\"$relpath$"+getOutputFileBase()+Doxygen::htmlFileExtension+"\">"+
+      result+="<a class=\"el\" href=\"$relpath^"+getOutputFileBase()+Doxygen::htmlFileExtension+"\">"+
               locName+"</a>";
     }
   }
@@ -1542,7 +1529,6 @@ void Definition::writeNavigationPath(OutputList &ol) const
 // TODO: move to htmlgen
 void Definition::writeToc(OutputList &ol)
 {
-  makeResident();
   SectionDict *sectionDict = m_impl->sectionDict;
   if (sectionDict==0) return;
   ol.pushGeneratorState();
@@ -1616,19 +1602,16 @@ QCString Definition::symbolName() const
 
 QCString Definition::documentation() const 
 { 
-  makeResident();
   return m_impl->details ? m_impl->details->doc : QCString(""); 
 }
 
 int Definition::docLine() const 
 { 
-  makeResident();
   return m_impl->details ? m_impl->details->line : 1; 
 }
 
 QCString Definition::docFile() const 
 { 
-  makeResident();
   return m_impl->details ? m_impl->details->file : QCString("<"+m_name+">"); 
 }
 
@@ -1685,7 +1668,6 @@ QCString abbreviate(const char *s,const char *name)
 
 QCString Definition::briefDescription(bool abbr) const 
 { 
-  makeResident();
   return m_impl->brief ? 
          (abbr ? abbreviate(m_impl->brief->doc,displayName()) : m_impl->brief->doc) :
          QCString(""); 
@@ -1693,10 +1675,6 @@ QCString Definition::briefDescription(bool abbr) const
 
 QCString Definition::briefDescriptionAsTooltip() const
 {
-  makeResident();
-  LockingPtr<Definition> lock(this,this); // since this can be a memberDef 
-                                          // accessing other memberDefs prevent
-                                          // it from being flushed to disk
   if (m_impl->brief)
   {
     if (m_impl->brief->tooltip.isEmpty() && !m_impl->brief->doc.isEmpty())
@@ -1722,13 +1700,11 @@ QCString Definition::briefDescriptionAsTooltip() const
 
 int Definition::briefLine() const 
 { 
-  makeResident();
   return m_impl->brief ? m_impl->brief->line : 1; 
 }
 
 QCString Definition::briefFile() const 
 { 
-  makeResident();
   return m_impl->brief ? m_impl->brief->file : QCString("<"+m_name+">"); 
 }
 
@@ -1736,19 +1712,16 @@ QCString Definition::briefFile() const
 
 QCString Definition::inbodyDocumentation() const
 {
-  makeResident();
   return m_impl->inbodyDocs ? m_impl->inbodyDocs->doc : QCString(""); 
 }
 
 int Definition::inbodyLine() const 
 { 
-  makeResident();
   return m_impl->inbodyDocs ? m_impl->inbodyDocs->line : 1; 
 }
 
 QCString Definition::inbodyFile() const 
 { 
-  makeResident();
   return m_impl->inbodyDocs ? m_impl->inbodyDocs->file : QCString("<"+m_name+">"); 
 }
 
@@ -1757,19 +1730,16 @@ QCString Definition::inbodyFile() const
 
 QCString Definition::getDefFileName() const 
 { 
-  makeResident();
   return m_impl->defFileName; 
 }
 
 QCString Definition::getDefFileExtension() const 
 { 
-  makeResident();
   return m_impl->defFileExt; 
 }
 
 bool Definition::isHidden() const
 {
-  makeResident();
   return m_impl->hidden;
 }
 
@@ -1790,91 +1760,76 @@ bool Definition::isArtificial() const
 
 QCString Definition::getReference() const 
 { 
-  makeResident();
   return m_impl->ref; 
 }
 
 bool Definition::isReference() const 
 { 
-  makeResident();
   return !m_impl->ref.isEmpty(); 
 }
 
 int Definition::getStartBodyLine() const         
 { 
-  makeResident();
   return m_impl->body ? m_impl->body->startLine : -1; 
 }
 
 int Definition::getEndBodyLine() const           
 { 
-  makeResident();
   return m_impl->body ? m_impl->body->endLine : -1; 
 }
 
 FileDef *Definition::getBodyDef()                
 { 
-  makeResident();
   return m_impl->body ? m_impl->body->fileDef : 0; 
 }
 
-LockingPtr<GroupList> Definition::partOfGroups() const 
+GroupList *Definition::partOfGroups() const 
 { 
-  makeResident();
-  return LockingPtr<GroupList>(this,m_impl->partOfGroups); 
+  return m_impl->partOfGroups; 
 }
 
 Definition *Definition::getOuterScope() const 
 { 
-  makeResident();
   return m_impl->outerScope; 
 }
 
-LockingPtr<MemberSDict> Definition::getReferencesMembers() const 
+MemberSDict *Definition::getReferencesMembers() const 
 { 
-  makeResident();
-  return LockingPtr<MemberSDict>(this,m_impl->sourceRefsDict); 
+  return m_impl->sourceRefsDict; 
 }
 
-LockingPtr<MemberSDict> Definition::getReferencedByMembers() const 
+MemberSDict *Definition::getReferencedByMembers() const 
 { 
-  makeResident();
-  return LockingPtr<MemberSDict>(this,m_impl->sourceRefByDict); 
+  return m_impl->sourceRefByDict; 
 }
 
 void Definition::setReference(const char *r) 
 { 
-  makeResident();
   m_impl->ref=r; 
 }
 
 SrcLangExt Definition::getLanguage() const
 {
-  makeResident();
   return m_impl->lang;
 }
 
 void Definition::setHidden(bool b) 
 { 
-  makeResident();
   m_impl->hidden = m_impl->hidden || b; 
 }
 
 void Definition::setArtificial(bool b)
 {
-  makeResident();
   m_impl->isArtificial = b;
 }
 
 void Definition::setLocalName(const QCString name) 
 { 
-  makeResident();
   m_impl->localName=name; 
 }
 
 void Definition::setLanguage(SrcLangExt lang) 
 { 
-  makeResident();
   m_impl->lang=lang; 
 }
 
@@ -1884,70 +1839,4 @@ void Definition::_setSymbolName(const QCString &name)
   m_symbolName=name; 
 }
 
-//---------------
-
-void Definition::makeResident() const
-{
-}
-
-void Definition::flushToDisk() const
-{
-  //printf("%p: Definition::flushToDisk()\n",this);
-  Definition *that = (Definition *)this;
-  //printf("Definition::flushToDisk(): pos=%d\n",(int)m_storagePos); 
-  marshalUInt(Doxygen::symbolStorage,START_MARKER);
-  marshalSectionDict  (Doxygen::symbolStorage,m_impl->sectionDict);
-  marshalMemberSDict  (Doxygen::symbolStorage,m_impl->sourceRefByDict);
-  marshalMemberSDict  (Doxygen::symbolStorage,m_impl->sourceRefsDict);
-  marshalItemInfoList (Doxygen::symbolStorage,m_impl->xrefListItems);
-  marshalGroupList    (Doxygen::symbolStorage,m_impl->partOfGroups);
-  marshalDocInfo      (Doxygen::symbolStorage,m_impl->details);
-  marshalDocInfo      (Doxygen::symbolStorage,m_impl->inbodyDocs);
-  marshalBriefInfo    (Doxygen::symbolStorage,m_impl->brief);
-  marshalBodyInfo     (Doxygen::symbolStorage,m_impl->body);
-  marshalQCString     (Doxygen::symbolStorage,m_impl->docSignatures);
-  marshalQCString     (Doxygen::symbolStorage,m_impl->localName);
-  marshalQCString     (Doxygen::symbolStorage,m_impl->qualifiedName);
-  marshalQCString     (Doxygen::symbolStorage,m_impl->ref);
-  marshalBool         (Doxygen::symbolStorage,m_impl->hidden);
-  marshalBool         (Doxygen::symbolStorage,m_impl->isArtificial);
-  marshalObjPointer   (Doxygen::symbolStorage,m_impl->outerScope);
-  marshalQCString     (Doxygen::symbolStorage,m_impl->defFileName);
-  marshalQCString     (Doxygen::symbolStorage,m_impl->defFileExt);
-  marshalInt          (Doxygen::symbolStorage,(int)m_impl->lang);
-  marshalUInt(Doxygen::symbolStorage,END_MARKER);
-  delete that->m_impl;
-  that->m_impl = 0;
-}
-
-void Definition::loadFromDisk() const
-{
-  //printf("%p: Definition::loadFromDisk()\n",this);
-  Definition *that = (Definition *)this;
-  assert(m_impl==0);
-  that->m_impl = new DefinitionImpl;
-  uint marker = unmarshalUInt(Doxygen::symbolStorage);
-  assert(marker==START_MARKER);
-  m_impl->sectionDict     = unmarshalSectionDict  (Doxygen::symbolStorage);
-  m_impl->sourceRefByDict = unmarshalMemberSDict  (Doxygen::symbolStorage);
-  m_impl->sourceRefsDict  = unmarshalMemberSDict  (Doxygen::symbolStorage);
-  m_impl->xrefListItems   = unmarshalItemInfoList (Doxygen::symbolStorage);
-  m_impl->partOfGroups    = unmarshalGroupList    (Doxygen::symbolStorage);
-  m_impl->details         = unmarshalDocInfo      (Doxygen::symbolStorage);
-  m_impl->inbodyDocs      = unmarshalDocInfo      (Doxygen::symbolStorage);
-  m_impl->brief           = unmarshalBriefInfo    (Doxygen::symbolStorage);
-  m_impl->body            = unmarshalBodyInfo     (Doxygen::symbolStorage);
-  m_impl->docSignatures   = unmarshalQCString     (Doxygen::symbolStorage);
-  m_impl->localName       = unmarshalQCString     (Doxygen::symbolStorage);
-  m_impl->qualifiedName   = unmarshalQCString     (Doxygen::symbolStorage);
-  m_impl->ref             = unmarshalQCString     (Doxygen::symbolStorage);
-  m_impl->hidden          = unmarshalBool         (Doxygen::symbolStorage);
-  m_impl->isArtificial    = unmarshalBool         (Doxygen::symbolStorage);
-  m_impl->outerScope      = (Definition *)unmarshalObjPointer   (Doxygen::symbolStorage);
-  m_impl->defFileName     = unmarshalQCString     (Doxygen::symbolStorage);
-  m_impl->defFileExt      = unmarshalQCString     (Doxygen::symbolStorage);
-  m_impl->lang            = (SrcLangExt)unmarshalInt(Doxygen::symbolStorage);
-  marker = unmarshalUInt(Doxygen::symbolStorage);
-  assert(marker==END_MARKER);
-}
 
index 9d80431..74a801f 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -22,7 +22,6 @@
 #include <qdict.h>
 
 #include "types.h"
-#include "lockingptr.h"
 
 class FileDef;
 class OutputList;
@@ -89,13 +88,13 @@ class DefinitionIntf
  *  This can be a class or a member function, or a file, or a namespace, etc.
  *  Use definitionType() to find which type of definition this is.
  */
-class Definition : public DefinitionIntf, public LockableObj
+class Definition : public DefinitionIntf
 {
   public:
     
     /*! Create a new definition */
     Definition(
-        const char *defFileName,int defLine,
+        const char *defFileName,int defLine,int defColumn,
         const char *name,const char *b=0,const char *d=0,
         bool isSymbol=TRUE);
 
@@ -180,6 +179,9 @@ class Definition : public DefinitionIntf, public LockableObj
     /*! returns the line number at which the definition was found */
     int getDefLine() const { return m_defLine; }
 
+    /*! returns the column number at which the definition was found */
+    int getDefColumn() const { return m_defColumn; }
+
     /*! Returns TRUE iff the definition is documented 
      *  (which could be generated documentation) 
      *  @see hasUserDocumentation()
@@ -243,18 +245,20 @@ class Definition : public DefinitionIntf, public LockableObj
     /** Returns the programming language this definition was written in. */
     SrcLangExt getLanguage() const;
 
-    LockingPtr<GroupList> partOfGroups() const;
+    GroupList *partOfGroups() const;
 
-    LockingPtr< QList<ListItemInfo> > xrefListItems() const;
+    QList<ListItemInfo> *xrefListItems() const;
 
     virtual Definition *findInnerCompound(const char *name);
     virtual Definition *getOuterScope() const;
 
-    LockingPtr<MemberSDict> getReferencesMembers() const;
-    LockingPtr<MemberSDict> getReferencedByMembers() const;
+    MemberSDict *getReferencesMembers() const;
+    MemberSDict *getReferencedByMembers() const;
 
     bool hasSections() const;
 
+    QCString id() const;
+
     //-----------------------------------------------------------------------------------
     // ----  setters -----
     //-----------------------------------------------------------------------------------
@@ -262,6 +266,9 @@ class Definition : public DefinitionIntf, public LockableObj
     /*! Sets a new \a name for the definition */
     void setName(const char *name);
 
+    /*! Sets a unique id for the symbol. Used for libclang integration. */
+    void setId(const char *name);
+
     /*! Sets the documentation of this definition to \a d. */
     virtual void setDocumentation(const char *d,const char *docFile,int docLine,bool stripWhiteSpace=TRUE);
 
@@ -328,12 +335,6 @@ class Definition : public DefinitionIntf, public LockableObj
 
   protected:
 
-    virtual void flushToDisk() const;
-    virtual void loadFromDisk() const;
-    virtual void makeResident() const;
-    void lock() const {}
-    void unlock() const {}
-
     Definition(const Definition &d);
 
   private: 
@@ -354,6 +355,7 @@ class Definition : public DefinitionIntf, public LockableObj
     bool m_isSymbol;
     QCString m_symbolName;
     int m_defLine;
+    int m_defColumn;
 };
 
 /** A list of Definition objects. */
@@ -364,7 +366,7 @@ class DefinitionList : public QList<Definition>, public DefinitionIntf
     DefType definitionType() const { return TypeSymbolList; }
     int compareItems(QCollection::Item item1,QCollection::Item item2)
     {
-      return stricmp(((Definition *)item1)->name(),
+      return qstricmp(((Definition *)item1)->name(),
                      ((Definition *)item2)->name()
                     );
     }
index 78b9364..80d0646 100644 (file)
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -1363,7 +1363,7 @@ void ClassDiagram::writeFigure(FTextStream &output,const char *path,
     portable_sysTimerStart();
     if (portable_system("epstopdf",epstopdfArgs)!=0)
     {
-       err("error: Problems running epstopdf. Check your TeX installation!\n");
+       err("Problems running epstopdf. Check your TeX installation!\n");
        portable_sysTimerStop();
        return;
     }
index 63481cd..62cab2e 100644 (file)
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -19,6 +19,8 @@
 #ifndef DIAGRAM_H
 #define DIAGRAM_H
 
+#include <qglobal.h>
+
 class ClassDef;
 class TreeDiagram;
 class FTextStream;
index 6565393..fe6e47d 100644 (file)
 #include "layout.h"
 #include "ftextstream.h"
 #include "config.h"
+#include "docparser.h"
 
 //----------------------------------------------------------------------
 // method implementation
 
 static int g_dirCount=0;
 
-DirDef::DirDef(const char *path) : Definition(path,1,path)
+DirDef::DirDef(const char *path) : Definition(path,1,1,path)
 {
   bool fullPathNames = Config_getBool("FULL_PATH_NAMES");
   // get display name (stipping the paths mentioned in STRIP_FROM_PATH)
@@ -137,7 +138,7 @@ void DirDef::writeDetailedDescription(OutputList &ol,const QCString &title)
     // repeat brief description
     if (!briefDescription().isEmpty() && Config_getBool("REPEAT_BRIEF"))
     {
-      ol.parseDoc(briefFile(),briefLine(),this,0,briefDescription(),FALSE,FALSE);
+      ol.generateDoc(briefFile(),briefLine(),this,0,briefDescription(),FALSE,FALSE);
     }
     // separator between brief and details
     if (!briefDescription().isEmpty() && Config_getBool("REPEAT_BRIEF") && 
@@ -156,7 +157,7 @@ void DirDef::writeDetailedDescription(OutputList &ol,const QCString &title)
     // write documentation
     if (!documentation().isEmpty())
     {
-      ol.parseDoc(docFile(),docLine(),this,0,documentation()+"\n",TRUE,FALSE);
+      ol.generateDoc(docFile(),docLine(),this,0,documentation()+"\n",TRUE,FALSE);
     }
   }
 }
@@ -165,29 +166,31 @@ void DirDef::writeBriefDescription(OutputList &ol)
 {
   if (!briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC"))
   {
-    ol.startParagraph();
-    ol.parseDoc(briefFile(),briefLine(),this,0,briefDescription(),TRUE,FALSE);
-    ol.pushGeneratorState();
-    ol.disable(OutputGenerator::RTF);
-    ol.writeString(" \n");
-    ol.enable(OutputGenerator::RTF);
-
-    if (Config_getBool("REPEAT_BRIEF") ||
-        !documentation().isEmpty()
-       )
+    DocRoot *rootNode = validatingParseDoc(
+         briefFile(),briefLine(),this,0,briefDescription(),TRUE,FALSE);
+    if (rootNode && !rootNode->isEmpty())
     {
-      ol.disableAllBut(OutputGenerator::Html);
-      ol.startTextLink(0,"details");
-      ol.parseText(theTranslator->trMore());
-      ol.endTextLink();
-    }
-    ol.popGeneratorState();
+      ol.startParagraph();
+      ol.writeDoc(rootNode,this,0);
+      ol.pushGeneratorState();
+      ol.disable(OutputGenerator::RTF);
+      ol.writeString(" \n");
+      ol.enable(OutputGenerator::RTF);
 
-    //ol.pushGeneratorState();
-    //ol.disable(OutputGenerator::RTF);
-    //ol.newParagraph();
-    //ol.popGeneratorState();
-    ol.endParagraph();
+      if (Config_getBool("REPEAT_BRIEF") ||
+          !documentation().isEmpty()
+         )
+      {
+        ol.disableAllBut(OutputGenerator::Html);
+        ol.startTextLink(0,"details");
+        ol.parseText(theTranslator->trMore());
+        ol.endTextLink();
+      }
+      ol.popGeneratorState();
+
+      ol.endParagraph();
+    }
+    delete rootNode;
   }
   ol.writeSynopsis();
 }
@@ -237,7 +240,7 @@ void DirDef::writeSubDirList(OutputList &ol)
       if (!dd->briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC"))
       {
         ol.startMemberDescription(dd->getOutputFileBase());
-        ol.parseDoc(briefFile(),briefLine(),dd,0,dd->briefDescription(),
+        ol.generateDoc(briefFile(),briefLine(),dd,0,dd->briefDescription(),
             FALSE, // indexWords
             FALSE, // isExample
             0,     // exampleName
@@ -300,7 +303,7 @@ void DirDef::writeFileList(OutputList &ol)
       if (!fd->briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC"))
       {
         ol.startMemberDescription(fd->getOutputFileBase());
-        ol.parseDoc(briefFile(),briefLine(),fd,0,fd->briefDescription(),
+        ol.generateDoc(briefFile(),briefLine(),fd,0,fd->briefDescription(),
             FALSE, // indexWords
             FALSE, // isExample
             0,     // exampleName
@@ -403,10 +406,12 @@ void DirDef::writeDocumentation(OutputList &ol)
       case LayoutDocEntry::ClassAllMembersLink:
       case LayoutDocEntry::ClassUsedFiles:
       case LayoutDocEntry::NamespaceNestedNamespaces:
+      case LayoutDocEntry::NamespaceNestedConstantGroups:
       case LayoutDocEntry::NamespaceClasses:
       case LayoutDocEntry::NamespaceInlineClasses:
       case LayoutDocEntry::FileClasses:
       case LayoutDocEntry::FileNamespaces:
+      case LayoutDocEntry::FileConstantGroups:
       case LayoutDocEntry::FileIncludes:
       case LayoutDocEntry::FileIncludeGraph:
       case LayoutDocEntry::FileIncludedByGraph: 
@@ -579,8 +584,8 @@ int FilePairDict::compareItems(QCollection::Item item1,QCollection::Item item2)
 {
   FilePair *left  = (FilePair*)item1;
   FilePair *right = (FilePair*)item2;
-  int orderHi = stricmp(left->source()->name(),right->source()->name());
-  int orderLo = stricmp(left->destination()->name(),right->destination()->name());
+  int orderHi = qstricmp(left->source()->name(),right->source()->name());
+  int orderLo = qstricmp(left->destination()->name(),right->destination()->name());
   return orderHi==0 ? orderLo : orderHi;
 }
 
@@ -629,7 +634,7 @@ bool DirDef::matchPath(const QCString &path,QStrList &l)
   while (s)
   {
     QCString prefix = s;
-    if (stricmp(prefix.left(path.length()),path)==0) // case insensitive compare
+    if (qstricmp(prefix.left(path.length()),path)==0) // case insensitive compare
     {
       return TRUE;
     }
@@ -785,7 +790,7 @@ static void computeCommonDirPrefix()
           QCString dirName = dir->name();
           if (dirName.length()>path.length())
           {
-            if (strncmp(dirName,path,l)!=0) // dirName does not start with path
+            if (qstrncmp(dirName,path,l)!=0) // dirName does not start with path
             {
               int i=path.findRev('/',l-2);
               if (i==-1) // no unique prefix -> stop
index a94f979..99e2137 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -161,7 +161,7 @@ class DirRelation
 
 inline int DirList::compareItems(QCollection::Item item1,QCollection::Item item2)
 {
-  return stricmp(((DirDef *)item1)->shortName(),((DirDef *)item2)->shortName());
+  return qstricmp(((DirDef *)item1)->shortName(),((DirDef *)item2)->shortName());
 }
 
 /** A sorted dictionary of DirDef objects. */
@@ -171,7 +171,7 @@ class DirSDict : public SDict<DirDef>
     DirSDict(int size) : SDict<DirDef>(size) {}
     int compareItems(QCollection::Item item1,QCollection::Item item2)
     {
-      return stricmp(((DirDef *)item1)->shortName(),((DirDef *)item2)->shortName());
+      return qstricmp(((DirDef *)item1)->shortName(),((DirDef *)item2)->shortName());
     }
 };
 
diff --git a/src/docbookgen.cpp b/src/docbookgen.cpp
new file mode 100644 (file)
index 0000000..5726b3e
--- /dev/null
@@ -0,0 +1,1904 @@
+/******************************************************************************
+*
+* 
+*
+* Copyright (C) 1997-2012 by Dimitri van Heesch.
+*
+* Permission to use, copy, modify, and distribute this software and its
+* documentation under the terms of the GNU General Public License is hereby
+* granted. No representations are made about the suitability of this software
+* for any purpose. It is provided "as is" without express or implied warranty.
+* See the GNU General Public License for more details.
+*
+* Documents produced by Doxygen are derivative works derived from the
+* input used in their production; they are not affected by this license.
+*
+*/
+
+#include <stdlib.h>
+
+#include <qdir.h>
+#include <qfile.h>
+#include <qtextstream.h>
+#include <qintdict.h>
+#include "docbookgen.h"
+#include "doxygen.h"
+#include "message.h"
+#include "config.h"
+#include "classlist.h"
+#include "util.h"
+#include "defargs.h"
+#include "outputgen.h"
+#include "dot.h"
+#include "pagedef.h"
+#include "filename.h"
+#include "version.h"
+#include "docbookvisitor.h"
+#include "docparser.h"
+#include "language.h"
+#include "parserintf.h"
+#include "arguments.h"
+#include "memberlist.h"
+#include "groupdef.h"
+#include "memberdef.h"
+#include "namespacedef.h"
+#include "membername.h"
+#include "membergroup.h"
+#include "dirdef.h"
+#include "section.h"
+
+// no debug info
+#define Docbook_DB(x) do {} while(0)
+// debug to stdout
+//#define Docbook_DB(x) printf x
+// debug inside output
+//#define Docbook_DB(x) QCString __t;__t.sprintf x;m_t << __t
+
+//------------------
+
+static const char index_xsd[] =
+#include "index_xsd.h"
+;
+
+//------------------
+//
+static const char compound_xsd[] =
+#include "compound_xsd.h"
+;
+
+//------------------
+
+class DocbookSectionMapper : public QIntDict<char>
+{
+  public:
+    DocbookSectionMapper() : QIntDict<char>(47)
+  {
+    insert(MemberListType_pubTypes,"public-type");
+    insert(MemberListType_pubMethods,"public-func");
+    insert(MemberListType_pubAttribs,"public-attrib");
+    insert(MemberListType_pubSlots,"public-slot");
+    insert(MemberListType_signals,"signal");
+    insert(MemberListType_dcopMethods,"dcop-func");
+    insert(MemberListType_properties,"property");
+    insert(MemberListType_events,"event");
+    insert(MemberListType_pubStaticMethods,"public-static-func");
+    insert(MemberListType_pubStaticAttribs,"public-static-attrib");
+    insert(MemberListType_proTypes,"protected-type");
+    insert(MemberListType_proMethods,"protected-func");
+    insert(MemberListType_proAttribs,"protected-attrib");
+    insert(MemberListType_proSlots,"protected-slot");
+    insert(MemberListType_proStaticMethods,"protected-static-func");
+    insert(MemberListType_proStaticAttribs,"protected-static-attrib");
+    insert(MemberListType_pacTypes,"package-type");
+    insert(MemberListType_pacMethods,"package-func");
+    insert(MemberListType_pacAttribs,"package-attrib");
+    insert(MemberListType_pacStaticMethods,"package-static-func");
+    insert(MemberListType_pacStaticAttribs,"package-static-attrib");
+    insert(MemberListType_priTypes,"private-type");
+    insert(MemberListType_priMethods,"private-func");
+    insert(MemberListType_priAttribs,"private-attrib");
+    insert(MemberListType_priSlots,"private-slot");
+    insert(MemberListType_priStaticMethods,"private-static-func");
+    insert(MemberListType_priStaticAttribs,"private-static-attrib");
+    insert(MemberListType_friends,"friend");
+    insert(MemberListType_related,"related");
+    insert(MemberListType_decDefineMembers,"define");
+    insert(MemberListType_decProtoMembers,"prototype");
+    insert(MemberListType_decTypedefMembers,"typedef");
+    insert(MemberListType_decEnumMembers,"enum");
+    insert(MemberListType_decFuncMembers,"func");
+    insert(MemberListType_decVarMembers,"var");
+  }
+};
+
+static DocbookSectionMapper g_docbookSectionMapper;
+
+
+inline void writeDocbookString(FTextStream &t,const char *s)
+{
+  t << convertToXML(s);
+}
+
+inline void writeDocbookCodeString(FTextStream &t,const char *s, int &col)
+{
+  char c;
+  while ((c=*s++))
+  {
+    switch(c)
+    {
+      case '\t':
+        {
+          static int tabSize = Config_getInt("TAB_SIZE");
+          int spacesToNextTabStop = tabSize - (col%tabSize);
+          col+=spacesToNextTabStop;
+          while (spacesToNextTabStop--) t << "&#32;";
+          break;
+        }
+      case ' ':  t << "&#32;"; col++;  break;
+      case '<':  t << "&lt;"; col++;   break;
+      case '>':  t << "&gt;"; col++;   break;
+      case '&':  t << "&amp;"; col++;  break;
+      case '\'': t << "&apos;"; col++; break;
+      case '"':  t << "&quot;"; col++; break;
+      default:   t << c; col++;        break;
+    }
+  }
+}
+
+static void writeDocbookHeaderMainpage(FTextStream &t)
+{
+  t << "<?xml version='1.0' encoding='UTF-8' standalone='no'?>" << endl;;
+  t << "<chapter xmlns=\"http://docbook.org/ns/docbook\" version=\"5.0\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">" << endl;
+}
+
+static void writeDocbookHeader_ID(FTextStream &t, QCString id)
+{
+  t << "<?xml version='1.0' encoding='UTF-8' standalone='no'?>" << endl;;
+  t << "<section xmlns=\"http://docbook.org/ns/docbook\" version=\"5.0\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" xml:id=\"" << id << "\">" << endl;
+}
+
+void writeDocbookLink(FTextStream &t,const char * /*extRef*/,const char *compoundId,
+    const char *anchorId,const char * text,const char * /*tooltip*/)
+{
+  t << "<link linkend=\"" << compoundId;
+  if (anchorId) t << "_1" << anchorId;
+  t << "\"";
+  t << ">";
+  writeDocbookString(t,text);
+  t << "</link>";
+}
+
+class TextGeneratorDocbookImpl : public TextGeneratorIntf
+{
+  public:
+    TextGeneratorDocbookImpl(FTextStream &t): m_t(t) {}
+    void writeString(const char *s,bool /*keepSpaces*/) const
+    {
+      writeDocbookString(m_t,s);
+    }
+    void writeBreak(int) const {}
+    void writeLink(const char *extRef,const char *file,
+        const char *anchor,const char *text
+        ) const
+    {
+      writeDocbookLink(m_t,extRef,file,anchor,text,0);
+    }
+  private:
+    FTextStream &m_t;
+};
+
+class DocbookCodeGenerator : public CodeOutputInterface
+{
+  public:
+    DocbookCodeGenerator(FTextStream &t) : m_t(t), m_lineNumber(-1),
+    m_insideCodeLine(FALSE), m_normalHLNeedStartTag(TRUE),
+    m_insideSpecialHL(FALSE) {}
+    virtual ~DocbookCodeGenerator() {}
+
+    void codify(const char *text)
+    {
+      Docbook_DB(("(codify \"%s\")\n",text));
+      writeDocbookCodeString(m_t,text,col);
+    }
+    void writeCodeLink(const char *ref,const char *file,
+        const char *anchor,const char *name,
+        const char *tooltip)
+    {
+      Docbook_DB(("(writeCodeLink)\n"));
+      writeDocbookLink(m_t,ref,file,anchor,name,tooltip);
+      col+=strlen(name);
+    }
+    void startCodeLine(bool)
+    {
+      Docbook_DB(("(startCodeLine)\n"));
+      if (m_lineNumber!=-1)
+      {
+        if (!m_refId.isEmpty())
+        {
+          m_t << "<link linkend=\"" << m_refId << "\">";
+        }
+        m_t << m_lineNumber;
+        if (!m_refId.isEmpty())
+        {
+          m_t << "</link>";
+        }
+      }
+      m_insideCodeLine=TRUE;
+      col=0;
+    }
+    void endCodeLine()
+    {
+      m_t << endl;
+      Docbook_DB(("(endCodeLine)\n"));
+      m_lineNumber = -1;
+      m_refId.resize(0);
+      m_external.resize(0);
+      m_insideCodeLine=FALSE;
+    }
+    void startCodeAnchor(const char *id)
+    {
+      Docbook_DB(("(startCodeAnchor)\n"));
+      m_t << "<anchor id=\"" << id << "\">";
+    }
+    void endCodeAnchor()
+    {
+      Docbook_DB(("(endCodeAnchor)\n"));
+      m_t << "</anchor>";
+    }
+    void startFontClass(const char * /*colorClass*/)
+    {
+      Docbook_DB(("(startFontClass)\n"));
+      m_t << "<emphasis>"; // non DocBook
+      m_insideSpecialHL=TRUE;
+    }
+    void endFontClass()
+    {
+      Docbook_DB(("(endFontClass)\n"));
+      m_t << "</emphasis>"; // non DocBook
+      m_insideSpecialHL=FALSE;
+    }
+    void writeCodeAnchor(const char *)
+    {
+      Docbook_DB(("(writeCodeAnchor)\n"));
+    }
+    void writeLineNumber(const char *extRef,const char *compId,
+        const char *anchorId,int l)
+    {
+      Docbook_DB(("(writeLineNumber)\n"));
+      // we remember the information provided here to use it
+      // at the <codeline> start tag.
+      m_lineNumber = l;
+      if (compId)
+      {
+        m_refId=compId;
+        if (anchorId) m_refId+=(QCString)"_1"+anchorId;
+        m_isMemberRef = anchorId!=0;
+        if (extRef) m_external=extRef;
+      }
+    }
+    void setCurrentDoc(Definition *,const char *,bool)
+    {
+    }
+    void addWord(const char *,bool)
+    {
+    }
+    void finish()
+    {
+      if (m_insideCodeLine) endCodeLine();
+    }
+
+  private:
+    FTextStream &m_t;
+    QCString m_refId;
+    QCString m_external;
+    int m_lineNumber;
+    bool m_isMemberRef;
+    int col;
+    bool m_insideCodeLine;
+    bool m_normalHLNeedStartTag;
+    bool m_insideSpecialHL;
+};
+
+
+static void writeTemplateArgumentList(ArgumentList *al,
+    FTextStream &t,
+    Definition *scope,
+    FileDef *fileScope,
+    int indent)
+{
+  QCString indentStr;
+  indentStr.fill(' ',indent);
+  if (al)
+  {
+    t << indentStr << "<templateparamlist>" << endl;
+    ArgumentListIterator ali(*al);
+    Argument *a;
+    for (ali.toFirst();(a=ali.current());++ali)
+    {
+      t << indentStr << "  <param>" << endl;
+      if (!a->type.isEmpty())
+      {
+        t << indentStr <<  "    <type>";
+        linkifyText(TextGeneratorDocbookImpl(t),scope,fileScope,0,a->type);
+        t << "</type>" << endl;
+      }
+      if (!a->name.isEmpty())
+      {
+        t << indentStr <<  "    <declname>" << a->name << "</declname>" << endl;
+        t << indentStr <<  "    <defname>" << a->name << "</defname>" << endl;
+      }
+      if (!a->defval.isEmpty())
+      {
+        t << indentStr << "    <defval>";
+        linkifyText(TextGeneratorDocbookImpl(t),scope,fileScope,0,a->defval);
+        t << "</defval>" << endl;
+      }
+      t << indentStr << "  </param>" << endl;
+    }
+    t << indentStr << "</templateparamlist>" << endl;
+  }
+}
+
+static void writeTemplateList(ClassDef *cd,FTextStream &t)
+{
+  writeTemplateArgumentList(cd->templateArguments(),t,cd,0,4);
+}
+
+static void writeDocbookDocBlock(FTextStream &t,
+    const QCString &fileName,
+    int lineNr,
+    Definition *scope,
+    MemberDef * md,
+    const QCString &text)
+{
+  QCString stext = text.stripWhiteSpace();
+  if (stext.isEmpty()) return;
+  // convert the documentation string into an abstract syntax tree
+  DocNode *root = validatingParseDoc(fileName,lineNr,scope,md,text,FALSE,FALSE);
+  // create a code generator
+  DocbookCodeGenerator *docbookCodeGen = new DocbookCodeGenerator(t);
+  // create a parse tree visitor for Docbook
+  DocbookDocVisitor *visitor = new DocbookDocVisitor(t,*docbookCodeGen);
+  // visit all nodes
+  root->accept(visitor);
+  // clean up
+  delete visitor;
+  delete docbookCodeGen;
+  delete root;
+}
+
+void writeDocbookCodeBlock(FTextStream &t,FileDef *fd)
+{
+  ParserInterface *pIntf=Doxygen::parserManager->getParser(fd->getDefFileExtension());
+  pIntf->resetCodeParserState();
+  DocbookCodeGenerator *docbookGen = new DocbookCodeGenerator(t);
+  pIntf->parseCode(*docbookGen,  // codeOutIntf
+      0,           // scopeName
+      fileToString(fd->absFilePath(),Config_getBool("FILTER_SOURCE_FILES")),
+      FALSE,       // isExampleBlock
+      0,           // exampleName
+      fd,          // fileDef
+      -1,          // startLine
+      -1,          // endLine
+      FALSE,       // inlineFragement
+      0,           // memberDef
+      TRUE         // showLineNumbers
+      );
+  docbookGen->finish();
+  delete docbookGen;
+}
+
+static QCString classOutputFileBase(ClassDef *cd)
+{
+  //static bool inlineGroupedClasses = Config_getBool("INLINE_GROUPED_CLASSES");
+  //if (inlineGroupedClasses && cd->partOfGroups()!=0)
+  return cd->getOutputFileBase();
+  //else
+  //  return cd->getOutputFileBase();
+}
+
+static QCString memberOutputFileBase(MemberDef *md)
+{
+  //static bool inlineGroupedClasses = Config_getBool("INLINE_GROUPED_CLASSES");
+  //if (inlineGroupedClasses && md->getClassDef() && md->getClassDef()->partOfGroups()!=0)
+  //  return md->getClassDef()->getDocbookOutputFileBase();
+  //else
+  //  return md->getOutputFileBase();
+  return md->getOutputFileBase();
+}
+
+
+static void generateDocbookForMember(MemberDef *md,FTextStream &t,Definition *def, bool detailed=0)
+{
+
+  // + declaration/definition arg lists
+  // + reimplements
+  // + reimplementedBy
+  // + exceptions
+  // + const/volatile specifiers
+  // - examples
+  // + source definition
+  // + source references
+  // + source referenced by
+  // - body code
+  // + template arguments
+  //     (templateArguments(), definitionTemplateParameterLists())
+  // - call graph
+
+  // enum values are written as part of the enum
+  if (md->memberType()==MemberType_EnumValue) return;
+  if (md->isHidden()) return;
+  //if (md->name().at(0)=='@') return; // anonymous member
+
+  // group members are only visible in their group
+  //if (def->definitionType()!=Definition::TypeGroup && md->getGroupDef()) return;
+  QCString memType;
+  switch (md->memberType())
+  {
+    case MemberType_Define:      memType="define";    break;
+    case MemberType_Function:    memType="function";  break;
+    case MemberType_Variable:    memType="variable";  break;
+    case MemberType_Typedef:     memType="typedef";   break;
+    case MemberType_Enumeration: memType="enum";      break;
+    case MemberType_EnumValue:   ASSERT(0);           break;
+    case MemberType_Signal:      memType="signal";    break;
+    case MemberType_Slot:        memType="slot";      break;
+    case MemberType_Friend:      memType="friend";    break;
+    case MemberType_DCOP:        memType="dcop";      break;
+    case MemberType_Property:    memType="property";  break;
+    case MemberType_Event:       memType="event";     break;
+    case MemberType_Interface:   memType="interface"; break;
+    case MemberType_Service:     memType="service";   break;
+  }
+  QCString scopeName;
+  if (md->getClassDef())
+  {
+    scopeName=md->getClassDef()->name();
+  }
+  else if (md->getNamespaceDef())
+  {
+    scopeName=md->getNamespaceDef()->name();
+  }
+  if (detailed==0) 
+  {
+    t << "            <para>" << endl;
+    t << "                <itemizedlist>" << endl;
+    t << "                    <listitem>" << endl;
+    //enum
+    bool closePara=TRUE;
+    if (md->memberType()==MemberType_Enumeration) 
+    {
+      MemberList *enumFields = md->enumFieldList();
+      t << "                            <para>" << memType << " <link linkend=\"";
+      if (md->getGroupDef() && def->definitionType()==Definition::TypeGroup)
+      {
+        t << md->getGroupDef()->getOutputFileBase();
+      }
+      else
+      {
+        t << memberOutputFileBase(md);
+      }
+      t << "_1" << md->anchor() << "\">" << convertToXML(md->name()) << "</link>";
+      if (enumFields!=0) 
+      {
+        MemberListIterator emli(*enumFields);
+        MemberDef *emd;
+        t << "{";
+        int cnt=0;
+        for (emli.toFirst();(emd=emli.current());++emli) 
+        {
+          if (cnt!=0) 
+          {
+            t << ", ";
+          }
+          t << "<link linkend=\"" << memberOutputFileBase(emd) << "_1" << emd->anchor() << "\">";
+          writeDocbookString(t,emd->name());
+          t << "</link>";
+          if (!emd->initializer().isEmpty()) 
+          {
+            t << "=";
+            writeDocbookString(t,emd->initializer());
+          }
+          cnt++;
+        }
+        t << "}";
+      }
+    }
+    else if (md->memberType()==MemberType_Define) 
+    {
+      t << "                            <para>" << "#" << memType << " <link linkend=\"";
+      if (md->getGroupDef() && def->definitionType()==Definition::TypeGroup)
+      {
+        t << md->getGroupDef()->getOutputFileBase();
+      }
+      else
+      {
+        t << memberOutputFileBase(md);
+      }
+      t << "_1" << md->anchor() << "\">" << convertToXML(md->name()) << "</link>";
+      if (!md->initializer().isEmpty() && md->initializer().length()<2000) 
+      {
+        t << " ";
+        linkifyText(TextGeneratorDocbookImpl(t),def,md->getBodyDef(),md,md->initializer());
+      }
+      if (md->briefDescription()) 
+      {
+        t << "<para><emphasis>";
+        writeDocbookString(t,md->briefDescription());
+        t << "</emphasis></para>" << endl;
+      }
+    }
+    else if (md->memberType()==MemberType_Variable) 
+    {
+      if (md->getClassDef()) 
+      {
+        t << "                        <para>" << convertToXML(md->declaration());
+        if (md->briefDescription()) 
+        {
+          t << "<para><emphasis>";
+          writeDocbookString(t,md->briefDescription());
+          t << "</emphasis></para>";
+        }
+      } 
+      else 
+      {
+        t << "                        <para>";
+        linkifyText(TextGeneratorDocbookImpl(t),def,md->getBodyDef(),md,md->typeString());
+        t << " <link linkend=\"";
+        if (md->getGroupDef() && def->definitionType()==Definition::TypeGroup)
+        {
+          t << md->getGroupDef()->getOutputFileBase();
+        }
+        else
+        {
+          t << memberOutputFileBase(md);
+        }
+        t << "_1" << md->anchor() << "\">" << convertToXML(md->name()) << "</link>";
+      }
+    }
+    else if (md->memberType()==MemberType_Typedef) 
+    {
+      t << "                            <para>" << memType;
+      t << " ";
+      linkifyText(TextGeneratorDocbookImpl(t),def,md->getBodyDef(),md,md->typeString());
+      t << " ";
+      t << " <link linkend=\"";
+      if (md->getGroupDef() && def->definitionType()==Definition::TypeGroup)
+      {
+        t << md->getGroupDef()->getOutputFileBase();
+      }
+      else
+      {
+        t << memberOutputFileBase(md);
+      }
+      t << "_1" << md->anchor() << "\">" << convertToXML(md->name()) << "</link>";
+    }
+    else if (md->memberType()==MemberType_Function) 
+    {
+      t << "                        <para>";
+      linkifyText(TextGeneratorDocbookImpl(t),def,md->getBodyDef(),md,md->typeString());
+      t << " <link linkend=\"";
+      if (md->getGroupDef() && def->definitionType()==Definition::TypeGroup)
+      {
+        t << md->getGroupDef()->getOutputFileBase();
+      }
+      else
+      {
+        t << memberOutputFileBase(md);
+      }
+      t << "_1" << md->anchor() << "\">" << convertToXML(md->name()) << "</link>";
+      t << " (" << endl;
+      ArgumentList *declAl = md->declArgumentList();
+      ArgumentList *defAl = md->argumentList();
+      if (declAl && declAl->count()>0)
+      {
+        ArgumentListIterator declAli(*declAl);
+        ArgumentListIterator defAli(*defAl);
+        Argument *a;
+        int cnt=0;
+        for (declAli.toFirst();(a=declAli.current());++declAli)
+        {
+          if (cnt!=0) 
+          {
+            t << ", ";
+          }
+          if (!a->type.isEmpty())
+          {
+            linkifyText(TextGeneratorDocbookImpl(t),def,md->getBodyDef(),md,a->type);
+          }
+          t << " ";
+          if (!a->name.isEmpty())
+          {
+            writeDocbookString(t,a->name);
+          }
+          cnt++;
+        }
+      }
+      t << ")";
+    }
+    else
+    {
+      closePara = FALSE;
+    }
+    if (closePara) t << "</para>" << endl;
+    t << "                    </listitem>" << endl;
+    t << "                </itemizedlist>" << endl;
+    t << "            </para>" << endl;
+  } 
+  else 
+  {
+    if (md->memberType()==MemberType_Enumeration) 
+    {
+      MemberList *enumFields = md->enumFieldList();
+      t << "            <section xml:id=\"";
+      if (md->getGroupDef() && def->definitionType()==Definition::TypeGroup)
+      {
+        t << md->getGroupDef()->getOutputFileBase();
+      }
+      else
+      {
+        t << memberOutputFileBase(md);
+      }
+      t << "_1" << md->anchor() << "\">" << endl;
+      t << "               <title>" << memType << " " << convertToXML(md->name()) << " " << "</title>" << endl;
+      t << "               ";
+      writeDocbookDocBlock(t,md->docFile(),md->docLine(),md->getOuterScope(),md,md->documentation());
+      t << endl;
+      if (enumFields!=0) 
+      {
+        MemberListIterator emli(*enumFields);
+        MemberDef *emd;
+        t << "               <formalpara>" << endl;
+        t << "                    <title>Enumerator:</title>" << endl;
+        t << "                    <variablelist>" << endl;
+        for (emli.toFirst();(emd=emli.current());++emli) 
+        {
+          t << "                        <varlistentry xml:id=\"";
+          t << memberOutputFileBase(emd) << "_1" << emd->anchor() << "\">" << endl;
+          t << "                            <term>";
+          writeDocbookString(t,emd->name());
+          t << "</term>" << endl;
+          t << "                            <listitem>" << endl;
+          t << "                                <para>";
+          writeDocbookString(t,emd->briefDescription());
+          t << "</para>" << endl;
+          t << "                            </listitem>" << endl;
+          t << "                        </varlistentry>" << endl;
+        }
+        t << "                     </variablelist>" << endl;
+        t << "                </formalpara>" << endl;
+        t << "                <para>";
+        t << "Definition at line " << md->getDefLine() << " of file " << stripPath(md->getDefFileName()) << endl;
+        t << "                    <programlisting>" << endl;
+        t << "{" << endl;
+        for (emli.toFirst();(emd=emli.current());++emli) 
+        {
+          writeDocbookString(t,emd->name());
+          if (!emd->initializer().isEmpty()) 
+          {
+            t << "=";
+            writeDocbookString(t,emd->initializer());
+          }
+          t << ", " << endl;
+        }
+        t << "}" << convertToXML(md->name()) << ";" << endl;
+        t << "                    </programlisting>" << endl;
+        t << "                </para>" << endl;
+        t << "            </section>" << endl;
+      }
+    }
+    else if (md->memberType()==MemberType_Typedef) 
+    {
+      t << "            <section xml:id=\"";
+      if (md->getGroupDef() && def->definitionType()==Definition::TypeGroup)
+      {
+        t << md->getGroupDef()->getOutputFileBase();
+      }
+      else
+      {
+        t << memberOutputFileBase(md);
+      }
+      t << "_1" << md->anchor() << "\">" << endl;
+      t << "                <title>" << convertToXML(md->definition()) << "</title>";
+      t << " <emphasis>";
+      writeDocbookString(t,md->briefDescription());
+      t << "</emphasis>" << endl;
+      t << "                ";
+      writeDocbookDocBlock(t,md->docFile(),md->docLine(),md->getOuterScope(),md,md->documentation());
+      t << endl;
+      t << "            </section>" << endl;
+    }
+    else if (md->memberType()==MemberType_Function) 
+    {
+      t << "            <section xml:id=\"";
+      if (md->getGroupDef() && def->definitionType()==Definition::TypeGroup)
+      {
+        t << md->getGroupDef()->getOutputFileBase();
+      }
+      else
+      {
+        t << memberOutputFileBase(md);
+      }
+      t << "_1" << md->anchor() << "\">" << endl;
+      t << "                <title>" << convertToXML(md->definition()) << " " << convertToXML(md->argsString()) << "</title>";
+      t << " <emphasis>";
+      writeDocbookString(t,md->briefDescription());
+      t << "</emphasis>" << endl;
+      t << "                ";
+      writeDocbookDocBlock(t,md->docFile(),md->docLine(),md->getOuterScope(),md,md->documentation());
+      t << endl;
+      t << "            </section>" << endl;
+    }
+    else if (md->memberType()==MemberType_Define) 
+    {
+      if (md->documentation()) 
+      {
+        t << "            <section xml:id=\"";
+        if (md->getGroupDef() && def->definitionType()==Definition::TypeGroup)
+        {
+          t << md->getGroupDef()->getOutputFileBase();
+        }
+        else
+        {
+          t << memberOutputFileBase(md);
+        }
+        t << "_1" << md->anchor() << "\">" << endl;
+        t << "                <title>" << convertToXML(md->definition()) << "</title>";
+        t << "                ";
+        writeDocbookDocBlock(t,md->docFile(),md->docLine(),md->getOuterScope(),md,md->documentation());
+        t << endl;
+        t << "                <para>Definition at line " << md->getDefLine() << " of file " << stripPath(md->getDefFileName()) << "</para>" << endl;
+        t << "                <para>The Documentation for this define was generated from the following file: </para>" << endl;
+        t << "                <para><itemizedlist><listitem><para>" << stripPath(md->getDefFileName()) << "</para></listitem></itemizedlist></para>" << endl;
+        t << "            </section>" << endl;
+      }
+    }
+    else if (md->memberType()==MemberType_Variable) 
+    {
+      if (md->getClassDef()) 
+      {
+        if (md->documentation()) 
+        {
+          t << "            <simplesect>" << endl;
+          t << "                <title>" << convertToXML(md->definition()) << "</title>";
+          t << "                ";
+          writeDocbookDocBlock(t,md->docFile(),md->docLine(),md->getOuterScope(),md,md->documentation());
+          t << endl;
+          t << "                <para>Definition at line " << md->getDefLine() << " of file " << stripPath(md->getDefFileName()) << "</para>" << endl;
+          t << "                <para>The Documentation for this struct was generated from the following file: </para>" << endl;
+          t << "                <para><itemizedlist><listitem><para>" << stripPath(md->getDefFileName()) << "</para></listitem></itemizedlist></para>" << endl;
+          t << "            </simplesect>" << endl;
+        }
+      }
+      else 
+      {
+        t << "            <section xml:id=\"";
+        if (md->getGroupDef() && def->definitionType()==Definition::TypeGroup)
+        {
+          t << md->getGroupDef()->getOutputFileBase();
+        }
+        else
+        {
+          t << memberOutputFileBase(md);
+        }
+        t << "_1" << md->anchor() << "\">" << endl;
+        t << "                <title>" << convertToXML(md->definition()) << "</title>";
+        t << " <emphasis>";
+        writeDocbookString(t,md->briefDescription());
+        t << "</emphasis>" << endl;
+        t << "                ";
+        writeDocbookDocBlock(t,md->docFile(),md->docLine(),md->getOuterScope(),md,md->documentation());
+        t << endl;
+        t << "            </section>" << endl;
+      }
+    }
+  }
+}
+
+static void generateDocbookSection(Definition *d,FTextStream &t,MemberList *ml,const char *kind,
+    bool detailed=0, const char *header=0,const char *documentation=0)
+{
+  if (ml==0) return;
+  MemberListIterator mli(*ml);
+  MemberDef *md;
+  int count=0;
+  int doc_count=0;
+  QCString compkind = kind;
+  QCString title, desctitle;
+
+  for (mli.toFirst();(md=mli.current());++mli) 
+  {
+    // namespace members are also inserted in the file scope, but
+    // to prevent this duplication in the Docbook output, we filter those here.
+    if (d->definitionType()!=Definition::TypeFile || md->getNamespaceDef()==0) 
+    {
+      count++;
+    }
+  }
+
+  switch (ml->listType())
+  {
+    case MemberListType_decDefineMembers:  title="Defines";             desctitle="Define Documentation";              break;
+    case MemberListType_decTypedefMembers: title="Typedefs";            desctitle="Typedef Documentation";             break;
+    case MemberListType_decEnumMembers:    title="Enumerations";        desctitle="Enumeration Type documentation";    break;
+    case MemberListType_decFuncMembers:    title="Functions";           desctitle="Function Documentation";            break;
+    case MemberListType_decVarMembers:     title="Variables";           desctitle="Variable Documentation";            break;
+    case MemberListType_pubAttribs:        title="Public Attributes";   desctitle="Member Documentation";              break;
+    case MemberListType_priAttribs:        title="Private Attributes";  desctitle="Member Documentation";              break;
+    case MemberListType_proAttribs:        title="Protected Attributes";desctitle="Member Documentation";              break;
+    default:                               title="";                    desctitle="";                                  break;
+  }
+
+  if (count==0) return; // empty list
+
+  for (mli.toFirst();(md=mli.current());++mli) 
+  {
+    if (md->documentation()) 
+    {
+      doc_count++;
+    }
+  }
+
+  if (detailed) 
+  {
+    if (desctitle) 
+    {
+      if (desctitle=="Member Documentation") 
+      {
+        if (doc_count > 0) 
+        {
+          t << "        <simplesect>" << endl;
+          t << "            <title>" << desctitle << "</title>" << endl;
+        }
+      } 
+      else if (desctitle=="Define Documentation") 
+      {
+        if (doc_count > 0) 
+        {
+          t << "        <section>" << endl;
+          t << "            <title>" << desctitle << "</title>" << endl;
+        }
+      } 
+      else 
+      {
+        t << "        <section>" << endl;
+        t << "            <title>" << desctitle << "</title>" << endl;
+      }
+    }
+  } else 
+  {
+    t << "        <simplesect>" << endl;
+    if (header) 
+    {
+      t << "            <title>" << convertToXML(header) << "</title>" << endl;
+    } 
+    else 
+    {
+      t << "            <title>" << title << "</title>" << endl;
+    }
+  }
+
+  if (documentation) 
+  {
+    t << "      <description>";
+    writeDocbookDocBlock(t,d->docFile(),d->docLine(),d,0,documentation);
+    t << "</description>" << endl;
+  }
+  for (mli.toFirst();(md=mli.current());++mli) 
+  {
+    // namespace members are also inserted in the file scope, but
+    // to prevent this duplication in the Docbook output, we filter those here.
+    if (d->definitionType()!=Definition::TypeFile || md->getNamespaceDef()==0) 
+    {
+      generateDocbookForMember(md,t,d,detailed);
+    }
+  }
+  if (detailed) 
+  {
+    if (desctitle) 
+    {
+      if (desctitle=="Member Documentation") 
+      {
+        if (doc_count > 0) 
+        {
+          t << "        </simplesect>" << endl;
+        }
+      } 
+      else if (desctitle=="Define Documentation") 
+      {
+        if (doc_count > 0) 
+        {
+          t << "        </section>" << endl;
+        }
+      } 
+      else 
+      {
+        t << "        </section>" << endl;
+      }
+    }
+  } 
+  else 
+  {
+    t << "        </simplesect>" << endl;
+  }
+}
+
+static void writeInnerClasses(const ClassSDict *cl,FTextStream &t)
+{
+  if (cl)
+  {
+    ClassSDict::Iterator cli(*cl);
+    ClassDef *cd;
+    QCString title = "Classes";
+
+    if (cli.toFirst()) 
+    {
+      t << "        <simplesect>" << endl;
+      t << "            <title> " << title << " </title>" << endl;
+    }
+    for (cli.toFirst();(cd=cli.current());++cli)
+    {
+      if (!cd->isHidden() && cd->name().find('@')==-1) 
+      {
+        t << "            <para>" << endl;
+        t << "                <itemizedlist>" << endl;
+        t << "                    <listitem>" << endl;
+        t << "                        <para>" << "struct <link linkend=\"" << classOutputFileBase(cd) << "\">" << convertToXML(cd->name()) << "</link>";
+        t << "</para>" << endl;
+        t << "                    </listitem>" << endl;
+        t << "                </itemizedlist>" << endl;
+        t << "            </para>" << endl;
+      }
+    }
+    if (cli.toFirst()) 
+    {
+      t << "        </simplesect>" << endl;
+    }
+  }
+}
+
+static void writeInnerNamespaces(const NamespaceSDict *nl,FTextStream &t)
+{
+  if (nl)
+  {
+    NamespaceSDict::Iterator nli(*nl);
+    NamespaceDef *nd;
+    QCString title = "Namespaces";
+
+    if (nli.toFirst()) 
+    {
+      t << "        <simplesect>" << endl;
+      t << "            <title> " << title << " </title>" << endl;
+    }
+    for (nli.toFirst();(nd=nli.current());++nli)
+    {
+      if (!nd->isHidden() && nd->name().find('@')==-1) // skip anonymouse scopes
+      {
+        t << "            <para>" << endl;
+        t << "                <itemizedlist>" << endl;
+        t << "                    <listitem>" << endl;
+        t << "                        <para>" << "struct <link linkend=\"" << nd->getOutputFileBase() << "\">" << convertToXML(nd->name()) << "</link>";
+        t << "</para>" << endl;
+        t << "                    </listitem>" << endl;
+        t << "                </itemizedlist>" << endl;
+        t << "            </para>" << endl;
+      }
+    }
+    if (nli.toFirst()) 
+    {
+      t << "        </simplesect>" << endl;
+    }
+  }
+}
+
+static void writeInnerFiles(const FileList *fl,FTextStream &t)
+{
+  if (fl)
+  {
+    QListIterator<FileDef> fli(*fl);
+    FileDef *fd;
+    QCString title = "Files";
+
+    if (fli.toFirst()) 
+    {
+      t << "        <simplesect>" << endl;
+      t << "            <title> " << title << " </title>" << endl;
+    }
+    for (fli.toFirst();(fd=fli.current());++fli) 
+    {
+      t << "            <para>" << endl;
+      t << "                <itemizedlist>" << endl;
+      t << "                    <listitem>" << endl;
+      t << "                        <para>" << "file <link linkend=\"" << fd->getOutputFileBase() << "\">" << convertToXML(fd->name()) << "</link>";
+      t << "</para>" << endl;
+      t << "                    </listitem>" << endl;
+      t << "                </itemizedlist>" << endl;
+      t << "            </para>" << endl;
+    }
+    if (fli.toFirst()) 
+    {
+      t << "        </simplesect>" << endl;
+    }
+  }
+}
+
+static void writeInnerPages(const PageSDict *pl,FTextStream &t)
+{
+  if (pl)
+  {
+    PageSDict::Iterator pli(*pl);
+    PageDef *pd;
+
+    for (pli.toFirst();(pd=pli.current());++pli)
+    {
+      t << "<xi:include href=\"" << pd->getOutputFileBase() << ".xml\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>"  << endl;
+    }
+  }
+}
+
+static void writeInnerGroups(const GroupList *gl,FTextStream &t)
+{
+  if (gl)
+  {
+    GroupListIterator gli(*gl);
+    GroupDef *sgd;
+
+    //Docbook header tags for inner groups
+    if (gli.toFirst()) 
+    {
+      t << "    <simplesect>" << endl;
+      t << "        <title>Modules</title>" << endl;
+      t << "    </simplesect>" << endl;
+      t << "    <para>" << endl;
+      t << "        <itemizedlist>" << endl;
+    }
+
+    for (gli.toFirst();(sgd=gli.current());++gli)
+    {
+      t << "            <listitem><para><link linkend=\"" << sgd->getOutputFileBase() << "\">" << convertToXML(sgd->groupTitle()) << "</link></para></listitem>" << endl;
+    }
+
+    //Docbook footer tags for inner groups
+    if (gli.toFirst()) 
+    {
+      t << "        </itemizedlist>" << endl;
+      t << "    </para>" << endl;
+    }
+
+  }
+}
+
+static void writeInnerDirs(const DirList *dl,FTextStream &t)
+{
+  if (dl)
+  {
+    QListIterator<DirDef> subdirs(*dl);
+    DirDef *subdir;
+    QCString title = "Directories";
+    if (subdirs.toFirst()) 
+    {
+      t << "        <simplesect>" << endl;
+      t << "            <title> " << title << " </title>" << endl;
+    }
+    for (subdirs.toFirst();(subdir=subdirs.current());++subdirs)
+    {
+      t << "            <para>" << endl;
+      t << "                <itemizedlist>" << endl;
+      t << "                    <listitem>" << endl;
+      t << "                        <para>" << "dir <link linkend=\"" << subdir->getOutputFileBase() << "\">" << convertToXML(subdir->displayName()) << "</link>";
+      t << "</para>" << endl;
+      t << "                    </listitem>" << endl;
+      t << "                </itemizedlist>" << endl;
+      t << "            </para>" << endl;
+    }
+    if (subdirs.toFirst()) 
+    {
+      t << "        </simplesect>" << endl;
+    }
+  }
+}
+
+static void writeInnerGroupFiles(const GroupList *gl,FTextStream &t)
+{
+  if (gl)
+  {
+    GroupListIterator gli(*gl);
+    GroupDef *sgd;
+
+    for (gli.toFirst();(sgd=gli.current());++gli)
+    {
+      t << "<xi:include href=\"" << sgd->getOutputFileBase() << ".xml\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>"  << endl;
+    }
+  }
+}
+
+static void generateDocbookForClass(ClassDef *cd,FTextStream &ti)
+{
+  // + brief description
+  // + detailed description
+  // + template argument list(s)
+  // - include file
+  // + member groups
+  // + inheritance diagram
+  // + list of direct super classes
+  // + list of direct sub classes
+  // + list of inner classes
+  // + collaboration diagram
+  // + list of all members
+  // + user defined member sections
+  // + standard member sections
+  // + detailed member documentation
+  // - examples using the class
+
+  if (cd->isReference())        return; // skip external references.
+  if (cd->isHidden())           return; // skip hidden classes.
+  if (cd->name().find('@')!=-1) return; // skip anonymous compounds.
+  if (cd->templateMaster()!=0)  return; // skip generated template instances.
+
+  msg("Generating Docbook output for class %s\n",cd->name().data());
+
+  QCString fileDocbook=cd->getOutputFileBase()+".xml";
+  //Add the file Documentation info to index file
+  ti << "        <xi:include href=\"" << fileDocbook << "\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl;
+
+  QCString outputDirectory = Config_getString("DOCBOOK_OUTPUT");
+  QCString fileName=outputDirectory+"/"+ classOutputFileBase(cd)+".xml";
+  QFile f(fileName);
+  if (!f.open(IO_WriteOnly))
+  {
+    err("Cannot open file %s for writing!\n",fileName.data());
+    return;
+  }
+  FTextStream t(&f);
+  //t.setEncoding(FTextStream::UnicodeUTF8);
+
+  writeDocbookHeader_ID(t, classOutputFileBase(cd));
+  t << "<title>";
+  writeDocbookString(t,cd->name());
+  t << " " << cd->compoundTypeString() << " Reference";
+  t << "</title>" << endl;
+
+  IncludeInfo *ii=cd->includeInfo();
+  if (ii)
+  {
+    QCString nm = ii->includeName;
+    if (nm.isEmpty() && ii->fileDef) nm = ii->fileDef->docName();
+    if (!nm.isEmpty())
+    {
+      t << "<para>" << endl;
+      t << "    <programlisting>#include ";
+      if (ii->fileDef && !ii->fileDef->isReference()) // TODO: support external references
+      {
+        t << "<link linkend=\"" << ii->fileDef->getOutputFileBase() << "\">";
+      }
+      t << "&lt;" << nm << "&gt;" << "</link>";
+      t << "</programlisting>" << endl;
+      t << "</para>" << endl;
+    }
+  }
+
+  writeInnerClasses(cd->getClassSDict(),t);
+
+  writeTemplateList(cd,t);
+  if (cd->getMemberGroupSDict())
+  {
+    MemberGroupSDict::Iterator mgli(*cd->getMemberGroupSDict());
+    MemberGroup *mg;
+    for (;(mg=mgli.current());++mgli)
+    {
+      generateDocbookSection(cd,t,mg->members(),"user-defined",0,mg->header(),
+          mg->documentation());
+    }
+  }
+
+
+  QListIterator<MemberList> mli(cd->getMemberLists());
+  MemberList *ml;
+  for (mli.toFirst();(ml=mli.current());++mli)
+  {
+    if ((ml->listType()&MemberListType_detailedLists)==0)
+    {
+      generateDocbookSection(cd,t,ml,g_docbookSectionMapper.find(ml->listType()));
+    }
+  }
+  if (cd->briefDescription()) 
+  {
+    t << "    <simplesect>" << endl;
+    t << "        <title>Brief Description</title>" << endl;
+    writeDocbookDocBlock(t,cd->briefFile(),cd->briefLine(),cd,0,cd->briefDescription());
+    t << "    </simplesect>" << endl;
+  }
+
+  if (cd->documentation()) 
+  {
+    t << "        <simplesect>" << endl;
+    t << "            <title>Detailed Description</title>" << endl;
+    writeDocbookDocBlock(t,cd->docFile(),cd->docLine(),cd,0,cd->documentation());
+    t << "                <para>Definition at line " << cd->getDefLine() << " of file " << stripPath(cd->getDefFileName()) << "</para>" << endl;
+    t << "                <para>The Documentation for this struct was generated from the following file: </para>" << endl;
+    t << "                <para><itemizedlist><listitem><para>" << stripPath(cd->getDefFileName()) << "</para></listitem></itemizedlist></para>" << endl;
+    t << "        </simplesect>" << endl;
+  }
+  for (mli.toFirst();(ml=mli.current());++mli)
+  {
+    if ((ml->listType()&MemberListType_detailedLists)==0)
+    {
+      generateDocbookSection(cd,t,ml,g_docbookSectionMapper.find(ml->listType()),1);
+    }
+  }
+
+  /*// TODO: Handling of Inheritance and Colloboration graph for Docbook to be implemented
+    DotClassGraph inheritanceGraph(cd,DotNode::Inheritance);
+    if (!inheritanceGraph.isTrivial())
+    {
+    t << "    <inheritancegraph>" << endl;
+    inheritanceGraph.writeDocbook(t);
+    t << "    </inheritancegraph>" << endl;
+    }
+    DotClassGraph collaborationGraph(cd,DotNode::Collaboration);
+    if (!collaborationGraph.isTrivial())
+    {
+    t << "    <collaborationgraph>" << endl;
+    collaborationGraph.writeDocbook(t);
+    t << "    </collaborationgraph>" << endl;
+    }
+    t << "    <location file=\""
+    << cd->getDefFileName() << "\" line=\""
+    << cd->getDefLine() << "\"";
+    if (cd->getStartBodyLine()!=-1)
+    {
+    FileDef *bodyDef = cd->getBodyDef();
+    if (bodyDef)
+    {
+    t << " bodyfile=\"" << bodyDef->absFilePath() << "\"";
+    }
+    t << " bodystart=\"" << cd->getStartBodyLine() << "\" bodyend=\""
+    << cd->getEndBodyLine() << "\"";
+    }
+    t << "/>" << endl;
+    writeListOfAllMembers(cd,t);
+   */
+
+  t << "</section>" << endl;
+
+}
+
+static void generateDocbookForNamespace(NamespaceDef *nd,FTextStream &ti)
+{
+  // + contained class definitions
+  // + contained namespace definitions
+  // + member groups
+  // + normal members
+  // + brief desc
+  // + detailed desc
+  // + location
+  // - files containing (parts of) the namespace definition
+
+  if (nd->isReference() || nd->isHidden()) return; // skip external references
+
+  QCString fileDocbook=nd->getOutputFileBase()+".xml";
+  //Add the file Documentation info to index file
+  ti << "        <xi:include href=\"" << fileDocbook << "\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl;
+
+  QCString outputDirectory = Config_getString("DOCBOOK_OUTPUT");
+  QCString fileName=outputDirectory+"/"+nd->getOutputFileBase()+".xml";
+  QFile f(fileName);
+  if (!f.open(IO_WriteOnly))
+  {
+    err("Cannot open file %s for writing!\n",fileName.data());
+    return;
+  }
+  FTextStream t(&f);
+  //t.setEncoding(FTextStream::UnicodeUTF8);
+
+  writeDocbookHeader_ID(t, nd->getOutputFileBase());
+  t << "<title>";
+  writeDocbookString(t,nd->name());
+  t << "</title>" << endl;
+
+  writeInnerClasses(nd->getClassSDict(),t);
+  writeInnerNamespaces(nd->getNamespaceSDict(),t);
+
+  if (nd->getMemberGroupSDict())
+  {
+    MemberGroupSDict::Iterator mgli(*nd->getMemberGroupSDict());
+    MemberGroup *mg;
+    for (;(mg=mgli.current());++mgli)
+    {
+      generateDocbookSection(nd,t,mg->members(),"user-defined",0,mg->header(),
+          mg->documentation());
+    }
+  }
+
+  QListIterator<MemberList> mli(nd->getMemberLists());
+  MemberList *ml;
+  for (mli.toFirst();(ml=mli.current());++mli)
+  {
+    if ((ml->listType()&MemberListType_declarationLists)!=0)
+    {
+      generateDocbookSection(nd,t,ml,g_docbookSectionMapper.find(ml->listType()));
+    }
+  }
+
+  if (nd->briefDescription()) 
+  {
+    t << "    <simplesect>" << endl;
+    t << "        <title>Brief Description</title>" << endl;
+    writeDocbookDocBlock(t,nd->briefFile(),nd->briefLine(),nd,0,nd->briefDescription());
+    t << "    </simplesect>" << endl;
+  }
+
+  if (nd->documentation()) 
+  {
+    t << "        <simplesect>" << endl;
+    t << "            <title>Detailed Description</title>" << endl;
+    writeDocbookDocBlock(t,nd->docFile(),nd->docLine(),nd,0,nd->documentation());
+    t << "                <para>Definition at line " << nd->getDefLine() << " of file " << stripPath(nd->getDefFileName()) << "</para>" << endl;
+    t << "                <para>The Documentation for this struct was generated from the following file: </para>" << endl;
+    t << "                <para><itemizedlist><listitem><para>" << stripPath(nd->getDefFileName()) << "</para></listitem></itemizedlist></para>" << endl;
+    t << "        </simplesect>" << endl;
+  }
+  t << "</section>" << endl;
+}
+
+static void generateDocbookForFile(FileDef *fd,FTextStream &ti)
+{
+  // + includes files
+  // + includedby files
+  // + include graph
+  // + included by graph
+  // + contained class definitions
+  // + contained namespace definitions
+  // + member groups
+  // + normal members
+  // + brief desc
+  // + detailed desc
+  // + source code
+  // + location
+  // - number of lines
+
+  if (fd->isReference()) return; // skip external references
+
+  QCString fileDocbook=fd->getOutputFileBase()+".xml";
+  //Add the file Documentation info to index file
+  ti << "        <xi:include href=\"" << fileDocbook << "\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl;
+
+  QCString outputDirectory = Config_getString("DOCBOOK_OUTPUT");
+  QCString fileName=outputDirectory+"/"+fd->getOutputFileBase()+".xml";
+
+  QFile f(fileName);
+  if (!f.open(IO_WriteOnly))
+  {
+    err("Cannot open file %s for writing!\n",fileName.data());
+    return;
+  }
+  FTextStream t(&f);
+  //t.setEncoding(FTextStream::UnicodeUTF8);
+  writeDocbookHeader_ID(t, fd->getOutputFileBase());
+
+  t << "    <title>";
+  writeDocbookString(t,fd->name());
+  t << " File Reference";
+  t << "</title>" << endl;
+
+  IncludeInfo *inc;
+
+  if (fd->includeFileList())
+  {
+    QListIterator<IncludeInfo> ili1(*fd->includeFileList());
+    for (ili1.toFirst();(inc=ili1.current());++ili1)
+    {
+      t << "    <programlisting>#include ";
+      t << inc->includeName;
+      t << "</programlisting>" << endl;
+    }
+  }
+
+  if (fd->getClassSDict())
+  {
+    writeInnerClasses(fd->getClassSDict(),t);
+  }
+  if (fd->getNamespaceSDict())
+  {
+    writeInnerNamespaces(fd->getNamespaceSDict(),t);
+  }
+
+  if (fd->getMemberGroupSDict())
+  {
+    MemberGroupSDict::Iterator mgli(*fd->getMemberGroupSDict());
+    MemberGroup *mg;
+    for (;(mg=mgli.current());++mgli)
+    {
+      generateDocbookSection(fd,t,mg->members(),"user-defined",0,mg->header(),
+          mg->documentation());
+    }
+  }
+
+  QListIterator<MemberList> mli(fd->getMemberLists());
+  MemberList *ml;
+  for (mli.toFirst();(ml=mli.current());++mli)
+  {
+    if ((ml->listType()&MemberListType_declarationLists)!=0)
+    {
+      generateDocbookSection(fd,t,ml,g_docbookSectionMapper.find(ml->listType()));
+    }
+  }
+
+  t << "    <simplesect>" << endl;
+  t << "        <title>Detailed Description</title>" << endl;
+  writeDocbookDocBlock(t,fd->briefFile(),fd->briefLine(),fd,0,fd->briefDescription());
+  writeDocbookDocBlock(t,fd->docFile(),fd->docLine(),fd,0,fd->documentation());
+  t << "    <para>Definition in file " << fd->getDefFileName() << "</para>" << endl;
+  t << "    </simplesect>" << endl;
+
+  /*// TODO: Handling of Program listing for Docbook to be implemented
+    if (Config_getBool("DOCBOOK_PROGRAMLISTING"))
+    {
+    t << "    <programlisting>" << endl;
+    writeDocbookCodeBlock(t,fd);
+    t << "    </programlisting>" << endl;
+    }
+   */
+
+  t << "</section>" << endl;
+
+}
+
+static void generateDocbookForGroup(GroupDef *gd,FTextStream &ti)
+{
+  // + members
+  // + member groups
+  // + files
+  // + classes
+  // + namespaces
+  // - packages
+  // + pages
+  // + child groups
+  // - examples
+  // + brief description
+  // + detailed description
+
+  if (gd->isReference()) return; // skip external references
+
+  if (!gd->isASubGroup()) 
+  {
+    QCString fileDocbook=gd->getOutputFileBase()+".xml";
+    //Add the file Documentation info to index file
+    ti << "        <xi:include href=\"" << fileDocbook << "\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl;
+  }
+
+  QCString outputDirectory = Config_getString("DOCBOOK_OUTPUT");
+  QCString fileName=outputDirectory+"/"+gd->getOutputFileBase()+".xml";
+
+  QFile f(fileName);
+  if (!f.open(IO_WriteOnly))
+  {
+    err("Cannot open file %s for writing!\n",fileName.data());
+    return;
+  }
+
+  FTextStream t(&f);
+  //t.setEncoding(FTextStream::UnicodeUTF8);
+  writeDocbookHeader_ID(t, gd->getOutputFileBase());
+
+  t << "    <title>" << convertToXML(gd->groupTitle()) << "</title>" << endl;
+
+  if (gd->briefDescription()) 
+  {
+    t << "    <simplesect>" << endl;
+    t << "        <title>Brief Description</title>" << endl;
+    writeDocbookDocBlock(t,gd->briefFile(),gd->briefLine(),gd,0,gd->briefDescription());
+    t << "    </simplesect>" << endl;
+  }
+
+  if (gd->documentation()) 
+  {
+    t << "        <simplesect>" << endl;
+    t << "            <title>Detailed Description</title>" << endl;
+    writeDocbookDocBlock(t,gd->docFile(),gd->docLine(),gd,0,gd->documentation());
+    t << "        </simplesect>" << endl;
+  }
+
+  writeInnerFiles(gd->getFiles(),t);
+  writeInnerClasses(gd->getClasses(),t);
+  writeInnerNamespaces(gd->getNamespaces(),t);
+  writeInnerPages(gd->getPages(),t);
+  writeInnerGroups(gd->getSubGroups(),t);
+
+  if (gd->getMemberGroupSDict())
+  {
+    MemberGroupSDict::Iterator mgli(*gd->getMemberGroupSDict());
+    MemberGroup *mg;
+    for (;(mg=mgli.current());++mgli)
+    {
+      generateDocbookSection(gd,t,mg->members(),"user-defined",0,mg->header(),
+          mg->documentation());
+    }
+  }
+
+  QListIterator<MemberList> mli(gd->getMemberLists());
+  MemberList *ml;
+  for (mli.toFirst();(ml=mli.current());++mli)
+  {
+    if ((ml->listType()&MemberListType_declarationLists)!=0)
+    {
+      generateDocbookSection(gd,t,ml,g_docbookSectionMapper.find(ml->listType()));
+    }
+  }
+  for (mli.toFirst();(ml=mli.current());++mli)
+  {
+    if ((ml->listType()&MemberListType_declarationLists)!=0)
+    {
+      generateDocbookSection(gd,t,ml,g_docbookSectionMapper.find(ml->listType()),1);
+    }
+  }
+
+  writeInnerGroupFiles(gd->getSubGroups(),t);
+
+  t << "</section>" << endl;
+
+}
+
+static void generateDocbookForDir(DirDef *dd,FTextStream &ti)
+{
+  if (dd->isReference()) return; // skip external references
+
+  QCString fileDocbook=dd->getOutputFileBase()+".xml";
+  //Add the file Documentation info to index file
+  ti << "        <xi:include href=\"" << fileDocbook << "\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl;
+
+  QCString outputDirectory = Config_getString("DOCBOOK_OUTPUT");
+  QCString fileName=outputDirectory+"/"+dd->getOutputFileBase()+".xml";
+  QFile f(fileName);
+  if (!f.open(IO_WriteOnly))
+  {
+    err("Cannot open file %s for writing!\n",fileName.data());
+    return;
+  }
+
+  FTextStream t(&f);
+  //t.setEncoding(FTextStream::UnicodeUTF8);
+  writeDocbookHeader_ID(t, dd->getOutputFileBase());
+
+  t << "    <title>";
+  writeDocbookString(t, dd->displayName());
+  t << " Directory Reference";
+  t << "</title>" << endl;
+
+  writeInnerDirs(&dd->subDirs(),t);
+  writeInnerFiles(dd->getFiles(),t);
+
+  t << "    <simplesect>" << endl;
+  t << "        <title>Detailed Description</title>" << endl;
+  writeDocbookDocBlock(t,dd->briefFile(),dd->briefLine(),dd,0,dd->briefDescription());
+  writeDocbookDocBlock(t,dd->docFile(),dd->docLine(),dd,0,dd->documentation());
+  t << "    <para>Directory location is " << dd->name() << "</para>" << endl;
+  t << "    </simplesect>" << endl;
+
+  t << "</section>" << endl;
+}
+
+static void generateDocbookForPage(PageDef *pd,FTextStream &ti,bool isExample)
+{
+  // + name
+  // + title
+  // + documentation
+
+  if (pd->isReference()) return;
+
+  QCString pageName = pd->getOutputFileBase();
+  if (pd->getGroupDef())
+  {
+    pageName+=(QCString)"_"+pd->name();
+  }
+  if (pageName=="index") 
+  {
+    pageName="mainpage"; // to prevent overwriting the generated index page.
+  }
+
+  QCString outputDirectory = Config_getString("DOCBOOK_OUTPUT");
+  QCString fileName=outputDirectory+"/"+pageName+".xml";
+  QFile f(fileName);
+  if (!f.open(IO_WriteOnly))
+  {
+    err("Cannot open file %s for writing!\n",fileName.data());
+    return;
+  }
+
+  FTextStream t(&f);
+  //t.setEncoding(FTextStream::UnicodeUTF8);
+
+  if (!pd->hasParentPage()) 
+  {
+    QCString fileDocbook=pageName+".xml";
+    //Add the file Documentation info to index file
+    ti << "        <xi:include href=\"" << fileDocbook << "\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl;
+    writeDocbookHeaderMainpage(t);
+  } 
+  else 
+  {
+    QCString pid = pageName+"_1"+pageName;
+    writeDocbookHeader_ID(t, pid);
+  }
+
+  SectionInfo *si = Doxygen::sectionDict->find(pd->name());
+  if (si)
+  {
+    t << "    <title>" << convertToXML(si->title) << "</title>" << endl;
+  } 
+  else 
+  {
+    t << "    <title>" << convertToXML(pd->name()) << "</title>" << endl;
+  }
+
+  if (isExample)
+  {
+    writeDocbookDocBlock(t,pd->docFile(),pd->docLine(),pd,0,
+        pd->documentation()+"\n&lt;include "+pd->name()+"&gt;");
+  }
+  else
+  {
+    writeDocbookDocBlock(t,pd->docFile(),pd->docLine(),pd,0,
+        pd->documentation());
+  }
+  writeInnerPages(pd->getSubPages(),t);
+
+  if (!pd->hasParentPage()) 
+  {
+    t << endl << "</chapter>" << endl;
+  } 
+  else 
+  {
+    t << endl << "</section>" << endl;
+  }
+}
+
+void generateDocbook()
+{
+
+  // + classes
+  // + namespaces
+  // + files
+  // + groups
+  // + related pages
+  // - examples
+
+  QCString outputDirectory = Config_getString("DOCBOOK_OUTPUT");
+  if (outputDirectory.isEmpty())
+  {
+    outputDirectory=QDir::currentDirPath().utf8();
+  }
+  else
+  {
+    QDir dir(outputDirectory);
+    if (!dir.exists())
+    {
+      dir.setPath(QDir::currentDirPath());
+      if (!dir.mkdir(outputDirectory))
+      {
+        err("tag DOCBOOK_OUTPUT: Output directory `%s' does not "
+            "exist and cannot be created\n",outputDirectory.data());
+        exit(1);
+      }
+      else
+      {
+        msg("Notice: Output directory `%s' does not exist. "
+            "I have created it for you.\n", outputDirectory.data());
+      }
+      dir.cd(outputDirectory);
+    }
+    outputDirectory=dir.absPath().utf8();
+  }
+
+  QDir dir(outputDirectory);
+  if (!dir.exists())
+  {
+    dir.setPath(QDir::currentDirPath());
+    if (!dir.mkdir(outputDirectory))
+    {
+      err("Cannot create directory %s\n",outputDirectory.data());
+      return;
+    }
+  }
+  QDir docbookDir(outputDirectory);
+  createSubDirs(docbookDir);
+
+  QCString fileName=outputDirectory+"/index.xml";
+  QCString dbk_projectName = Config_getString("PROJECT_NAME");
+  QFile f(fileName);
+
+  f.setName(fileName);
+  if (!f.open(IO_WriteOnly))
+  {
+    err("Cannot open file %s for writing!\n",fileName.data());
+    return;
+  }
+  FTextStream t(&f);
+  //t.setEncoding(FTextStream::UnicodeUTF8);
+
+  // write index header for Docbook which calls the structure file
+  t << "<?xml version='1.0' encoding='UTF-8' standalone='no'?>" << endl;;
+  t << "<book xmlns=\"http://docbook.org/ns/docbook\" version=\"5.0\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">" << endl;
+  t << "    <info>" << endl;
+  t << "    <title>" << dbk_projectName << "</title>" << endl;
+  t << "    </info>" << endl;
+
+  // NAMESPACE DOCUMENTATION
+
+  NamespaceSDict::Iterator nli(*Doxygen::namespaceSDict);
+  NamespaceDef *nd;
+
+  //Namespace Documentation index header
+  if (nli.toFirst()) 
+  {
+    t << "    <chapter>" << endl;
+    t << "        <title>Namespace Documentation</title>" << endl;
+  }
+
+  for (nli.toFirst();(nd=nli.current());++nli)
+  {
+    msg("Generating Docbook output for namespace %s\n",nd->name().data());
+    generateDocbookForNamespace(nd,t);
+  }
+
+  //Namespace Documentation index footer
+  if (nli.toFirst()) 
+  {
+    t << "    </chapter>" << endl;
+  }
+
+  /** MAINPAGE DOCUMENTATION **/
+
+  if (Doxygen::mainPage)
+  {
+    msg("Generating Docbook output for the main page\n");
+    generateDocbookForPage(Doxygen::mainPage,t,FALSE);
+  }
+
+  // PAGE DOCUMENTATION
+  {
+    PageSDict::Iterator pdi(*Doxygen::pageSDict);
+    PageDef *pd=0;
+
+    for (pdi.toFirst();(pd=pdi.current());++pdi)
+    {
+      msg("Generating Docbook output for page %s\n",pd->name().data());
+      generateDocbookForPage(pd,t,FALSE);
+    }
+  }
+
+  /** MODULE GROUP DOCUMENTATION **/
+
+  GroupSDict::Iterator gli(*Doxygen::groupSDict);
+  GroupDef *gd;
+
+  //Module group Documentation index header
+  if (gli.toFirst()) 
+  {
+    t << "    <chapter>" << endl;
+    t << "        <title>Module Documentation</title>" << endl;
+  }
+
+  for (;(gd=gli.current());++gli)
+  {
+    msg("Generating Docbook output for group %s\n",gd->name().data());
+    generateDocbookForGroup(gd,t);
+  }
+
+  //Module group Documentation index footer
+  if (gli.toFirst()) 
+  {
+    t << "    </chapter>" << endl;
+  }
+
+  //CLASS DOCUMENTATION
+
+  {
+    ClassSDict::Iterator cli(*Doxygen::classSDict);
+    ClassDef *cd;
+
+    //Class Documentation index header
+    if (cli.toFirst()) 
+    {
+      t << "    <chapter>" << endl;
+      t << "        <title>Class Documentation</title>" << endl;
+    }
+
+    for (cli.toFirst();(cd=cli.current());++cli)
+    {
+      generateDocbookForClass(cd,t);
+    }
+
+    //Class Documentation index footer
+    if (cli.toFirst()) 
+    {
+      t << "    </chapter>" << endl;
+    }
+  }
+
+  // FILE DOCUMENTATION
+
+  FileNameListIterator fnli(*Doxygen::inputNameList);
+  FileName *fn;
+
+  //File Documentation index header
+  if (fnli.toFirst()) 
+  {
+    t << "    <chapter>" << endl;
+    t << "        <title>File Documentation</title>" << endl;
+  }
+
+  for (;(fn=fnli.current());++fnli)
+  {
+    FileNameIterator fni(*fn);
+    FileDef *fd;
+    for (;(fd=fni.current());++fni)
+    {
+      msg("Generating Docbook output for file %s\n",fd->name().data());
+      generateDocbookForFile(fd,t);
+    }
+  }
+
+  //File Documentation index footer
+  if (fnli.toFirst()) 
+  {
+    t << "    </chapter>" << endl;
+  }
+
+  // DIRECTORY DOCUMENTATION
+
+  {
+    DirDef *dir;
+    DirSDict::Iterator sdi(*Doxygen::directories);
+
+    //Directory Documentation index header
+    if (sdi.toFirst()) 
+    {
+      t << "    <chapter>" << endl;
+      t << "        <title>Directory Documentation</title>" << endl;
+    }
+
+    for (sdi.toFirst();(dir=sdi.current());++sdi)
+    {
+      msg("Generate Docbook output for dir %s\n",dir->name().data());
+      generateDocbookForDir(dir,t);
+    }
+
+    //Module group Documentation index footer
+    if (sdi.toFirst()) 
+    {
+      t << "    </chapter>" << endl;
+    }
+  }
+
+  // EXAMPLE PAGE DOCUMENTATION
+
+  {
+    PageSDict::Iterator pdi(*Doxygen::exampleSDict);
+    PageDef *pd=0;
+
+    //Example Page Documentation index header
+    if (pdi.toFirst()) 
+    {
+      t << "    <chapter>" << endl;
+      t << "        <title>Example Documentation</title>" << endl;
+    }
+
+    for (pdi.toFirst();(pd=pdi.current());++pdi)
+    {
+      msg("Generating Docbook output for example %s\n",pd->name().data());
+      generateDocbookForPage(pd,t,TRUE);
+    }
+
+    //Example Page Documentation index footer
+    if (pdi.toFirst()) 
+    {
+      t << "    </chapter>" << endl;
+    }
+  }
+
+  t << "</book>" << endl;
+
+}
+
+
diff --git a/src/docbookgen.h b/src/docbookgen.h
new file mode 100644 (file)
index 0000000..344cb5b
--- /dev/null
@@ -0,0 +1,20 @@
+/******************************************************************************
+*
+* 
+*
+* Copyright (C) 1997-2012 by Dimitri van Heesch.
+*
+* Permission to use, copy, modify, and distribute this software and its
+* documentation under the terms of the GNU General Public License is hereby
+* granted. No representations are made about the suitability of this software
+* for any purpose. It is provided "as is" without express or implied warranty.
+* See the GNU General Public License for more details.
+*
+*/
+
+#ifndef DOCBOOKGEN_H
+#define DOCBOOKGEN_H
+
+void generateDocbook();
+
+#endif
diff --git a/src/docbookvisitor.cpp b/src/docbookvisitor.cpp
new file mode 100644 (file)
index 0000000..aa750db
--- /dev/null
@@ -0,0 +1,1397 @@
+/******************************************************************************
+ *
+ * 
+ *
+ *
+ * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#include <qfileinfo.h>
+
+#include "docbookvisitor.h"
+#include "docparser.h"
+#include "language.h"
+#include "doxygen.h"
+#include "outputgen.h"
+#include "docbookgen.h"
+#include "dot.h"
+#include "message.h"
+#include "util.h"
+#include "parserintf.h"
+#include "filename.h"
+#include "config.h"
+#include "filedef.h"
+#include "msc.h"
+
+DocbookDocVisitor::DocbookDocVisitor(FTextStream &t,CodeOutputInterface &ci)
+  : DocVisitor(DocVisitor_Docbook), m_t(t), m_ci(ci), m_insidePre(FALSE), m_hide(FALSE)
+{
+}
+
+//--------------------------------------
+// visitor functions for leaf nodes
+//--------------------------------------
+
+void DocbookDocVisitor::visit(DocWord *w)
+{
+  if (m_hide) return;
+  filter(w->word());
+}
+
+void DocbookDocVisitor::visit(DocLinkedWord *w)
+{
+  if (m_hide) return;
+  startLink(w->file(),w->anchor());
+  filter(w->word());
+  endLink();
+}
+
+void DocbookDocVisitor::visit(DocWhiteSpace *w)
+{
+  if (m_hide) return;
+  if (m_insidePre)
+  {
+    m_t << w->chars();
+  }
+  else
+  {
+    m_t << " ";
+  }
+}
+
+void DocbookDocVisitor::visit(DocSymbol *s)
+{
+  if (m_hide) return;
+  switch(s->symbol())
+  {
+    case DocSymbol::BSlash:  m_t << "\\"; break;
+    case DocSymbol::At:      m_t << "@"; break;
+    case DocSymbol::Less:    m_t << "&lt;"; break;
+    case DocSymbol::Greater: m_t << "&gt;"; break;
+    case DocSymbol::Amp:     m_t << "&amp;"; break;
+    case DocSymbol::Dollar:  m_t << "$"; break;
+    case DocSymbol::Hash:    m_t << "#"; break;
+    case DocSymbol::DoubleColon: m_t << "::"; break;
+    case DocSymbol::Percent: m_t << "%"; break;
+    case DocSymbol::Copy:    m_t << "&#x00A9;"; break;
+    case DocSymbol::Tm:      m_t << "&#8482;"; break;
+    case DocSymbol::Reg:     m_t << "&#174;"; break;
+    case DocSymbol::Apos:    m_t << "&apos;"; break;
+    case DocSymbol::Quot:    m_t << "&quot;"; break;
+    case DocSymbol::Lsquo:   m_t << "&#8216;"; break;
+    case DocSymbol::Rsquo:   m_t << "&#8217;"; break;
+    case DocSymbol::Ldquo:   m_t << "&#8220;"; break;
+    case DocSymbol::Rdquo:   m_t << "&#8221;"; break;
+    case DocSymbol::Ndash:   m_t << "&#8211;"; break;
+    case DocSymbol::Mdash:   m_t << "&#8212;"; break;
+    case DocSymbol::Uml:     m_t << "&#168;"; break;
+    case DocSymbol::Acute:   m_t << "&#180;"; break;
+    case DocSymbol::Grave:   m_t << "&#192;"; break;
+    case DocSymbol::Circ:    m_t << "&#710;"; break;
+    case DocSymbol::Tilde:   m_t << "&#732;"; break;
+    case DocSymbol::Szlig:   m_t << "&#223;"; break;
+    case DocSymbol::Cedil:   m_t << "&#184;"; break;
+    case DocSymbol::Ring:    m_t << "&#197;"; break;
+    case DocSymbol::Slash:   m_t << "&#216;"; break;
+    case DocSymbol::Nbsp:    m_t << "&#160;"; break;
+    case DocSymbol::Aelig:   m_t << "&#230;"; break;
+    case DocSymbol::AElig:   m_t << "&#198;"; break;
+    case DocSymbol::GrkGamma:      m_t << "&#915;"; break;
+    case DocSymbol::GrkDelta:      m_t << "&#916;"; break;
+    case DocSymbol::GrkTheta:      m_t << "&#920;"; break;
+    case DocSymbol::GrkLambda:     m_t << "&#923;"; break;
+    case DocSymbol::GrkXi:         m_t << "&#926;"; break;
+    case DocSymbol::GrkPi:         m_t << "&#928;"; break;
+    case DocSymbol::GrkSigma:      m_t << "&#931;"; break;
+    case DocSymbol::GrkUpsilon:    m_t << "&#933;"; break;
+    case DocSymbol::GrkPhi:        m_t << "&#934;"; break;
+    case DocSymbol::GrkPsi:        m_t << "&#936;"; break;
+    case DocSymbol::GrkOmega:      m_t << "&#937;"; break;
+    case DocSymbol::Grkalpha:      m_t << "&#945;"; break;
+    case DocSymbol::Grkbeta:       m_t << "&#946;"; break;
+    case DocSymbol::Grkgamma:      m_t << "&#947;"; break;
+    case DocSymbol::Grkdelta:      m_t << "&#948;"; break;
+    case DocSymbol::Grkepsilon:    m_t << "&#949;"; break;
+    case DocSymbol::Grkzeta:       m_t << "&#950;"; break;
+    case DocSymbol::Grketa:        m_t << "&#951;"; break;
+    case DocSymbol::Grktheta:      m_t << "&#952;"; break;
+    case DocSymbol::Grkiota:       m_t << "&#953;"; break;
+    case DocSymbol::Grkkappa:      m_t << "&#954;"; break;
+    case DocSymbol::Grklambda:     m_t << "&#955;"; break;
+    case DocSymbol::Grkmu:         m_t << "&#956;"; break;
+    case DocSymbol::Grknu:         m_t << "&#957;"; break;
+    case DocSymbol::Grkxi:         m_t << "&#958;"; break;
+    case DocSymbol::Grkpi:         m_t << "&#960;"; break;
+    case DocSymbol::Grkrho:        m_t << "&#961;"; break;
+    case DocSymbol::Grksigma:      m_t << "&#963;"; break;
+    case DocSymbol::Grktau:        m_t << "&#964;"; break;
+    case DocSymbol::Grkupsilon:    m_t << "&#965;"; break;
+    case DocSymbol::Grkphi:        m_t << "&#966;"; break;
+    case DocSymbol::Grkchi:        m_t << "&#967;"; break;
+    case DocSymbol::Grkpsi:        m_t << "&#968;"; break;
+    case DocSymbol::Grkomega:      m_t << "&#969;"; break;
+    case DocSymbol::Grkvarsigma:   m_t << "&#962;"; break;
+    case DocSymbol::Section:       m_t << "<simplesect/>"; break;
+    case DocSymbol::Degree:        m_t << "&#176;"; break;
+    case DocSymbol::Prime:         m_t << "&#8242;"; break;
+    case DocSymbol::DoublePrime:   m_t << "&#8243;"; break;
+    case DocSymbol::Infinity:      m_t << "&#8734;"; break;
+    case DocSymbol::EmptySet:      m_t << "&#8709;"; break;
+    case DocSymbol::PlusMinus:     m_t << "&#177;"; break;
+    case DocSymbol::Times:         m_t << "&#215;"; break;
+    case DocSymbol::Minus:         m_t << "&#8722;"; break;
+    case DocSymbol::CenterDot:     m_t << "&#8901;"; break;
+    case DocSymbol::Partial:       m_t << "&#8706;"; break;
+    case DocSymbol::Nabla:         m_t << "&#8711;"; break;
+    case DocSymbol::SquareRoot:    m_t << "&#8730;"; break;
+    case DocSymbol::Perpendicular: m_t << "&#8869;"; break;
+    case DocSymbol::Sum:           m_t << "&#8721;"; break;
+    case DocSymbol::Integral:      m_t << "&#8747;"; break;
+    case DocSymbol::Product:       m_t << "&#8719;"; break;
+    case DocSymbol::Similar:       m_t << "&#8764;"; break;
+    case DocSymbol::Approx:        m_t << "&#8776;"; break;
+    case DocSymbol::NotEqual:      m_t << "&#8800;"; break;
+    case DocSymbol::Equivalent:    m_t << "&#8801;"; break;
+    case DocSymbol::Proportional:  m_t << "&#8733;"; break;
+    case DocSymbol::LessEqual:     m_t << "&#8804;"; break;
+    case DocSymbol::GreaterEqual:  m_t << "&#8805;"; break;
+    case DocSymbol::LeftArrow:     m_t << "&#8592;"; break;
+    case DocSymbol::RightArrow:    m_t << "&#8594;"; break;
+    case DocSymbol::SetIn:         m_t << "&#8712;"; break;
+    case DocSymbol::SetNotIn:      m_t << "&#8713;"; break;
+    case DocSymbol::LeftCeil:      m_t << "&#8968;"; break;
+    case DocSymbol::RightCeil:     m_t << "&#8969;"; break;
+    case DocSymbol::LeftFloor:     m_t << "&#8970;"; break;
+    case DocSymbol::RightFloor:    m_t << "&#8971;"; break;
+    default:
+                                   err("unknown symbol found\n");
+  }
+}
+
+void DocbookDocVisitor::visit(DocURL *u)
+{
+  if (m_hide) return;
+  m_t << "<link xlink:href=\"";
+  if (u->isEmail()) m_t << "mailto:";
+  filter(u->url());
+  m_t << "\">";
+  filter(u->url());
+  m_t << "</link>";
+}
+
+void DocbookDocVisitor::visit(DocLineBreak *)
+{
+  if (m_hide) return;
+  m_t << endl << "<literallayout>\n</literallayout>" << endl;
+}
+
+void DocbookDocVisitor::visit(DocHorRuler *)
+{
+  if (m_hide) return;
+  m_t << "<informaltable frame='bottom'><tgroup cols='1'><colspec align='center'/><tbody><row><entry align='center'>\n";
+  m_t << "</entry></row></tbody></tgroup></informaltable>\n";
+}
+
+void DocbookDocVisitor::visit(DocStyleChange *s)
+{
+  if (m_hide) return;
+  switch (s->style())
+  {
+    case DocStyleChange::Bold:
+      if (s->enable()) m_t << "<emphasis role=\"bold\">";      else m_t << "</emphasis>";
+      break;
+    case DocStyleChange::Italic:
+      if (s->enable()) m_t << "<emphasis>";     else m_t << "</emphasis>";
+      break;
+    case DocStyleChange::Code:
+      if (s->enable()) m_t << "<computeroutput>";   else m_t << "</computeroutput>";
+      break;
+    case DocStyleChange::Subscript:
+      if (s->enable()) m_t << "<subscript>";    else m_t << "</subscript>";
+      break;
+    case DocStyleChange::Superscript:
+      if (s->enable()) m_t << "<superscript>";    else m_t << "</superscript>";
+      break;
+    case DocStyleChange::Center:
+      if (s->enable()) m_t << "<informaltable frame='none'><tgroup cols='1'><colspec align='center'/><tbody><row><entry align='center'>";
+      else m_t << "</entry></row></tbody></tgroup></informaltable>";
+      break;
+    case DocStyleChange::Preformatted:
+      if (s->enable())
+      {
+        m_t << "<literallayout>";
+        m_insidePre=TRUE;
+      }
+      else
+      {
+        m_t << "</literallayout>";
+        m_insidePre=FALSE;
+      }
+      break;
+      /* There is no equivalent Docbook tag for rendering Small text */
+    case DocStyleChange::Small: /* XSLT Stylesheets can be used */ break;
+                                                                   /* HTML only */
+    case DocStyleChange::Div:  /* HTML only */ break;
+    case DocStyleChange::Span: /* HTML only */ break;
+  }
+}
+
+void DocbookDocVisitor::visit(DocVerbatim *s)
+{
+  if (m_hide) return;
+  switch(s->type())
+  {
+    case DocVerbatim::Code: // fall though
+      m_t << "<programlisting>";
+      Doxygen::parserManager->getParser(m_langExt)
+        ->parseCode(m_ci,s->context(),s->text(),
+            s->isExample(),s->exampleFile());
+      m_t << "</programlisting>";
+      break;
+    case DocVerbatim::Verbatim:
+      m_t << "<programlisting><literallayout>";
+      filter(s->text());
+      m_t << "</literallayout></programlisting>";
+      break;
+    case DocVerbatim::HtmlOnly:    
+      break;
+    case DocVerbatim::RtfOnly:     
+      break;
+    case DocVerbatim::ManOnly:     
+      break;
+    case DocVerbatim::LatexOnly:   
+      break;
+    case DocVerbatim::XmlOnly:     
+      break;
+    case DocVerbatim::DocbookOnly: 
+      break;
+      m_t << s->text();
+      break;
+    case DocVerbatim::Dot:
+      {
+        static int dotindex = 1;
+        QCString baseName(4096);
+        QCString stext = s->text();
+        m_t << "<para>" << endl;
+        baseName.sprintf("%s%d",
+            (Config_getString("DOCBOOK_OUTPUT")+"/inline_dotgraph_").data(),
+            dotindex++
+            );
+        QFile file(baseName+".dot");
+        if (!file.open(IO_WriteOnly))
+        {
+          err("Could not open file %s.msc for writing\n",baseName.data());
+        }
+        file.writeBlock( stext, stext.length() );
+        file.close();
+        m_t << "    <figure>" << endl;
+        m_t << "        <title></title>" << endl;
+        m_t << "        <mediaobject>" << endl;
+        m_t << "            <imageobject>" << endl;
+        writeDotFile(baseName);
+        m_t << "            </imageobject>" << endl;
+        m_t << "       </mediaobject>" << endl;
+        m_t << "    </figure>" << endl;
+        m_t << "</para>" << endl;
+      }
+      break;
+    case DocVerbatim::Msc:
+      static int mscindex = 1;
+      QCString baseName(4096);
+      QCString stext = s->text();
+      m_t << "<para>" << endl;
+      baseName.sprintf("%s%d",
+          (Config_getString("DOCBOOK_OUTPUT")+"/inline_mscgraph_").data(),
+          mscindex++
+          );
+      QFile file(baseName+".msc");
+      if (!file.open(IO_WriteOnly))
+      {
+        err("Could not open file %s.msc for writing\n",baseName.data());
+      }
+      QCString text = "msc {";
+      text+=stext;
+      text+="}";
+      file.writeBlock( text, text.length() );
+      file.close();
+      m_t << "    <figure>" << endl;
+      m_t << "        <title></title>" << endl;
+      m_t << "        <mediaobject>" << endl;
+      m_t << "            <imageobject>" << endl;
+      writeMscFile(baseName);
+      m_t << "            </imageobject>" << endl;
+      m_t << "       </mediaobject>" << endl;
+      m_t << "    </figure>" << endl;
+      m_t << "</para>" << endl;
+      break;
+  }
+}
+
+void DocbookDocVisitor::visit(DocAnchor *anc)
+{
+  if (m_hide) return;
+  m_t << "<anchor id=\"" << anc->file() << "_1" << anc->anchor() << "\"/>";
+}
+
+void DocbookDocVisitor::visit(DocInclude *inc)
+{
+  if (m_hide) return;
+  switch(inc->type())
+  {
+    case DocInclude::IncWithLines:
+      {
+        m_t << "<programlisting>";
+        QFileInfo cfi( inc->file() );
+        FileDef fd( cfi.dirPath().utf8(), cfi.fileName().utf8() );
+        Doxygen::parserManager->getParser(inc->extension())
+          ->parseCode(m_ci,inc->context(),
+              inc->text(),
+              inc->isExample(),
+              inc->exampleFile(), &fd);
+        m_t << "</programlisting>";
+      }
+      break;
+    case DocInclude::Include:
+      m_t << "<programlisting>";
+      Doxygen::parserManager->getParser(inc->extension())
+        ->parseCode(m_ci,inc->context(),
+            inc->text(),
+            inc->isExample(),
+            inc->exampleFile());
+      m_t << "</programlisting>";
+      break;
+    case DocInclude::DontInclude:
+      break;
+    case DocInclude::HtmlInclude:
+      break;
+    case DocInclude::VerbInclude:
+      m_t << "<verbatim>";
+      filter(inc->text());
+      m_t << "</verbatim>";
+      break;
+    case DocInclude::Snippet:
+      m_t << "<programlisting>";
+      Doxygen::parserManager->getParser(inc->extension())
+        ->parseCode(m_ci,
+            inc->context(),
+            extractBlock(inc->text(),inc->blockId()),
+            inc->isExample(),
+            inc->exampleFile()
+            );
+      m_t << "</programlisting>";
+      break;
+  }
+}
+
+void DocbookDocVisitor::visit(DocIncOperator *op)
+{
+  if (op->isFirst())
+  {
+    if (!m_hide)
+    {
+      m_t << "<programlisting>";
+    }
+    pushEnabled();
+    m_hide = TRUE;
+  }
+  if (op->type()!=DocIncOperator::Skip)
+  {
+    popEnabled();
+    if (!m_hide)
+    {
+      Doxygen::parserManager->getParser(m_langExt)
+        ->parseCode(m_ci,op->context(),
+            op->text(),op->isExample(),
+            op->exampleFile());
+    }
+    pushEnabled();
+    m_hide=TRUE;
+  }
+  if (op->isLast())
+  {
+    popEnabled();
+    if (!m_hide) m_t << "</programlisting>";
+  }
+  else
+  {
+    if (!m_hide) m_t << endl;
+  }
+}
+
+void DocbookDocVisitor::visit(DocFormula *f)
+{
+  if (m_hide) return;
+  m_t << "<equation><title>" << f->name() << "</title>";
+  filter(f->text());
+  m_t << "</equation>";
+}
+
+void DocbookDocVisitor::visit(DocIndexEntry *ie)
+{
+  if (m_hide) return;
+  m_t << "<indexentry><primaryie>" << endl;
+  filter(ie->entry());
+  m_t << "</primaryie><secondaryie></secondaryie></indexentry>" << endl;
+}
+
+void DocbookDocVisitor::visit(DocSimpleSectSep *)
+{
+  m_t << "<simplesect/>";
+}
+
+void DocbookDocVisitor::visit(DocCite *cite)
+{
+  if (m_hide) return;
+  if (!cite->file().isEmpty()) startLink(cite->file(),cite->anchor());
+  filter(cite->text());
+  if (!cite->file().isEmpty()) endLink();
+}
+
+//--------------------------------------
+// visitor functions for compound nodes
+//--------------------------------------
+
+void DocbookDocVisitor::visitPre(DocAutoList *l)
+{
+  if (m_hide) return;
+  if (l->isEnumList())
+  {
+    m_t << "<orderedlist>\n";
+  }
+  else
+  {
+    m_t << "<itemizedlist>\n";
+  }
+}
+
+void DocbookDocVisitor::visitPost(DocAutoList *l)
+{
+  if (m_hide) return;
+  if (l->isEnumList())
+  {
+    m_t << "</orderedlist>\n";
+  }
+  else
+  {
+    m_t << "</itemizedlist>\n";
+  }
+}
+
+void DocbookDocVisitor::visitPre(DocAutoListItem *)
+{
+  if (m_hide) return;
+  m_t << "<listitem>";
+}
+
+void DocbookDocVisitor::visitPost(DocAutoListItem *)
+{
+  if (m_hide) return;
+  m_t << "</listitem>";
+}
+
+void DocbookDocVisitor::visitPre(DocPara *)
+{
+  if (m_hide) return;
+  m_t << endl;
+  m_t << "<para>";
+}
+
+void DocbookDocVisitor::visitPost(DocPara *)
+{
+  if (m_hide) return;
+  m_t << "</para>";
+  m_t << endl;
+}
+
+void DocbookDocVisitor::visitPre(DocRoot *)
+{
+  //m_t << "<hr><h4><font color=\"red\">New parser:</font></h4>\n";
+}
+
+void DocbookDocVisitor::visitPost(DocRoot *)
+{
+  //m_t << "<hr><h4><font color=\"red\">Old parser:</font></h4>\n";
+}
+
+void DocbookDocVisitor::visitPre(DocSimpleSect *s)
+{
+  if (m_hide) return;
+  switch(s->type())
+  {
+    case DocSimpleSect::See:
+      if (m_insidePre) 
+      {
+        m_t << "<formalpara><title>" << theTranslator->trSeeAlso() << ": </title>" << endl;
+      } 
+      else 
+      {
+        m_t << "<formalpara><title>" << convertToXML(theTranslator->trSeeAlso()) << ": </title>" << endl;
+      }
+      break;
+    case DocSimpleSect::Return:
+      if (m_insidePre) 
+      {
+        m_t << "<formalpara><title>" << theTranslator->trReturns()<< ": </title>" << endl;
+      } 
+      else 
+      {
+        m_t << "<formalpara><title>" << convertToXML(theTranslator->trReturns()) << ": </title>" << endl;
+      }
+      break;
+    case DocSimpleSect::Author:
+      if (m_insidePre) 
+      {
+        m_t << "<formalpara><title>" << theTranslator->trAuthor(TRUE, TRUE) << ": </title>" << endl;
+      } 
+      else 
+      {
+        m_t << "<formalpara><title>" << convertToXML(theTranslator->trAuthor(TRUE, TRUE)) << ": </title>" << endl;
+      }
+      break;
+    case DocSimpleSect::Authors:
+      if (m_insidePre) 
+      {
+        m_t << "<formalpara><title>" << theTranslator->trAuthor(TRUE, FALSE) << ": </title>" << endl;
+      } 
+      else 
+      {
+        m_t << "<formalpara><title>" << convertToXML(theTranslator->trAuthor(TRUE, FALSE)) << ": </title>" << endl;
+      }
+      break;
+    case DocSimpleSect::Version:
+      if (m_insidePre) 
+      {
+        m_t << "<formalpara><title>" << theTranslator->trVersion() << ": </title>" << endl;
+      } 
+      else 
+      {
+        m_t << "<formalpara><title>" << convertToXML(theTranslator->trVersion()) << ": </title>" << endl;
+      }
+      break;
+    case DocSimpleSect::Since:
+      if (m_insidePre) 
+      {
+        m_t << "<formalpara><title>" << theTranslator->trSince() << ": </title>" << endl;
+      } 
+      else 
+      {
+        m_t << "<formalpara><title>" << convertToXML(theTranslator->trSince()) << ": </title>" << endl;
+      }
+      break;
+    case DocSimpleSect::Date:
+      if (m_insidePre) 
+      {
+        m_t << "<formalpara><title>" << theTranslator->trDate() << ": </title>" << endl;
+      } 
+      else 
+      {
+        m_t << "<formalpara><title>" << convertToXML(theTranslator->trDate()) << ": </title>" << endl;
+      }
+      break;
+    case DocSimpleSect::Note:
+      if (m_insidePre) 
+      {
+        m_t << "<formalpara><title>" << theTranslator->trNote() << ": </title>" << endl;
+      } 
+      else 
+      {
+        m_t << "<formalpara><title>" << convertToXML(theTranslator->trNote()) << ": </title>" << endl;
+      }
+      break;
+    case DocSimpleSect::Warning:
+      if (m_insidePre) 
+      {
+        m_t << "<formalpara><title>" << theTranslator->trWarning() << ": </title>" << endl;
+      } 
+      else 
+      {
+        m_t << "<formalpara><title>" << convertToXML(theTranslator->trWarning()) << ": </title>" << endl;
+      }
+      break;
+    case DocSimpleSect::Pre:
+      if (m_insidePre) 
+      {
+        m_t << "<formalpara><title>" << theTranslator->trPrecondition() << ": </title>" << endl;
+      } 
+      else 
+      {
+        m_t << "<formalpara><title>" << convertToXML(theTranslator->trPrecondition()) << ": </title>" << endl;
+      }
+      break;
+    case DocSimpleSect::Post:
+      if (m_insidePre) 
+      {
+        m_t << "<formalpara><title>" << theTranslator->trPostcondition() << ": </title>" << endl;
+      } 
+      else 
+      {
+        m_t << "<formalpara><title>" << convertToXML(theTranslator->trPostcondition()) << ": </title>" << endl;
+      }
+      break;
+    case DocSimpleSect::Copyright:
+      if (m_insidePre) 
+      {
+        m_t << "<formalpara><title>" << theTranslator->trCopyright() << ": </title>" << endl;
+      } 
+      else 
+      {
+        m_t << "<formalpara><title>" << convertToXML(theTranslator->trCopyright()) << ": </title>" << endl;
+      }
+      break;
+    case DocSimpleSect::Invar:
+      if (m_insidePre) 
+      {
+        m_t << "<formalpara><title>" << theTranslator->trInvariant() << ": </title>" << endl;
+      } 
+      else 
+      {
+        m_t << "<formalpara><title>" << convertToXML(theTranslator->trInvariant()) << ": </title>" << endl;
+      }
+      break;
+    case DocSimpleSect::Remark:
+      if (m_insidePre) 
+      {
+        m_t << "<formalpara><title>" << theTranslator->trRemarks() << ": </title>" << endl;
+      } 
+      else 
+      {
+        m_t << "<formalpara><title>" << convertToXML(theTranslator->trRemarks()) << ": </title>" << endl;
+      }
+      break;
+    case DocSimpleSect::Attention:
+      if (m_insidePre) 
+      {
+        m_t << "<formalpara><title>" << theTranslator->trAttention() << ": </title>" << endl;
+      } 
+      else 
+      {
+        m_t << "<formalpara><title>" << convertToXML(theTranslator->trAttention()) << ": </title>" << endl;
+      }
+      break;
+    case DocSimpleSect::User:
+      m_t << "<formalpara><title></title>" << endl;
+      break;
+    case DocSimpleSect::Rcs:
+      m_t << "<formalpara><title></title>" << endl;
+      break;
+    case DocSimpleSect::Unknown: m_t << "<formalpara><title></title>" << endl; break;
+  }
+}
+
+void DocbookDocVisitor::visitPost(DocSimpleSect *)
+{
+  if (m_hide) return;
+  m_t << "</formalpara>" << endl;
+}
+
+void DocbookDocVisitor::visitPre(DocTitle *)
+{
+  if (m_hide) return;
+  m_t << "<title>";
+}
+
+void DocbookDocVisitor::visitPost(DocTitle *)
+{
+  if (m_hide) return;
+  m_t << "</title>";
+}
+
+void DocbookDocVisitor::visitPre(DocSimpleList *)
+{
+  if (m_hide) return;
+  m_t << "<itemizedlist>\n";
+}
+
+void DocbookDocVisitor::visitPost(DocSimpleList *)
+{
+  if (m_hide) return;
+  m_t << "</itemizedlist>\n";
+}
+
+void DocbookDocVisitor::visitPre(DocSimpleListItem *)
+{
+  if (m_hide) return;
+  m_t << "<listitem>";
+}
+
+void DocbookDocVisitor::visitPost(DocSimpleListItem *)
+{
+  if (m_hide) return;
+  m_t << "</listitem>\n";
+}
+
+void DocbookDocVisitor::visitPre(DocSection *s)
+{
+  if (m_hide) return;
+  m_t << "<section xml:id=\"" << s->file();
+  if (!s->anchor().isEmpty()) m_t << "_1" << s->anchor();
+  m_t << "\">" << endl;
+  m_t << "<title>";
+  filter(s->title());
+  m_t << "</title>" << endl;
+}
+
+void DocbookDocVisitor::visitPost(DocSection *)
+{
+  m_t << "</section>\n";
+}
+
+void DocbookDocVisitor::visitPre(DocHtmlList *s)
+{
+  if (m_hide) return;
+  if (s->type()==DocHtmlList::Ordered)
+    m_t << "<orderedlist>\n";
+  else
+    m_t << "<itemizedlist>\n";
+}
+
+void DocbookDocVisitor::visitPost(DocHtmlList *s)
+{
+  if (m_hide) return;
+  if (s->type()==DocHtmlList::Ordered)
+    m_t << "</orderedlist>\n";
+  else
+    m_t << "</itemizedlist>\n";
+}
+
+void DocbookDocVisitor::visitPre(DocHtmlListItem *)
+{
+  if (m_hide) return;
+  m_t << "<listitem>\n";
+}
+
+void DocbookDocVisitor::visitPost(DocHtmlListItem *)
+{
+  if (m_hide) return;
+  m_t << "</listitem>\n";
+}
+
+void DocbookDocVisitor::visitPre(DocHtmlDescList *)
+{
+  if (m_hide) return;
+  m_t << "<variablelist>\n";
+}
+
+void DocbookDocVisitor::visitPost(DocHtmlDescList *)
+{
+  if (m_hide) return;
+  m_t << "</variablelist>\n";
+}
+
+void DocbookDocVisitor::visitPre(DocHtmlDescTitle *)
+{
+  if (m_hide) return;
+  m_t << "<varlistentry><term>";
+}
+
+void DocbookDocVisitor::visitPost(DocHtmlDescTitle *)
+{
+  if (m_hide) return;
+  m_t << "</term>\n";
+}
+
+void DocbookDocVisitor::visitPre(DocHtmlDescData *)
+{
+  if (m_hide) return;
+  m_t << "<listitem>";
+}
+
+void DocbookDocVisitor::visitPost(DocHtmlDescData *)
+{
+  if (m_hide) return;
+  m_t << "</listitem></varlistentry>\n";
+}
+
+void DocbookDocVisitor::visitPre(DocHtmlTable *t)
+{
+  if (m_hide) return;
+  m_t << "<table frame=\"all\">" << endl;
+  m_t << "    <title></title>" << endl;
+  m_t << "    <tgroup cols=\"" << t->numColumns() << "\" align=\"left\" colsep=\"1\" rowsep=\"1\">" << endl;
+  m_t << "    <tbody>" << endl;
+}
+
+void DocbookDocVisitor::visitPost(DocHtmlTable *)
+{
+  if (m_hide) return;
+  m_t << "    </tbody>" << endl;
+  m_t << "    </tgroup>" << endl;
+  m_t << "</table>" << endl;
+}
+
+void DocbookDocVisitor::visitPre(DocHtmlRow *)
+{
+  if (m_hide) return;
+  m_t << "<row>\n";
+}
+
+void DocbookDocVisitor::visitPost(DocHtmlRow *)
+{
+  if (m_hide) return;
+  m_t << "</row>\n";
+}
+
+void DocbookDocVisitor::visitPre(DocHtmlCell *)
+{
+  if (m_hide) return;
+  m_t << "<entry>";
+}
+
+void DocbookDocVisitor::visitPost(DocHtmlCell *)
+{
+  if (m_hide) return;
+  m_t << "</entry>";
+}
+
+void DocbookDocVisitor::visitPre(DocHtmlCaption *)
+{
+  if (m_hide) return;
+  m_t << "<caption>";
+}
+
+void DocbookDocVisitor::visitPost(DocHtmlCaption *)
+{
+  if (m_hide) return;
+  m_t << "</caption>\n";
+}
+
+void DocbookDocVisitor::visitPre(DocInternal *)
+{
+  if (m_hide) return;
+  // TODO: to be implemented
+}
+
+void DocbookDocVisitor::visitPost(DocInternal *)
+{
+  if (m_hide) return;
+  // TODO: to be implemented
+}
+
+void DocbookDocVisitor::visitPre(DocHRef *href)
+{
+  if (m_hide) return;
+  m_t << "<link xlink:href=\"" << href->url() << "\">";
+}
+
+void DocbookDocVisitor::visitPost(DocHRef *)
+{
+  if (m_hide) return;
+  m_t << "</link>";
+}
+
+void DocbookDocVisitor::visitPre(DocHtmlHeader *)
+{
+  if (m_hide) return;
+  m_t << "<formalpara><title>";
+}
+
+void DocbookDocVisitor::visitPost(DocHtmlHeader *)
+{
+  if (m_hide) return;
+  m_t << "</title></formalpara>\n";
+}
+
+void DocbookDocVisitor::visitPre(DocImage *img)
+{
+  if (img->type()==DocImage::Latex)
+  {
+    if (m_hide) return;
+    m_t << endl;
+    m_t << "    <figure>" << endl;
+    m_t << "        <title>";
+  } 
+  else 
+  {
+    pushEnabled();
+    m_hide=TRUE;
+  }
+}
+
+void DocbookDocVisitor::visitPost(DocImage *img)
+{
+  if (img->type()==DocImage::Latex)
+  {
+    if (m_hide) return;
+    QCString typevar;
+    m_t << "</title>" << endl;
+    m_t << "    <mediaobject>" << endl;
+    m_t << "        <imageobject>" << endl;
+    QCString baseName=img->name();
+    int i;
+    if ((i=baseName.findRev('/'))!=-1 || (i=baseName.findRev('\\'))!=-1)
+    {
+      baseName=baseName.right(baseName.length()-i-1);
+    }
+    m_t << "            <imagedata";
+    if (!img->width().isEmpty())
+    {
+      m_t << " width=\"";
+      filter(img->width());
+      m_t << "\"";
+    }
+    else if (!img->height().isEmpty())
+    {
+      m_t << " depth=\"";
+      filter(img->height());
+      m_t << "\"";
+    }
+    m_t << " align=\"center\" fileref=\"" << baseName << "\">";
+    m_t << "</imagedata>" << endl;
+    m_t << "        </imageobject>" << endl;
+    m_t << "    </mediaobject>" << endl;
+    m_t << "    </figure>" << endl;
+    // copy the image to the output dir
+    QCString m_file;
+    bool ambig;
+    FileDef *fd=findFileDef(Doxygen::imageNameDict, baseName, ambig);
+    if (fd) 
+    {
+      m_file=fd->absFilePath();
+    }
+    QFile inImage(m_file);
+    QFile outImage(Config_getString("DOCBOOK_OUTPUT")+"/"+baseName.data());
+    if (inImage.open(IO_ReadOnly))
+    {
+      if (outImage.open(IO_WriteOnly))
+      {
+        char *buffer = new char[inImage.size()];
+        inImage.readBlock(buffer,inImage.size());
+        outImage.writeBlock(buffer,inImage.size());
+        outImage.flush();
+        delete[] buffer;
+      }
+    }
+  } 
+  else 
+  {
+    popEnabled();
+  }
+}
+
+void DocbookDocVisitor::visitPre(DocDotFile *df)
+{
+  if (m_hide) return;
+  startDotFile(df->file(),df->width(),df->height(),df->hasCaption());
+}
+
+void DocbookDocVisitor::visitPost(DocDotFile *df)
+{
+  if (m_hide) return;
+  endDotFile(df->hasCaption());
+}
+
+void DocbookDocVisitor::visitPre(DocMscFile *df)
+{
+  if (m_hide) return;
+  startMscFile(df->file(),df->width(),df->height(),df->hasCaption());
+}
+
+void DocbookDocVisitor::visitPost(DocMscFile *df)
+{
+  if (m_hide) return;
+  endMscFile(df->hasCaption());
+}
+void DocbookDocVisitor::visitPre(DocLink *lnk)
+{
+  if (m_hide) return;
+  startLink(lnk->file(),lnk->anchor());
+}
+
+void DocbookDocVisitor::visitPost(DocLink *)
+{
+  if (m_hide) return;
+  endLink();
+}
+
+void DocbookDocVisitor::visitPre(DocRef *ref)
+{
+  if (m_hide) return;
+  if (!ref->file().isEmpty()) startLink(ref->file(),ref->anchor());
+  if (!ref->hasLinkText()) filter(ref->targetTitle());
+}
+
+void DocbookDocVisitor::visitPost(DocRef *ref)
+{
+  if (m_hide) return;
+  if (!ref->file().isEmpty()) endLink();
+}
+
+void DocbookDocVisitor::visitPre(DocSecRefItem *ref)
+{
+  if (m_hide) return;
+  m_t << "<tocitem id=\"" << ref->file() << "_1" << ref->anchor() << "\">";
+}
+
+void DocbookDocVisitor::visitPost(DocSecRefItem *)
+{
+  if (m_hide) return;
+  m_t << "</tocitem>" << endl;
+}
+
+void DocbookDocVisitor::visitPre(DocSecRefList *)
+{
+  if (m_hide) return;
+  m_t << "<toclist>" << endl;
+}
+
+void DocbookDocVisitor::visitPost(DocSecRefList *)
+{
+  if (m_hide) return;
+  m_t << "</toclist>" << endl;
+}
+
+void DocbookDocVisitor::visitPre(DocParamSect *s)
+{
+  if (m_hide) return;
+  switch(s->type())
+  {
+    case DocParamSect::Param:
+      {
+        m_t <<  endl;
+        m_t << "                <formalpara>" << endl;
+        m_t << "                    <title/>" << endl;
+        m_t << "                    <table frame=\"all\">" << endl;
+        m_t << "                        <title>Parameters</title>" << endl;
+        m_t << "                        <tgroup cols=\"2\" align=\"left\" colsep=\"1\" rowsep=\"1\">" << endl;
+        m_t << "                        <tbody>" << endl;
+        break;
+      }
+    case DocParamSect::RetVal:
+      {
+        m_t <<  endl;
+        m_t << "                <formalpara>" << endl;
+        m_t << "                    <title/>" << endl;
+        m_t << "                    <table frame=\"all\">" << endl;
+        m_t << "                        <title>Parameters</title>" << endl;
+        m_t << "                        <tgroup cols=\"2\" align=\"left\" colsep=\"1\" rowsep=\"1\">" << endl;
+        m_t << "                        <tbody>" << endl;
+        break;
+      }
+    case DocParamSect::Exception:
+      m_t << "exception"; break;
+    case DocParamSect::TemplateParam:
+      m_t << "templateparam"; break;
+    default:
+      ASSERT(0);
+  }
+}
+
+void DocbookDocVisitor::visitPost(DocParamSect *)
+{
+  if (m_hide) return;
+  m_t << "                        </tbody>" << endl;
+  m_t << "                        </tgroup>" << endl;
+  m_t << "                    </table>" << endl;
+  m_t << "                </formalpara>" << endl;
+  m_t << "                ";
+}
+
+void DocbookDocVisitor::visitPre(DocParamList *pl)
+{
+  if (m_hide) return;
+  QListIterator<DocNode> li(pl->parameters());
+  DocNode *param;
+  m_t << "                            <row>" << endl;
+  if (!li.toFirst()) 
+  {
+    m_t << "                                <entry></entry>" << endl;
+  } 
+  else 
+  {
+    m_t << "                                <entry>";
+    int cnt = 0;
+    for (li.toFirst();(param=li.current());++li)
+    {
+      if (cnt) 
+      {
+        m_t << ", ";
+      }
+      if (param->kind()==DocNode::Kind_Word)
+      {
+        visit((DocWord*)param);
+      }
+      else if (param->kind()==DocNode::Kind_LinkedWord)
+      {
+        visit((DocLinkedWord*)param);
+      }
+      cnt++;
+    }
+    m_t << "</entry>" << endl;
+  }
+  m_t << "                                <entry>";
+}
+
+void DocbookDocVisitor::visitPost(DocParamList *)
+{
+  if (m_hide) return;
+  m_t << "</entry>" << endl;
+  m_t << "                            </row>" << endl;
+}
+
+void DocbookDocVisitor::visitPre(DocXRefItem *x)
+{
+  if (m_hide) return;
+  m_t << "<para><link linkend=\"";
+  m_t << x->file() << "_1" << x->anchor();
+  m_t << "\">";
+  filter(x->title());
+  m_t << "</link>";
+  m_t << " ";
+}
+
+void DocbookDocVisitor::visitPost(DocXRefItem *)
+{
+  if (m_hide) return;
+  m_t << "</para>";
+}
+
+void DocbookDocVisitor::visitPre(DocInternalRef *ref)
+{
+  if (m_hide) return;
+  startLink(ref->file(),ref->anchor());
+}
+
+void DocbookDocVisitor::visitPost(DocInternalRef *)
+{
+  if (m_hide) return;
+  endLink();
+  m_t << " ";
+}
+
+void DocbookDocVisitor::visitPre(DocCopy *)
+{
+  if (m_hide) return;
+  // TODO: to be implemented
+}
+
+
+void DocbookDocVisitor::visitPost(DocCopy *)
+{
+  if (m_hide) return;
+  // TODO: to be implemented
+}
+
+
+void DocbookDocVisitor::visitPre(DocText *)
+{
+  // TODO: to be implemented
+}
+
+
+void DocbookDocVisitor::visitPost(DocText *)
+{
+  // TODO: to be implemented
+}
+
+
+void DocbookDocVisitor::visitPre(DocHtmlBlockQuote *)
+{
+  if (m_hide) return;
+  m_t << "<blockquote>";
+}
+
+void DocbookDocVisitor::visitPost(DocHtmlBlockQuote *)
+{
+  if (m_hide) return;
+  m_t << "</blockquote>";
+}
+
+void DocbookDocVisitor::visitPre(DocVhdlFlow *)
+{
+  // TODO: to be implemented
+}
+
+
+void DocbookDocVisitor::visitPost(DocVhdlFlow *)
+{
+  // TODO: to be implemented
+}
+
+void DocbookDocVisitor::filter(const char *str)
+{
+  m_t << convertToXML(str);
+}
+
+void DocbookDocVisitor::startLink(const QCString &file,const QCString &anchor)
+{
+  m_t << "<link linkend=\"" << file;
+  if (!anchor.isEmpty()) m_t << "_1" << anchor;
+  m_t << "\">";
+}
+
+void DocbookDocVisitor::endLink()
+{
+  m_t << "</link>";
+}
+
+void DocbookDocVisitor::pushEnabled()
+{
+  m_enabled.push(new bool(m_hide));
+}
+
+void DocbookDocVisitor::popEnabled()
+{
+  bool *v=m_enabled.pop();
+  ASSERT(v!=0);
+  m_hide = *v;
+  delete v;
+}
+
+void DocbookDocVisitor::writeMscFile(const QCString &baseName)
+{
+  QCString shortName = baseName;
+  int i;
+  if ((i=shortName.findRev('/'))!=-1)
+  {
+    shortName=shortName.right(shortName.length()-i-1);
+  }
+  QCString outDir = Config_getString("DOCBOOK_OUTPUT");
+  writeMscGraphFromFile(baseName+".msc",outDir,shortName,MSC_BITMAP);
+  m_t << "                <imagedata";
+  m_t << " align=\"center\" fileref=\"" << shortName << ".png" << "\">";
+  m_t << "</imagedata>" << endl;
+}
+
+void DocbookDocVisitor::startMscFile(const QCString &fileName,
+    const QCString &width,
+    const QCString &height,
+    bool hasCaption
+    )
+{
+  QCString baseName=fileName;
+  int i;
+  if ((i=baseName.findRev('/'))!=-1)
+  {
+    baseName=baseName.right(baseName.length()-i-1);
+  }
+  if ((i=baseName.find('.'))!=-1)
+  {
+    baseName=baseName.left(i);
+  }
+  baseName.prepend("msc_");
+  QCString outDir = Config_getString("DOCBOOK_OUTPUT");
+  writeMscGraphFromFile(fileName,outDir,baseName,MSC_BITMAP);
+  m_t << "<para>" << endl;
+  m_t << "    <figure>" << endl;
+  m_t << "        <title></title>" << endl;
+  m_t << "        <mediaobject>" << endl;
+  m_t << "            <imageobject>" << endl;
+  m_t << "                <imagedata";
+  if (!width.isEmpty())
+  {
+    m_t << " width=\"";
+    m_t << width;
+    m_t << "\"";
+  }
+  else if (!height.isEmpty())
+  {
+    m_t << " depth=\"";
+    m_t << height;
+    m_t << "\"";
+  }
+  m_t << " align=\"center\" fileref=\"" << baseName << ".png" << "\">";
+  m_t << "</imagedata>" << endl;
+  m_t << "            </imageobject>" << endl;
+  if (hasCaption)
+  {
+    m_t << "        <caption>" << endl;
+  }
+}
+
+void DocbookDocVisitor::endMscFile(bool hasCaption)
+{
+  if (m_hide) return;
+  m_t << "endl";
+  if (hasCaption)
+  {
+    m_t << "        </caption>" << endl;
+  }
+  m_t << "        </mediaobject>" << endl;
+  m_t << "    </figure>" << endl;
+  m_t << "</para>" << endl;
+}
+
+void DocbookDocVisitor::writeDotFile(const QCString &baseName)
+{
+  QCString shortName = baseName;
+  int i;
+  if ((i=shortName.findRev('/'))!=-1)
+  {
+    shortName=shortName.right(shortName.length()-i-1);
+  }
+  QCString outDir = Config_getString("DOCBOOK_OUTPUT");
+  writeDotGraphFromFile(baseName+".dot",outDir,shortName,BITMAP);
+  m_t << "                <imagedata";
+  m_t << " align=\"center\" fileref=\"" << shortName << ".png" << "\">";
+  m_t << "</imagedata>" << endl;
+}
+
+void DocbookDocVisitor::startDotFile(const QCString &fileName,
+    const QCString &width,
+    const QCString &height,
+    bool hasCaption
+    )
+{
+  QCString baseName=fileName;
+  int i;
+  if ((i=baseName.findRev('/'))!=-1)
+  {
+    baseName=baseName.right(baseName.length()-i-1);
+  }
+  if ((i=baseName.find('.'))!=-1)
+  {
+    baseName=baseName.left(i);
+  }
+  baseName.prepend("dot_");
+  QCString outDir = Config_getString("DOCBOOK_OUTPUT");
+  writeDotGraphFromFile(fileName,outDir,baseName,BITMAP);
+  m_t << "<para>" << endl;
+  m_t << "    <figure>" << endl;
+  m_t << "        <title></title>" << endl;
+  m_t << "        <mediaobject>" << endl;
+  m_t << "            <imageobject>" << endl;
+  m_t << "                <imagedata";
+  if (!width.isEmpty())
+  {
+    m_t << " width=\"";
+    m_t << width;
+    m_t << "\"";
+  }
+  else if (!height.isEmpty())
+  {
+    m_t << " depth=\"";
+    m_t << height;
+    m_t << "\"";
+  }
+  m_t << " align=\"center\" fileref=\"" << baseName << ".png" << "\">";
+  m_t << "</imagedata>" << endl;
+  m_t << "            </imageobject>" << endl;
+  if (hasCaption)
+  {
+    m_t << "        <caption>" << endl;
+  }
+}
+
+void DocbookDocVisitor::endDotFile(bool hasCaption)
+{
+  if (m_hide) return;
+  m_t << "endl";
+  if (hasCaption)
+  {
+    m_t << "        </caption>" << endl;
+  }
+  m_t << "        </mediaobject>" << endl;
+  m_t << "    </figure>" << endl;
+  m_t << "</para>" << endl;
+}
+
diff --git a/src/docbookvisitor.h b/src/docbookvisitor.h
new file mode 100644 (file)
index 0000000..c79301d
--- /dev/null
@@ -0,0 +1,161 @@
+/******************************************************************************
+*
+* 
+*
+* Copyright (C) 1997-2012 by Dimitri van Heesch.
+*
+* Permission to use, copy, modify, and distribute this software and its
+* documentation under the terms of the GNU General Public License is hereby
+* granted. No representations are made about the suitability of this software
+* for any purpose. It is provided "as is" without express or implied warranty.
+* See the GNU General Public License for more details.
+*
+* Documents produced by Doxygen are derivative works derived from the
+* input used in their production; they are not affected by this license.
+*
+*/
+
+#ifndef _DOCBOOKDOCVISITOR_H
+#define _DOCBOOKDOCVISITOR_H
+
+#include "docvisitor.h"
+#include <qstack.h>
+#include <qcstring.h>
+
+class FTextStream;
+class CodeOutputInterface;
+class QCString;
+
+/*! @brief Concrete visitor implementation for Docbook output. */
+class DocbookDocVisitor : public DocVisitor
+{
+    public:
+    DocbookDocVisitor(FTextStream &t,CodeOutputInterface &ci);
+    //--------------------------------------
+    // visitor functions for leaf nodes
+    //--------------------------------------
+    void visit(DocWord *);
+    void visit(DocLinkedWord *);
+    void visit(DocWhiteSpace *);
+    void visit(DocSymbol *);
+    void visit(DocURL *);
+    void visit(DocLineBreak *);
+    void visit(DocHorRuler *);
+    void visit(DocStyleChange *);
+    void visit(DocVerbatim *);
+    void visit(DocAnchor *);
+    void visit(DocInclude *);
+    void visit(DocIncOperator *);
+    void visit(DocFormula *);
+    void visit(DocIndexEntry *);
+    void visit(DocSimpleSectSep *);
+    void visit(DocCite *);
+    //--------------------------------------
+    // visitor functions for compound nodes
+    //--------------------------------------
+    void visitPre(DocAutoList *);
+    void visitPost(DocAutoList *);
+    void visitPre(DocAutoListItem *);
+    void visitPost(DocAutoListItem *);
+    void visitPre(DocPara *) ;
+    void visitPost(DocPara *);
+    void visitPre(DocRoot *);
+    void visitPost(DocRoot *);
+    void visitPre(DocSimpleSect *);
+    void visitPost(DocSimpleSect *);
+    void visitPre(DocTitle *);
+    void visitPost(DocTitle *);
+    void visitPre(DocSimpleList *);
+    void visitPost(DocSimpleList *);
+    void visitPre(DocSimpleListItem *);
+    void visitPost(DocSimpleListItem *);
+    void visitPre(DocSection *);
+    void visitPost(DocSection *);
+    void visitPre(DocHtmlList *);
+    void visitPost(DocHtmlList *) ;
+    void visitPre(DocHtmlListItem *);
+    void visitPost(DocHtmlListItem *);
+    //void visitPre(DocHtmlPre *);
+    //void visitPost(DocHtmlPre *);
+    void visitPre(DocHtmlDescList *);
+    void visitPost(DocHtmlDescList *);
+    void visitPre(DocHtmlDescTitle *);
+    void visitPost(DocHtmlDescTitle *);
+    void visitPre(DocHtmlDescData *);
+    void visitPost(DocHtmlDescData *);
+    void visitPre(DocHtmlTable *);
+    void visitPost(DocHtmlTable *);
+    void visitPre(DocHtmlRow *);
+    void visitPost(DocHtmlRow *) ;
+    void visitPre(DocHtmlCell *);
+    void visitPost(DocHtmlCell *);
+    void visitPre(DocHtmlCaption *);
+    void visitPost(DocHtmlCaption *);
+    void visitPre(DocInternal *);
+    void visitPost(DocInternal *);
+    void visitPre(DocHRef *);
+    void visitPost(DocHRef *);
+    void visitPre(DocHtmlHeader *);
+    void visitPost(DocHtmlHeader *);
+    void visitPre(DocImage *);
+    void visitPost(DocImage *);
+    void visitPre(DocDotFile *);
+    void visitPost(DocDotFile *);
+    void visitPre(DocMscFile *);
+    void visitPost(DocMscFile *);
+    void visitPre(DocLink *);
+    void visitPost(DocLink *);
+    void visitPre(DocRef *);
+    void visitPost(DocRef *);
+    void visitPre(DocSecRefItem *);
+    void visitPost(DocSecRefItem *);
+    void visitPre(DocSecRefList *);
+    void visitPost(DocSecRefList *);
+    //void visitPre(DocLanguage *);
+    //void visitPost(DocLanguage *);
+    void visitPre(DocParamSect *);
+    void visitPost(DocParamSect *);
+    void visitPre(DocParamList *);
+    void visitPost(DocParamList *);
+    void visitPre(DocXRefItem *);
+    void visitPost(DocXRefItem *);
+    void visitPre(DocInternalRef *);
+    void visitPost(DocInternalRef *);
+    void visitPre(DocCopy *);
+    void visitPost(DocCopy *);
+    void visitPre(DocText *);
+    void visitPost(DocText *);
+    void visitPre(DocHtmlBlockQuote *);
+    void visitPost(DocHtmlBlockQuote *);
+    void visitPre(DocVhdlFlow *);
+    void visitPost(DocVhdlFlow *);
+    private:
+    //--------------------------------------
+    // helper functions
+    //--------------------------------------
+    void filter(const char *str);
+    void startLink(const QCString &file,
+    const QCString &anchor);
+    void endLink();
+    void pushEnabled();
+    void popEnabled();
+    void startMscFile(const QCString &fileName,const QCString &width,
+    const QCString &height, bool hasCaption);
+    void endMscFile(bool hasCaption);
+    void writeMscFile(const QCString &fileName);
+    void startDotFile(const QCString &fileName,const QCString &width,
+    const QCString &height, bool hasCaption);
+    void endDotFile(bool hasCaption);
+    void writeDotFile(const QCString &fileName);
+    //--------------------------------------
+    // state variables
+    //--------------------------------------
+    FTextStream &m_t;
+    CodeOutputInterface &m_ci;
+    bool m_insidePre;
+    bool m_hide;
+    QStack<bool> m_enabled;
+    QCString m_langExt;
+};
+
+#endif
index c4f42f3..1cc3b3c 100644 (file)
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -283,14 +283,14 @@ static QCString findAndCopyImage(const char *fileName,DocImage::Type type)
         else
         {
           warn_doc_error(g_fileName,doctokenizerYYlineno,
-              "warning: could not write output image %s",qPrint(outputFile));
+              "could not write output image %s",qPrint(outputFile));
         }
       }
     }
     else
     {
       warn_doc_error(g_fileName,doctokenizerYYlineno,
-         "warning: could not open image %s",qPrint(fileName));
+         "could not open image %s",qPrint(fileName));
     }
 
     if (type==DocImage::Latex && Config_getBool("USE_PDFLATEX") && 
@@ -306,7 +306,7 @@ static QCString findAndCopyImage(const char *fileName,DocImage::Type type)
       portable_sysTimerStart();
       if (portable_system("epstopdf",epstopdfArgs)!=0)
       {
-       err("error: Problems running epstopdf. Check your TeX installation!\n");
+       err("Problems running epstopdf. Check your TeX installation!\n");
       }
       portable_sysTimerStop();
       return baseName;
@@ -315,7 +315,7 @@ static QCString findAndCopyImage(const char *fileName,DocImage::Type type)
   else if (ambig)
   {
     QCString text;
-    text.sprintf("warning: image file name %s is ambiguous.\n",qPrint(fileName));
+    text.sprintf("image file name %s is ambiguous.\n",qPrint(fileName));
     text+="Possible candidates:\n";
     text+=showFileDefMatches(Doxygen::imageNameDict,fileName);
     warn_doc_error(g_fileName,doctokenizerYYlineno,text);
@@ -326,7 +326,7 @@ static QCString findAndCopyImage(const char *fileName,DocImage::Type type)
     if (result.left(5)!="http:" && result.left(6)!="https:")
     {
       warn_doc_error(g_fileName,doctokenizerYYlineno,
-           "warning: image file %s is not found in IMAGE_PATH: "  
+           "image file %s is not found in IMAGE_PATH: "  
           "assuming external image.",qPrint(fileName)
           );
     }
@@ -344,7 +344,7 @@ static void checkArgumentName(const QCString &name,bool isParam)
 {                
   if (!Config_getBool("WARN_IF_DOC_ERROR")) return;
   if (g_memberDef==0) return; // not a member
-  LockingPtr<ArgumentList> al=g_memberDef->isDocsForDefinition() ? 
+  ArgumentList *al=g_memberDef->isDocsForDefinition() ? 
                   g_memberDef->argumentList() :
                    g_memberDef->declArgumentList();
   SrcLangExt lang = g_memberDef->getLanguage();
@@ -393,9 +393,9 @@ static void checkArgumentName(const QCString &name,bool isParam)
         docLine = g_memberDef->getDefLine();
         
       }
-      QCString alStr = argListToString(al.pointer());
+      QCString alStr = argListToString(al);
       warn_doc_error(docFile,docLine,
-         "warning: argument '%s' of command @param "
+         "argument '%s' of command @param "
          "is not found in the argument list of %s%s%s%s",
          qPrint(aName), qPrint(scope), qPrint(g_memberDef->name()),
          qPrint(alStr), qPrint(inheritedFrom));
@@ -413,7 +413,7 @@ static void checkUndocumentedParams()
 {
   if (g_memberDef && g_hasParamCommand && Config_getBool("WARN_IF_DOC_ERROR"))
   {
-    LockingPtr<ArgumentList> al=g_memberDef->isDocsForDefinition() ? 
+    ArgumentList *al=g_memberDef->isDocsForDefinition() ? 
       g_memberDef->argumentList() :
       g_memberDef->declArgumentList();
     SrcLangExt lang = g_memberDef->getLanguage();
@@ -442,9 +442,9 @@ static void checkUndocumentedParams()
       {
         bool first=TRUE;
         QCString errMsg=
-            "warning: The following parameters of "+
+            "The following parameters of "+
             QCString(g_memberDef->qualifiedName()) + 
-            QCString(argListToString(al.pointer())) +
+            QCString(argListToString(al)) +
             " are not documented:\n";
         for (ali.toFirst();(a=ali.current());++ali)
         {
@@ -494,8 +494,8 @@ static void detectNoDocumentedParams()
 {
   if (g_memberDef && Config_getBool("WARN_NO_PARAMDOC"))
   {
-    LockingPtr<ArgumentList> al     = g_memberDef->argumentList();
-    LockingPtr<ArgumentList> declAl = g_memberDef->declArgumentList();
+    ArgumentList *al     = g_memberDef->argumentList();
+    ArgumentList *declAl = g_memberDef->declArgumentList();
     QCString returnType   = g_memberDef->typeString();
     bool isPython = g_memberDef->getLanguage()==SrcLangExt_Python;
 
@@ -808,7 +808,7 @@ static int handleStyleArgument(DocNode *parent,QList<DocNode> &children,
   int tok=doctokenizerYYlex();
   if (tok!=TK_WHITESPACE)
   {
-    warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected whitespace after %s command",
+    warn_doc_error(g_fileName,doctokenizerYYlineno,"expected whitespace after %s command",
        qPrint(cmdName));
     return tok;
   }
@@ -831,11 +831,11 @@ static int handleStyleArgument(DocNode *parent,QList<DocNode> &children,
       switch (tok)
       {
         case TK_COMMAND: 
-         warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Illegal command \\%s as the argument of a \\%s command",
+         warn_doc_error(g_fileName,doctokenizerYYlineno,"Illegal command \\%s as the argument of a \\%s command",
               qPrint(g_token->name),qPrint(cmdName));
           break;
         case TK_SYMBOL: 
-         warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unsupported symbol %s found while handling command %s",
+         warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported symbol %s found while handling command %s",
                qPrint(g_token->name),qPrint(cmdName));
           break;
         case TK_HTMLTAG:
@@ -846,7 +846,7 @@ static int handleStyleArgument(DocNode *parent,QList<DocNode> &children,
           return tok;
           break;
         default:
-         warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected token %s while handling command %s",
+         warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected token %s while handling command %s",
               tokToString(tok),qPrint(cmdName));
           break;
       }
@@ -884,17 +884,17 @@ static void handleStyleLeave(DocNode *parent,QList<DocNode> &children,
   {
     if (g_styleStack.isEmpty())
     {
-      warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: found </%s> tag without matching <%s>",
+      warn_doc_error(g_fileName,doctokenizerYYlineno,"found </%s> tag without matching <%s>",
           qPrint(tagName),qPrint(tagName));
     }
     else if (g_styleStack.top()->style()!=s)
     {
-      warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: found </%s> tag while expecting </%s>",
+      warn_doc_error(g_fileName,doctokenizerYYlineno,"found </%s> tag while expecting </%s>",
           qPrint(tagName),qPrint(g_styleStack.top()->styleString()));
     }
     else
     {
-      warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: found </%s> at different nesting level (%d) than expected (%d)",
+      warn_doc_error(g_fileName,doctokenizerYYlineno,"found </%s> at different nesting level (%d) than expected (%d)",
           qPrint(tagName),g_nodeStack.count(),g_styleStack.top()->position());
     }
   }
@@ -952,7 +952,7 @@ static int handleAHref(DocNode *parent,QList<DocNode> &children,const HtmlAttrib
       }
       else
       {
-        warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: found <a> tag with name option but without value!");
+        warn_doc_error(g_fileName,doctokenizerYYlineno,"found <a> tag with name option but without value!");
       }
     }
     else if (opt->name=="href") // <a href=url>..</a> tag
@@ -1002,7 +1002,7 @@ static void handleUnclosedStyleCommands()
     g_initialStyleStack.pop();
     handleUnclosedStyleCommands();
     warn_doc_error(g_fileName,doctokenizerYYlineno,
-             "warning: end of comment block while expecting "
+             "end of comment block while expecting "
              "command </%s>",qPrint(sc->styleString()));
   }
 }
@@ -1124,7 +1124,7 @@ static void handleLinkedWord(DocNode *parent,QList<DocNode> &children)
   {
     if (g_token->name.left(1)=="#" || g_token->name.left(2)=="::")
     {
-      warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: explicit link request to '%s' could not be resolved",qPrint(name));
+      warn_doc_error(g_fileName,doctokenizerYYlineno,"explicit link request to '%s' could not be resolved",qPrint(name));
       children.append(new DocWord(parent,g_token->name));
     }
     else
@@ -1157,7 +1157,7 @@ static DocInternalRef *handleInternalRef(DocNode *parent)
   QCString tokenName = g_token->name;
   if (tok!=TK_WHITESPACE)
   {
-    warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected whitespace after %s command",
+    warn_doc_error(g_fileName,doctokenizerYYlineno,"expected whitespace after %s command",
         qPrint(tokenName));
     return 0;
   }
@@ -1165,7 +1165,7 @@ static DocInternalRef *handleInternalRef(DocNode *parent)
   tok=doctokenizerYYlex(); // get the reference id
   if (tok!=TK_WORD && tok!=TK_LNKWORD)
   {
-    warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected token %s as the argument of %s",
+    warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected token %s as the argument of %s",
         tokToString(tok),qPrint(tokenName));
     return 0;
   }
@@ -1177,7 +1177,7 @@ static DocAnchor *handleAnchor(DocNode *parent)
   int tok=doctokenizerYYlex();
   if (tok!=TK_WHITESPACE)
   {
-    warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected whitespace after %s command",
+    warn_doc_error(g_fileName,doctokenizerYYlineno,"expected whitespace after %s command",
         qPrint(g_token->name));
     return 0;
   }
@@ -1185,13 +1185,13 @@ static DocAnchor *handleAnchor(DocNode *parent)
   tok=doctokenizerYYlex();
   if (tok==0)
   {
-    warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected end of comment block while parsing the "
+    warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected end of comment block while parsing the "
         "argument of command %s",qPrint(g_token->name));
     return 0;
   }
   else if (tok!=TK_WORD && tok!=TK_LNKWORD)
   {
-    warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected token %s as the argument of %s",
+    warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected token %s as the argument of %s",
         tokToString(tok),qPrint(g_token->name));
     return 0;
   }
@@ -1306,7 +1306,7 @@ reparsetoken:
             doctokenizerYYsetStateHtmlOnly();
             tok = doctokenizerYYlex();
             children.append(new DocVerbatim(parent,g_context,g_token->verb,DocVerbatim::HtmlOnly,g_isExample,g_exampleName));
-            if (tok==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: htmlonly section ended without end marker");
+            if (tok==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"htmlonly section ended without end marker");
             doctokenizerYYsetStatePara();
           }
           break;
@@ -1315,7 +1315,7 @@ reparsetoken:
             doctokenizerYYsetStateManOnly();
             tok = doctokenizerYYlex();
             children.append(new DocVerbatim(parent,g_context,g_token->verb,DocVerbatim::ManOnly,g_isExample,g_exampleName));
-            if (tok==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: manonly section ended without end marker");
+            if (tok==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"manonly section ended without end marker");
             doctokenizerYYsetStatePara();
           }
           break;
@@ -1324,7 +1324,7 @@ reparsetoken:
             doctokenizerYYsetStateRtfOnly();
             tok = doctokenizerYYlex();
             children.append(new DocVerbatim(parent,g_context,g_token->verb,DocVerbatim::RtfOnly,g_isExample,g_exampleName));
-            if (tok==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: rtfonly section ended without end marker");
+            if (tok==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"rtfonly section ended without end marker");
             doctokenizerYYsetStatePara();
           }
           break;
@@ -1333,7 +1333,7 @@ reparsetoken:
             doctokenizerYYsetStateLatexOnly();
             tok = doctokenizerYYlex();
             children.append(new DocVerbatim(parent,g_context,g_token->verb,DocVerbatim::LatexOnly,g_isExample,g_exampleName));
-            if (tok==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: latexonly section ended without end marker",doctokenizerYYlineno);
+            if (tok==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"latexonly section ended without end marker",doctokenizerYYlineno);
             doctokenizerYYsetStatePara();
           }
           break;
@@ -1342,7 +1342,16 @@ reparsetoken:
             doctokenizerYYsetStateXmlOnly();
             tok = doctokenizerYYlex();
             children.append(new DocVerbatim(parent,g_context,g_token->verb,DocVerbatim::XmlOnly,g_isExample,g_exampleName));
-            if (tok==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: xmlonly section ended without end marker",doctokenizerYYlineno);
+            if (tok==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"xmlonly section ended without end marker",doctokenizerYYlineno);
+            doctokenizerYYsetStatePara();
+          }
+          break;
+        case CMD_DBONLY:
+          {
+            doctokenizerYYsetStateDbOnly();
+            tok = doctokenizerYYlex();
+            children.append(new DocVerbatim(parent,g_context,g_token->verb,DocVerbatim::DocbookOnly,g_isExample,g_exampleName));
+            if (tok==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"xmlonly section ended without end marker",doctokenizerYYlineno);
             doctokenizerYYsetStatePara();
           }
           break;
@@ -1381,10 +1390,10 @@ reparsetoken:
         switch (Mappers::htmlTagMapper->map(tokenName))
         {
           case HTML_DIV:
-            warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: found <div> tag in heading\n");
+            warn_doc_error(g_fileName,doctokenizerYYlineno,"found <div> tag in heading\n");
             break;
           case HTML_PRE:
-            warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: found <pre> tag in heading\n");
+            warn_doc_error(g_fileName,doctokenizerYYlineno,"found <pre> tag in heading\n");
             break;
           case HTML_BOLD:
             if (!g_token->endTag)
@@ -1517,6 +1526,67 @@ handlepara:
   return TRUE;
 }
 
+//---------------------------------------------------------------------------
+
+static int handleDocCopy(DocNode *parent,QList<DocNode> &children)
+{
+  int tok=doctokenizerYYlex();
+  int cmdId = Mappers::cmdMapper->map(g_token->name);
+  if (tok!=TK_WHITESPACE)
+  {
+    warn_doc_error(g_fileName,doctokenizerYYlineno,"expected whitespace after %s command",
+        qPrint(g_token->name));
+    return 0;
+  }
+  tok=doctokenizerYYlex();
+  if (tok==0)
+  {
+    warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected end of comment block while parsing the "
+        "argument of command %s\n", qPrint(g_token->name));
+    return 0;
+  }
+  else if (tok!=TK_WORD && tok!=TK_LNKWORD)
+  {
+    warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected token %s as the argument of %s",
+        tokToString(tok),qPrint(g_token->name));
+    return 0;
+  }
+  DocCopy *cpy = new DocCopy(parent,g_token->name,
+      cmdId==CMD_COPYDOC || cmdId==CMD_COPYBRIEF,
+      cmdId==CMD_COPYDOC || cmdId==CMD_COPYDETAILS);
+  cpy->parse(children);
+  delete cpy;
+  return TK_NEWPARA;
+}
+
+//---------------------------------------------------------------------------
+
+static void handleImg(DocNode *parent,QList<DocNode> &children,const HtmlAttribList &tagHtmlAttribs)
+{
+  HtmlAttribListIterator li(tagHtmlAttribs);
+  HtmlAttrib *opt;
+  bool found=FALSE;
+  int index=0;
+  for (li.toFirst();(opt=li.current());++li,++index)
+  {
+    //printf("option name=%s value=%s\n",opt->name.data(),opt->value.data());
+    if (opt->name=="src" && !opt->value.isEmpty())
+    {
+      // copy attributes
+      HtmlAttribList attrList = tagHtmlAttribs;
+      // and remove the src attribute
+      bool result = attrList.remove(index);
+      ASSERT(result);
+      DocImage *img = new DocImage(parent,attrList,opt->value,DocImage::Html,opt->value);
+      children.append(img);
+      found = TRUE;
+    }
+  }
+  if (!found)
+  {
+    warn_doc_error(g_fileName,doctokenizerYYlineno,"IMG tag does not have a SRC attribute!\n");
+  }
+}
 
 //---------------------------------------------------------------------------
 
@@ -1687,6 +1757,10 @@ static int internalValidatingParseDoc(DocNode *parent,QList<DocNode> &children,
     {
       delete par;
     }
+    if (retval==RetVal_CopyDoc)
+    {
+      retval=handleDocCopy(parent,children);
+    }
   } while (retval==TK_NEWPARA);
   if (lastPar) lastPar->markLast();
 
@@ -1723,14 +1797,14 @@ static void readTextFileByName(const QCString &file,QCString &text)
   }
   else if (ambig)
   {
-    warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: included file name %s is ambiguous"
+    warn_doc_error(g_fileName,doctokenizerYYlineno,"included file name %s is ambiguous"
            "Possible candidates:\n%s",qPrint(file),
            qPrint(showFileDefMatches(Doxygen::exampleNameDict,file))
           );
   }
   else
   {
-    warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: included file %s is not found. "
+    warn_doc_error(g_fileName,doctokenizerYYlineno,"included file %s is not found. "
            "Check your EXAMPLE_PATH",qPrint(file));
   }
 }
@@ -1740,7 +1814,7 @@ static void readTextFileByName(const QCString &file,QCString &text)
 DocWord::DocWord(DocNode *parent,const QCString &word) : 
       m_word(word) 
 {
-   m_parent = parent; 
+  m_parent = parent; 
   //printf("new word %s url=%s\n",word.data(),g_searchUrl.data());
   if (Doxygen::searchIndex && !g_searchUrl.isEmpty())
   {
@@ -1773,7 +1847,7 @@ DocAnchor::DocAnchor(DocNode *parent,const QCString &id,bool newAnchor)
   m_parent = parent; 
   if (id.isEmpty())
   {
-    warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Empty anchor label");
+    warn_doc_error(g_fileName,doctokenizerYYlineno,"Empty anchor label");
   }
   if (newAnchor) // found <a name="label">
   {
@@ -1789,7 +1863,7 @@ DocAnchor::DocAnchor(DocNode *parent,const QCString &id,bool newAnchor)
     }
     else 
     {
-      warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Invalid cite anchor id `%s'",qPrint(id));
+      warn_doc_error(g_fileName,doctokenizerYYlineno,"Invalid cite anchor id `%s'",qPrint(id));
       m_anchor = "invalid";
       m_file = "invalid";
     }
@@ -1810,7 +1884,7 @@ DocAnchor::DocAnchor(DocNode *parent,const QCString &id,bool newAnchor)
     }
     else
     {
-      warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Invalid anchor id `%s'",qPrint(id));
+      warn_doc_error(g_fileName,doctokenizerYYlineno,"Invalid anchor id `%s'",qPrint(id));
       m_anchor = "invalid";
       m_file = "invalid";
     }
@@ -1860,7 +1934,7 @@ void DocInclude::parse()
       int count;
       if (!m_blockId.isEmpty() && (count=m_text.contains(m_blockId.data()))!=2)
       {
-        warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: block marked with %s for \\snippet should appear twice in file %s, found it %d times\n",
+        warn_doc_error(g_fileName,doctokenizerYYlineno,"block marked with %s for \\snippet should appear twice in file %s, found it %d times\n",
             m_blockId.data(),m_file.data(),count);
       }
       break;
@@ -2070,13 +2144,13 @@ void DocCopy::parse(QList<DocNode> &children)
     }
     else // oops, recursion
     {
-      warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: recursive call chain of \\copydoc commands detected at %d\n",
+      warn_doc_error(g_fileName,doctokenizerYYlineno,"recursive call chain of \\copydoc commands detected at %d\n",
           doctokenizerYYlineno);
     }
   }
   else
   {
-    warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: target %s of \\copydoc command not found",
+    warn_doc_error(g_fileName,doctokenizerYYlineno,"target %s of \\copydoc command not found",
         qPrint(m_link));
   }
 }
@@ -2193,15 +2267,15 @@ void DocSecRefItem::parse()
       switch (tok)
       {
         case TK_COMMAND: 
-          warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Illegal command %s as part of a \\refitem",
+          warn_doc_error(g_fileName,doctokenizerYYlineno,"Illegal command %s as part of a \\refitem",
               qPrint(g_token->name));
           break;
         case TK_SYMBOL: 
-         warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unsupported symbol %s found",
+         warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported symbol %s found",
                qPrint(g_token->name));
           break;
         default:
-         warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected token %s",
+         warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected token %s",
               tokToString(tok));
           break;
       }
@@ -2225,13 +2299,13 @@ void DocSecRefItem::parse()
     }
     else
     {
-      warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: reference to unknown section %s",
+      warn_doc_error(g_fileName,doctokenizerYYlineno,"reference to unknown section %s",
           qPrint(m_target));
     }
   } 
   else
   {
-    warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: reference to empty target");
+    warn_doc_error(g_fileName,doctokenizerYYlineno,"reference to empty target");
   }
   
   DBG(("DocSecRefItem::parse() end\n"));
@@ -2261,13 +2335,13 @@ void DocSecRefList::parse()
             int tok=doctokenizerYYlex();
             if (tok!=TK_WHITESPACE)
             {
-              warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected whitespace after \\refitem command");
+              warn_doc_error(g_fileName,doctokenizerYYlineno,"expected whitespace after \\refitem command");
               break;
             }
             tok=doctokenizerYYlex();
             if (tok!=TK_WORD && tok!=TK_LNKWORD)
             {
-              warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected token %s as the argument of \\refitem",
+              warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected token %s as the argument of \\refitem",
                   tokToString(tok));
               break;
             }
@@ -2280,7 +2354,7 @@ void DocSecRefList::parse()
         case CMD_ENDSECREFLIST:
           goto endsecreflist;
         default:
-          warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Illegal command %s as part of a \\secreflist",
+          warn_doc_error(g_fileName,doctokenizerYYlineno,"Illegal command %s as part of a \\secreflist",
               qPrint(g_token->name));
           goto endsecreflist;
       }
@@ -2291,7 +2365,7 @@ void DocSecRefList::parse()
     }
     else
     {
-      warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected token %s inside section reference list",
+      warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected token %s inside section reference list",
           tokToString(tok));
       goto endsecreflist;
     }
@@ -2335,15 +2409,15 @@ void DocInternalRef::parse()
       switch (tok)
       {
         case TK_COMMAND: 
-          warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Illegal command %s as part of a \\ref",
+          warn_doc_error(g_fileName,doctokenizerYYlineno,"Illegal command %s as part of a \\ref",
               qPrint(g_token->name));
           break;
         case TK_SYMBOL: 
-         warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unsupported symbol %s found",
+         warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported symbol %s found",
                qPrint(g_token->name));
           break;
         default:
-         warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected token %s",
+         warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected token %s",
                tokToString(tok));
           break;
       }
@@ -2430,7 +2504,7 @@ DocRef::DocRef(DocNode *parent,const QCString &target,const QCString &context) :
     }
   }
   m_text = target;
-  warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unable to resolve reference to `%s' for \\ref command",
+  warn_doc_error(g_fileName,doctokenizerYYlineno,"unable to resolve reference to `%s' for \\ref command",
            qPrint(target)); 
 }
 
@@ -2476,17 +2550,17 @@ void DocRef::parse()
       switch (tok)
       {
         case TK_COMMAND: 
-          warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Illegal command %s as part of a \\ref",
+          warn_doc_error(g_fileName,doctokenizerYYlineno,"Illegal command %s as part of a \\ref",
               qPrint(g_token->name));
           break;
         case TK_SYMBOL: 
-         warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unsupported symbol %s found",
+         warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported symbol %s found",
                qPrint(g_token->name));
           break;
         case TK_HTMLTAG:
           break;
         default:
-         warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected token %s",
+         warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected token %s",
                tokToString(tok));
           break;
       }
@@ -2532,7 +2606,7 @@ DocCite::DocCite(DocNode *parent,const QCString &target,const QCString &) //cont
     return;
   }
   m_text = linkToText(SrcLangExt_Unknown,target,FALSE);
-  warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unable to resolve reference to `%s' for \\cite command",
+  warn_doc_error(g_fileName,doctokenizerYYlineno,"unable to resolve reference to `%s' for \\cite command",
            qPrint(target)); 
 }
 
@@ -2570,7 +2644,7 @@ DocLink::DocLink(DocNode *parent,const QCString &target)
   }
 
   // bogus link target
-  warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unable to resolve link to `%s' for \\link command",
+  warn_doc_error(g_fileName,doctokenizerYYlineno,"unable to resolve link to `%s' for \\link command",
          qPrint(target)); 
 }
 
@@ -2594,23 +2668,23 @@ QCString DocLink::parse(bool isJavaLink,bool isXmlLink)
             case CMD_ENDLINK:
               if (isJavaLink)
               {
-                warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: {@link.. ended with @endlink command");
+                warn_doc_error(g_fileName,doctokenizerYYlineno,"{@link.. ended with @endlink command");
               }
               goto endlink;
             default:
-              warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Illegal command %s as part of a \\link",
+              warn_doc_error(g_fileName,doctokenizerYYlineno,"Illegal command %s as part of a \\link",
                   qPrint(g_token->name));
               break;
           }
           break;
         case TK_SYMBOL: 
-          warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unsupported symbol %s found",
+          warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported symbol %s found",
               qPrint(g_token->name));
           break;
         case TK_HTMLTAG:
           if (g_token->name!="see" || !isXmlLink)
           {
-            warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected xml/html command %s found",
+            warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected xml/html command %s found",
                 qPrint(g_token->name));
           }
           goto endlink;
@@ -2638,7 +2712,7 @@ QCString DocLink::parse(bool isJavaLink,bool isXmlLink)
           m_children.append(new DocWord(this,g_token->name));
           break;
         default:
-          warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected token %s",
+          warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected token %s",
              tokToString(tok));
         break;
       }
@@ -2646,7 +2720,7 @@ QCString DocLink::parse(bool isJavaLink,bool isXmlLink)
   }
   if (tok==0)
   {
-    warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected end of comment while inside"
+    warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected end of comment while inside"
            " link command\n"); 
   }
 endlink:
@@ -2686,15 +2760,15 @@ void DocDotFile::parse()
       switch (tok)
       {
         case TK_COMMAND: 
-          warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Illegal command %s as part of a \\dotfile",
+          warn_doc_error(g_fileName,doctokenizerYYlineno,"Illegal command %s as part of a \\dotfile",
               qPrint(g_token->name));
           break;
         case TK_SYMBOL: 
-         warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unsupported symbol %s found",
+         warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported symbol %s found",
                qPrint(g_token->name));
           break;
         default:
-         warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected token %s",
+         warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected token %s",
                tokToString(tok));
           break;
       }
@@ -2713,7 +2787,7 @@ void DocDotFile::parse()
     }
     else 
     {
-      warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unknown option %s after image title",
+      warn_doc_error(g_fileName,doctokenizerYYlineno,"Unknown option %s after image title",
             qPrint(g_token->name));
     }
     tok=doctokenizerYYlex();
@@ -2734,14 +2808,14 @@ void DocDotFile::parse()
   }
   else if (ambig)
   {
-    warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: included dot file name %s is ambiguous.\n"
+    warn_doc_error(g_fileName,doctokenizerYYlineno,"included dot file name %s is ambiguous.\n"
            "Possible candidates:\n%s",qPrint(m_name),
            qPrint(showFileDefMatches(Doxygen::exampleNameDict,m_name))
           );
   }
   else
   {
-    warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: included dot file %s is not found "
+    warn_doc_error(g_fileName,doctokenizerYYlineno,"included dot file %s is not found "
            "in any of the paths specified via DOTFILE_DIRS!",qPrint(m_name));
   }
 
@@ -2770,15 +2844,15 @@ void DocMscFile::parse()
       switch (tok)
       {
         case TK_COMMAND: 
-          warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Illegal command %s as part of a \\mscfile",
+          warn_doc_error(g_fileName,doctokenizerYYlineno,"Illegal command %s as part of a \\mscfile",
               qPrint(g_token->name));
           break;
         case TK_SYMBOL: 
-         warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unsupported symbol %s found",
+         warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported symbol %s found",
                qPrint(g_token->name));
           break;
         default:
-         warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected token %s",
+         warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected token %s",
                tokToString(tok));
           break;
       }
@@ -2797,7 +2871,7 @@ void DocMscFile::parse()
     }
     else 
     {
-      warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unknown option %s after image title",
+      warn_doc_error(g_fileName,doctokenizerYYlineno,"Unknown option %s after image title",
             qPrint(g_token->name));
     }
     tok=doctokenizerYYlex();
@@ -2818,14 +2892,14 @@ void DocMscFile::parse()
   }
   else if (ambig)
   {
-    warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: included msc file name %s is ambiguous.\n"
+    warn_doc_error(g_fileName,doctokenizerYYlineno,"included msc file name %s is ambiguous.\n"
            "Possible candidates:\n%s",qPrint(m_name),
            qPrint(showFileDefMatches(Doxygen::exampleNameDict,m_name))
           );
   }
   else
   {
-    warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: included msc file %s is not found "
+    warn_doc_error(g_fileName,doctokenizerYYlineno,"included msc file %s is not found "
            "in any of the paths specified via MSCFILE_DIRS!",qPrint(m_name));
   }
 
@@ -2855,15 +2929,15 @@ void DocVhdlFlow::parse()
       switch (tok)
       {
         case TK_COMMAND: 
-          warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Illegal command %s as part of a \\mscfile",
+          warn_doc_error(g_fileName,doctokenizerYYlineno,"Illegal command %s as part of a \\mscfile",
               qPrint(g_token->name));
           break;
         case TK_SYMBOL: 
-         warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unsupported symbol %s found",
+         warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported symbol %s found",
                qPrint(g_token->name));
           break;
         default:
-         warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected token %s",
+         warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected token %s",
                tokToString(tok));
           break;
       }
@@ -2916,15 +2990,15 @@ void DocImage::parse()
       switch (tok)
       {
         case TK_COMMAND: 
-          warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Illegal command %s as part of a \\image",
+          warn_doc_error(g_fileName,doctokenizerYYlineno,"Illegal command %s as part of a \\image",
               qPrint(g_token->name));
           break;
         case TK_SYMBOL: 
-          warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unsupported symbol %s found",
+          warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported symbol %s found",
               qPrint(g_token->name));
           break;
         default:
-          warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected token %s",
+          warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected token %s",
               tokToString(tok));
           break;
       }
@@ -2944,7 +3018,7 @@ void DocImage::parse()
     }
     else 
     {
-      warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unknown option %s after image title",
+      warn_doc_error(g_fileName,doctokenizerYYlineno,"Unknown option %s after image title",
           qPrint(g_token->name));
     }
     tok=doctokenizerYYlex();
@@ -2974,7 +3048,7 @@ int DocHtmlHeader::parse()
       switch (tok)
       {
         case TK_COMMAND: 
-          warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Illegal command %s as part of a <h%d> tag",
+          warn_doc_error(g_fileName,doctokenizerYYlineno,"Illegal command %s as part of a <h%d> tag",
               qPrint(g_token->name),m_level);
           break;
         case TK_HTMLTAG:
@@ -2984,7 +3058,7 @@ int DocHtmlHeader::parse()
             {
               if (m_level!=1)
               {
-                warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: <h%d> ended with </h1>",
+                warn_doc_error(g_fileName,doctokenizerYYlineno,"<h%d> ended with </h1>",
                     m_level); 
               }
               goto endheader;
@@ -2993,7 +3067,7 @@ int DocHtmlHeader::parse()
             {
               if (m_level!=2)
               {
-                warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: <h%d> ended with </h2>",
+                warn_doc_error(g_fileName,doctokenizerYYlineno,"<h%d> ended with </h2>",
                     m_level); 
               }
               goto endheader;
@@ -3002,7 +3076,7 @@ int DocHtmlHeader::parse()
             {
               if (m_level!=3)
               {
-                warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: <h%d> ended with </h3>",
+                warn_doc_error(g_fileName,doctokenizerYYlineno,"<h%d> ended with </h3>",
                     m_level); 
               }
               goto endheader;
@@ -3011,7 +3085,7 @@ int DocHtmlHeader::parse()
             {
               if (m_level!=4)
               {
-                warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: <h%d> ended with </h4>",
+                warn_doc_error(g_fileName,doctokenizerYYlineno,"<h%d> ended with </h4>",
                     m_level); 
               }
               goto endheader;
@@ -3020,7 +3094,7 @@ int DocHtmlHeader::parse()
             {
               if (m_level!=5)
               {
-                warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: <h%d> ended with </h5>",
+                warn_doc_error(g_fileName,doctokenizerYYlineno,"<h%d> ended with </h5>",
                     m_level); 
               }
               goto endheader;
@@ -3029,7 +3103,7 @@ int DocHtmlHeader::parse()
             {
               if (m_level!=6)
               {
-                warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: <h%d> ended with </h6>",
+                warn_doc_error(g_fileName,doctokenizerYYlineno,"<h%d> ended with </h6>",
                     m_level); 
               }
               goto endheader;
@@ -3048,18 +3122,18 @@ int DocHtmlHeader::parse()
             }
             else
             {
-              warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected html tag <%s%s> found within <h%d> context",
+              warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected html tag <%s%s> found within <h%d> context",
                   g_token->endTag?"/":"",qPrint(g_token->name),m_level);
             }
             
           }
           break;
         case TK_SYMBOL: 
-         warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unsupported symbol %s found",
+         warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported symbol %s found",
                qPrint(g_token->name));
           break;
         default:
-         warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected token %s",
+         warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected token %s",
                tokToString(tok));
           break;
       }
@@ -3067,7 +3141,7 @@ int DocHtmlHeader::parse()
   }
   if (tok==0)
   {
-    warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected end of comment while inside"
+    warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected end of comment while inside"
            " <h%d> tag\n",m_level); 
   }
 endheader:
@@ -3094,14 +3168,15 @@ int DocHRef::parse()
       switch (tok)
       {
         case TK_COMMAND: 
-          warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Illegal command %s as part of a <a>..</a> block",
+          warn_doc_error(g_fileName,doctokenizerYYlineno,"Illegal command %s as part of a <a>..</a> block",
               qPrint(g_token->name));
           break;
         case TK_SYMBOL: 
-         warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unsupported symbol %s found",
+         warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported symbol %s found",
                qPrint(g_token->name));
           break;
         case TK_HTMLTAG:
+
           {
             int tagId=Mappers::htmlTagMapper->map(g_token->name);
             if (tagId==HTML_A && g_token->endTag) // found </a> tag
@@ -3110,13 +3185,13 @@ int DocHRef::parse()
             }
             else
             {
-              warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected html tag <%s%s> found within <a href=...> context",
+              warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected html tag <%s%s> found within <a href=...> context",
                   g_token->endTag?"/":"",qPrint(g_token->name),doctokenizerYYlineno);
             }
           }
           break;
         default:
-         warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected token %s",
+         warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected token %s",
                tokToString(tok),doctokenizerYYlineno);
           break;
       }
@@ -3124,7 +3199,7 @@ int DocHRef::parse()
   }
   if (tok==0)
   {
-    warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected end of comment while inside"
+    warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected end of comment while inside"
            " <a href=...> tag",doctokenizerYYlineno); 
   }
 endhref:
@@ -3162,7 +3237,11 @@ int DocInternal::parse(int level)
     }
     if (retval==TK_LISTITEM)
     {
-      warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Invalid list item found",doctokenizerYYlineno);
+      warn_doc_error(g_fileName,doctokenizerYYlineno,"Invalid list item found",doctokenizerYYlineno);
+    }
+    else if (retval==RetVal_CopyDoc)
+    {
+      retval=handleDocCopy(this,m_children);
     }
   } while (retval!=0 && 
            retval!=RetVal_Section &&
@@ -3187,7 +3266,7 @@ int DocInternal::parse(int level)
 
   if (retval==RetVal_Internal)
   {
-    warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: \\internal command found inside internal section");
+    warn_doc_error(g_fileName,doctokenizerYYlineno,"\\internal command found inside internal section");
   }
 
   DBG(("DocInternal::parse() end\n"));
@@ -3206,7 +3285,7 @@ int DocIndexEntry::parse()
   int tok=doctokenizerYYlex();
   if (tok!=TK_WHITESPACE)
   {
-    warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected whitespace after \\addindex command");
+    warn_doc_error(g_fileName,doctokenizerYYlineno,"expected whitespace after \\addindex command");
     goto endindexentry;
   }
   doctokenizerYYsetStateTitle();
@@ -3245,7 +3324,7 @@ int DocIndexEntry::parse()
             case DocSymbol::Ndash:   m_entry+="--";  break;
             case DocSymbol::Mdash:   m_entry+="---";  break;
             default:
-              warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected symbol found as argument of \\addindex");
+              warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected symbol found as argument of \\addindex");
               break;
           }
         }
@@ -3264,13 +3343,13 @@ int DocIndexEntry::parse()
         case CMD_PERCENT: m_entry+='%';  break;
         case CMD_QUOTE:   m_entry+='"';  break;
         default:
-          warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected command %s found as argument of \\addindex",
+          warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected command %s found as argument of \\addindex",
                     qPrint(g_token->name));
           break;
       }
       break;
       default:
-        warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected token %s",
+        warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected token %s",
             tokToString(tok));
         break;
     }
@@ -3300,11 +3379,11 @@ int DocHtmlCaption::parse()
       switch (tok)
       {
         case TK_COMMAND: 
-          warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Illegal command %s as part of a <caption> tag",
+          warn_doc_error(g_fileName,doctokenizerYYlineno,"Illegal command %s as part of a <caption> tag",
               qPrint(g_token->name));
           break;
         case TK_SYMBOL: 
-          warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unsupported symbol %s found",
+          warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported symbol %s found",
               qPrint(g_token->name));
           break;
         case TK_HTMLTAG:
@@ -3317,13 +3396,13 @@ int DocHtmlCaption::parse()
             }
             else
             {
-              warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected html tag <%s%s> found within <caption> context",
+              warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected html tag <%s%s> found within <caption> context",
                   g_token->endTag?"/":"",qPrint(g_token->name));
             }
           }
           break;
         default:
-          warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected token %s",
+          warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected token %s",
               tokToString(tok));
           break;
       }
@@ -3331,7 +3410,7 @@ int DocHtmlCaption::parse()
   }
   if (tok==0)
   {
-    warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected end of comment while inside"
+    warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected end of comment while inside"
            " <caption> tag",doctokenizerYYlineno); 
   }
 endcaption:
@@ -3498,7 +3577,7 @@ int DocHtmlRow::parse()
     }
     else // found some other tag
     {
-      warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected <td> or <th> tag but "
+      warn_doc_error(g_fileName,doctokenizerYYlineno,"expected <td> or <th> tag but "
           "found <%s> instead!",qPrint(g_token->name));
       doctokenizerYYpushBackHtmlTag(g_token->name);
       goto endrow;
@@ -3506,13 +3585,13 @@ int DocHtmlRow::parse()
   }
   else if (tok==0) // premature end of comment
   {
-    warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected end of comment while looking"
+    warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected end of comment while looking"
         " for a html description title");
     goto endrow;
   }
   else // token other than html token
   {
-    warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected <td> or <th> tag but found %s token instead!",
+    warn_doc_error(g_fileName,doctokenizerYYlineno,"expected <td> or <th> tag but found %s token instead!",
         tokToString(tok));
     goto endrow;
   }
@@ -3562,7 +3641,7 @@ int DocHtmlRow::parseXml(bool isHeading)
     }
     else // found some other tag
     {
-      warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected <term> or <description> tag but "
+      warn_doc_error(g_fileName,doctokenizerYYlineno,"expected <term> or <description> tag but "
           "found <%s> instead!",qPrint(g_token->name));
       doctokenizerYYpushBackHtmlTag(g_token->name);
       goto endrow;
@@ -3570,13 +3649,13 @@ int DocHtmlRow::parseXml(bool isHeading)
   }
   else if (tok==0) // premature end of comment
   {
-    warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected end of comment while looking"
+    warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected end of comment while looking"
         " for a html description title");
     goto endrow;
   }
   else // token other than html token
   {
-    warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected <td> or <th> tag but found %s token instead!",
+    warn_doc_error(g_fileName,doctokenizerYYlineno,"expected <td> or <th> tag but found %s token instead!",
         tokToString(tok));
     goto endrow;
   }
@@ -3625,7 +3704,7 @@ getrow:
     {
       if (m_caption)
       {
-        warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: table already has a caption, found another one");
+        warn_doc_error(g_fileName,doctokenizerYYlineno,"table already has a caption, found another one");
       }
       else
       {
@@ -3640,18 +3719,18 @@ getrow:
     }
     else // found wrong token
     {
-      warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected <tr> or <caption> tag but "
+      warn_doc_error(g_fileName,doctokenizerYYlineno,"expected <tr> or <caption> tag but "
           "found <%s%s> instead!", g_token->endTag ? "/" : "", qPrint(g_token->name));
     }
   }
   else if (tok==0) // premature end of comment
   {
-      warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected end of comment while looking"
+      warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected end of comment while looking"
           " for a <tr> or <caption> tag");
   }
   else // token other than html token
   {
-    warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected <tr> tag but found %s token instead!",
+    warn_doc_error(g_fileName,doctokenizerYYlineno,"expected <tr> tag but found %s token instead!",
         tokToString(tok));
   }
        
@@ -3826,7 +3905,7 @@ int DocHtmlDescTitle::parse()
                   int tok=doctokenizerYYlex();
                   if (tok!=TK_WHITESPACE)
                   {
-                    warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected whitespace after %s command",
+                    warn_doc_error(g_fileName,doctokenizerYYlineno,"expected whitespace after %s command",
                         qPrint(g_token->name));
                   }
                   else
@@ -3835,7 +3914,7 @@ int DocHtmlDescTitle::parse()
                     tok=doctokenizerYYlex(); // get the reference id
                     if (tok!=TK_WORD)
                     {
-                      warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected token %s as the argument of %s",
+                      warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected token %s as the argument of %s",
                           tokToString(tok),qPrint(cmdName));
                     }
                     else
@@ -3856,7 +3935,7 @@ int DocHtmlDescTitle::parse()
                   int tok=doctokenizerYYlex();
                   if (tok!=TK_WHITESPACE)
                   {
-                    warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected whitespace after %s command",
+                    warn_doc_error(g_fileName,doctokenizerYYlineno,"expected whitespace after %s command",
                         qPrint(cmdName));
                   }
                   else
@@ -3865,7 +3944,7 @@ int DocHtmlDescTitle::parse()
                     tok=doctokenizerYYlex();
                     if (tok!=TK_WORD)
                     {
-                      warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected token %s as the argument of %s",
+                      warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected token %s as the argument of %s",
                           tokToString(tok),qPrint(cmdName));
                     }
                     else
@@ -3884,13 +3963,13 @@ int DocHtmlDescTitle::parse()
 
                 break;
               default:
-                warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Illegal command %s as part of a <dt> tag",
+                warn_doc_error(g_fileName,doctokenizerYYlineno,"Illegal command %s as part of a <dt> tag",
                                qPrint(g_token->name));
             }
           }
           break;
         case TK_SYMBOL: 
-          warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unsupported symbol %s found",
+          warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported symbol %s found",
               qPrint(g_token->name));
           break;
         case TK_HTMLTAG:
@@ -3925,13 +4004,13 @@ int DocHtmlDescTitle::parse()
             }
             else
             {
-              warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected html tag <%s%s> found within <dt> context",
+              warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected html tag <%s%s> found within <dt> context",
                   g_token->endTag?"/":"",qPrint(g_token->name));
             }
           }
           break;
         default:
-          warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected token %s",
+          warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected token %s",
               tokToString(tok));
           break;
       }
@@ -3939,7 +4018,7 @@ int DocHtmlDescTitle::parse()
   }
   if (tok==0)
   {
-    warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected end of comment while inside"
+    warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected end of comment while inside"
         " <dt> tag"); 
   }
 endtitle:
@@ -3999,7 +4078,7 @@ int DocHtmlDescList::parse()
     }
     else // found some other tag
     {
-      warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected <dt> tag but "
+      warn_doc_error(g_fileName,doctokenizerYYlineno,"expected <dt> tag but "
           "found <%s> instead!",qPrint(g_token->name));
       doctokenizerYYpushBackHtmlTag(g_token->name);
       goto enddesclist;
@@ -4007,13 +4086,13 @@ int DocHtmlDescList::parse()
   }
   else if (tok==0) // premature end of comment
   {
-    warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected end of comment while looking"
+    warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected end of comment while looking"
         " for a html description title");
     goto enddesclist;
   }
   else // token other than html token
   {
-    warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected <dt> tag but found %s token instead!",
+    warn_doc_error(g_fileName,doctokenizerYYlineno,"expected <dt> tag but found %s token instead!",
         tokToString(tok));
     goto enddesclist;
   }
@@ -4038,7 +4117,7 @@ int DocHtmlDescList::parse()
 
   if (retval==0)
   {
-    warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected end of comment while inside <dl> block");
+    warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected end of comment while inside <dl> block");
   }
 
 enddesclist:
@@ -4138,7 +4217,7 @@ int DocHtmlList::parse()
     {
       // add dummy item to obtain valid HTML
       m_children.append(new DocHtmlListItem(this,HtmlAttribList(),1));
-      warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: empty list!");
+      warn_doc_error(g_fileName,doctokenizerYYlineno,"empty list!");
       retval = RetVal_EndList;
       goto endlist;
     }
@@ -4146,7 +4225,7 @@ int DocHtmlList::parse()
     {
       // add dummy item to obtain valid HTML
       m_children.append(new DocHtmlListItem(this,HtmlAttribList(),1));
-      warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected <li> tag but "
+      warn_doc_error(g_fileName,doctokenizerYYlineno,"expected <li> tag but "
           "found <%s%s> instead!",g_token->endTag?"/":"",qPrint(g_token->name));
       doctokenizerYYpushBackHtmlTag(g_token->name);
       goto endlist;
@@ -4156,7 +4235,7 @@ int DocHtmlList::parse()
   {
     // add dummy item to obtain valid HTML
     m_children.append(new DocHtmlListItem(this,HtmlAttribList(),1));
-    warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected end of comment while looking"
+    warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected end of comment while looking"
         " for a html list item");
     goto endlist;
   }
@@ -4164,7 +4243,7 @@ int DocHtmlList::parse()
   {
     // add dummy item to obtain valid HTML
     m_children.append(new DocHtmlListItem(this,HtmlAttribList(),1));
-    warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected <li> tag but found %s token instead!",
+    warn_doc_error(g_fileName,doctokenizerYYlineno,"expected <li> tag but found %s token instead!",
         tokToString(tok));
     goto endlist;
   }
@@ -4178,7 +4257,7 @@ int DocHtmlList::parse()
   
   if (retval==0)
   {
-    warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected end of comment while inside <%cl> block",
+    warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected end of comment while inside <%cl> block",
         m_type==Unordered ? 'u' : 'o');
   }
 
@@ -4211,7 +4290,7 @@ int DocHtmlList::parseXml()
     }
     else // found some other tag
     {
-      warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected <item> tag but "
+      warn_doc_error(g_fileName,doctokenizerYYlineno,"expected <item> tag but "
           "found <%s> instead!",qPrint(g_token->name));
       doctokenizerYYpushBackHtmlTag(g_token->name);
       goto endlist;
@@ -4219,13 +4298,13 @@ int DocHtmlList::parseXml()
   }
   else if (tok==0) // premature end of comment
   {
-    warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected end of comment while looking"
+    warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected end of comment while looking"
         " for a html list item");
     goto endlist;
   }
   else // token other than html token
   {
-    warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected <item> tag but found %s token instead!",
+    warn_doc_error(g_fileName,doctokenizerYYlineno,"expected <item> tag but found %s token instead!",
         tokToString(tok));
     goto endlist;
   }
@@ -4241,7 +4320,7 @@ int DocHtmlList::parseXml()
   
   if (retval==0)
   {
-    warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected end of comment while inside <list type=\"%s\"> block",
+    warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected end of comment while inside <list type=\"%s\"> block",
         m_type==Unordered ? "bullet" : "number");
   }
 
@@ -4324,10 +4403,6 @@ int DocAutoListItem::parse()
   int retval = RetVal_OK;
   g_nodeStack.push(this);
   
-  //retval=m_paragraph->parse();
-  //m_paragraph->markFirst();
-  //m_paragraph->markLast();
-
   // first parse any number of paragraphs
   bool isFirst=TRUE;
   DocPara *lastPar=0;
@@ -4414,15 +4489,15 @@ void DocTitle::parse()
       switch (tok)
       {
         case TK_COMMAND: 
-          warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Illegal command %s as part of a title section",
+          warn_doc_error(g_fileName,doctokenizerYYlineno,"Illegal command %s as part of a title section",
               qPrint(g_token->name));
           break;
         case TK_SYMBOL: 
-         warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unsupported symbol %s found",
+         warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported symbol %s found",
                qPrint(g_token->name));
           break;
         default:
-         warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected token %s",
+         warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected token %s",
                tokToString(tok));
           break;
       }
@@ -4617,7 +4692,7 @@ int DocParamList::parse(const QCString &cmdName)
   int tok=doctokenizerYYlex();
   if (tok!=TK_WHITESPACE)
   {
-    warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected whitespace after %s command",
+    warn_doc_error(g_fileName,doctokenizerYYlineno,"expected whitespace after %s command",
         qPrint(cmdName));
   }
   doctokenizerYYsetStateParam();
@@ -4653,7 +4728,7 @@ int DocParamList::parse(const QCString &cmdName)
   doctokenizerYYsetStatePara();
   if (tok==0) /* premature end of comment block */
   {
-    warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected end of comment block while parsing the "
+    warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected end of comment block while parsing the "
         "argument of command %s",qPrint(cmdName));
     retval=0;
     goto endparamlist;
@@ -4727,7 +4802,7 @@ int DocParamList::parseXml(const QCString &paramName)
 
   if (retval==0) /* premature end of comment block */
   {
-    warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unterminated param or exception tag");
+    warn_doc_error(g_fileName,doctokenizerYYlineno,"unterminated param or exception tag");
   }
   else
   {
@@ -4842,7 +4917,7 @@ void DocPara::handleCite()
   int tok=doctokenizerYYlex();
   if (tok!=TK_WHITESPACE)
   {
-    warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected whitespace after %s command",
+    warn_doc_error(g_fileName,doctokenizerYYlineno,"expected whitespace after %s command",
         qPrint("cite"));
     return;
   }
@@ -4850,13 +4925,13 @@ void DocPara::handleCite()
   tok=doctokenizerYYlex();
   if (tok==0)
   {
-    warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected end of comment block while parsing the "
+    warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected end of comment block while parsing the "
         "argument of command %s\n", qPrint("cite"));
     return;
   }
   else if (tok!=TK_WORD && tok!=TK_LNKWORD)
   {
-    warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected token %s as the argument of %s",
+    warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected token %s as the argument of %s",
         tokToString(tok),qPrint("cite"));
     return;
   }
@@ -4896,7 +4971,7 @@ void DocPara::handleIncludeOperator(const QCString &cmdName,DocIncOperator::Type
   int tok=doctokenizerYYlex();
   if (tok!=TK_WHITESPACE)
   {
-    warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected whitespace after %s command",
+    warn_doc_error(g_fileName,doctokenizerYYlineno,"expected whitespace after %s command",
         qPrint(cmdName));
     return;
   }
@@ -4905,13 +4980,13 @@ void DocPara::handleIncludeOperator(const QCString &cmdName,DocIncOperator::Type
   doctokenizerYYsetStatePara();
   if (tok==0)
   {
-    warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected end of comment block while parsing the "
+    warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected end of comment block while parsing the "
         "argument of command %s", qPrint(cmdName));
     return;
   }
   else if (tok!=TK_WORD)
   {
-    warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected token %s as the argument of %s",
+    warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected token %s as the argument of %s",
         tokToString(tok),qPrint(cmdName));
     return;
   }
@@ -4946,21 +5021,21 @@ void DocPara::handleImage(const QCString &cmdName)
   int tok=doctokenizerYYlex();
   if (tok!=TK_WHITESPACE)
   {
-    warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected whitespace after %s command",
+    warn_doc_error(g_fileName,doctokenizerYYlineno,"expected whitespace after %s command",
         qPrint(cmdName));
     return;
   }
   tok=doctokenizerYYlex();
   if (tok!=TK_WORD && tok!=TK_LNKWORD)
   {
-    warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected token %s as the argument of %s",
+    warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected token %s as the argument of %s",
         tokToString(tok),qPrint(cmdName));
     return;
   }
   tok=doctokenizerYYlex();
   if (tok!=TK_WHITESPACE)
   {
-    warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected whitespace after %s command",
+    warn_doc_error(g_fileName,doctokenizerYYlineno,"expected whitespace after %s command",
         qPrint(cmdName));
     return;
   }
@@ -4971,7 +5046,7 @@ void DocPara::handleImage(const QCString &cmdName)
   else if (imgType=="rtf")   t=DocImage::Rtf;
   else
   {
-    warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: image type %s specified as the first argument of "
+    warn_doc_error(g_fileName,doctokenizerYYlineno,"image type %s specified as the first argument of "
         "%s is not valid",
         qPrint(imgType),qPrint(cmdName));
     return;
@@ -4981,7 +5056,7 @@ void DocPara::handleImage(const QCString &cmdName)
   doctokenizerYYsetStatePara();
   if (tok!=TK_WORD)
   {
-    warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected token %s as the argument of %s",
+    warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected token %s as the argument of %s",
         tokToString(tok),qPrint(cmdName));
     return;
   }
@@ -4996,7 +5071,7 @@ void DocPara::handleDotFile(const QCString &cmdName)
   int tok=doctokenizerYYlex();
   if (tok!=TK_WHITESPACE)
   {
-    warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected whitespace after %s command",
+    warn_doc_error(g_fileName,doctokenizerYYlineno,"expected whitespace after %s command",
         qPrint(cmdName));
     return;
   }
@@ -5005,7 +5080,7 @@ void DocPara::handleDotFile(const QCString &cmdName)
   doctokenizerYYsetStatePara();
   if (tok!=TK_WORD)
   {
-    warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected token %s as the argument of %s",
+    warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected token %s as the argument of %s",
         tokToString(tok),qPrint(cmdName));
     return;
   }
@@ -5020,7 +5095,7 @@ void DocPara::handleMscFile(const QCString &cmdName)
   int tok=doctokenizerYYlex();
   if (tok!=TK_WHITESPACE)
   {
-    warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected whitespace after %s command",
+    warn_doc_error(g_fileName,doctokenizerYYlineno,"expected whitespace after %s command",
         qPrint(cmdName));
     return;
   }
@@ -5029,7 +5104,7 @@ void DocPara::handleMscFile(const QCString &cmdName)
   doctokenizerYYsetStatePara();
   if (tok!=TK_WORD)
   {
-    warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected token %s as the argument of %s",
+    warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected token %s as the argument of %s",
         tokToString(tok),qPrint(cmdName));
     return;
   }
@@ -5051,7 +5126,7 @@ void DocPara::handleLink(const QCString &cmdName,bool isJavaLink)
   int tok=doctokenizerYYlex();
   if (tok!=TK_WHITESPACE)
   {
-    warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected whitespace after %s command",
+    warn_doc_error(g_fileName,doctokenizerYYlineno,"expected whitespace after %s command",
         qPrint(cmdName));
     return;
   }
@@ -5059,7 +5134,7 @@ void DocPara::handleLink(const QCString &cmdName,bool isJavaLink)
   tok=doctokenizerYYlex();
   if (tok!=TK_WORD)
   {
-    warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected token %s as the argument of %s",
+    warn_doc_error(g_fileName,doctokenizerYYlineno,"%s as the argument of %s",
         tokToString(tok),qPrint(cmdName));
     return;
   }
@@ -5079,7 +5154,7 @@ void DocPara::handleRef(const QCString &cmdName)
   int tok=doctokenizerYYlex();
   if (tok!=TK_WHITESPACE)
   {
-    warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected whitespace after %s command",
+    warn_doc_error(g_fileName,doctokenizerYYlineno,"expected whitespace after %s command",
         qPrint(cmdName));
     return;
   }
@@ -5088,7 +5163,7 @@ void DocPara::handleRef(const QCString &cmdName)
   DocRef *ref=0;
   if (tok!=TK_WORD)
   {
-    warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected token %s as the argument of %s",
+    warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected token %s as the argument of %s",
         tokToString(tok),qPrint(cmdName));
     goto endref;
   }
@@ -5106,7 +5181,7 @@ void DocPara::handleInclude(const QCString &cmdName,DocInclude::Type t)
   int tok=doctokenizerYYlex();
   if (tok!=TK_WHITESPACE)
   {
-    warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected whitespace after %s command",
+    warn_doc_error(g_fileName,doctokenizerYYlineno,"expected whitespace after %s command",
         qPrint(cmdName));
     return;
   }
@@ -5115,13 +5190,13 @@ void DocPara::handleInclude(const QCString &cmdName,DocInclude::Type t)
   doctokenizerYYsetStatePara();
   if (tok==0)
   {
-    warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected end of comment block while parsing the "
+    warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected end of comment block while parsing the "
         "argument of command %s",qPrint(cmdName));
     return;
   }
   else if (tok!=TK_WORD)
   {
-    warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected token %s as the argument of %s",
+    warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected token %s as the argument of %s",
         tokToString(tok),qPrint(cmdName));
     return;
   }
@@ -5134,7 +5209,7 @@ void DocPara::handleInclude(const QCString &cmdName,DocInclude::Type t)
     doctokenizerYYsetStatePara();
     if (tok!=TK_WORD)
     {
-      warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected block identifier, but found token %s instead while parsing the %s command",
+      warn_doc_error(g_fileName,doctokenizerYYlineno,"expected block identifier, but found token %s instead while parsing the %s command",
           tokToString(tok),qPrint(cmdName));
       return;
     }
@@ -5151,20 +5226,20 @@ void DocPara::handleSection(const QCString &cmdName)
   int tok=doctokenizerYYlex();
   if (tok!=TK_WHITESPACE)
   {
-    warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected whitespace after %s command",
+    warn_doc_error(g_fileName,doctokenizerYYlineno,"expected whitespace after %s command",
         qPrint(cmdName));
     return;
   }
   tok=doctokenizerYYlex();
   if (tok==0)
   {
-    warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected end of comment block while parsing the "
+    warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected end of comment block while parsing the "
         "argument of command %s\n", qPrint(cmdName));
     return;
   }
   else if (tok!=TK_WORD && tok!=TK_LNKWORD)
   {
-    warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected token %s as the argument of %s",
+    warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected token %s as the argument of %s",
         tokToString(tok),qPrint(cmdName));
     return;
   }
@@ -5207,7 +5282,7 @@ int DocPara::handleStartCode()
     i++;
   }
   m_children.append(new DocVerbatim(this,g_context,stripIndentation(g_token->verb.mid(li)),DocVerbatim::Code,g_isExample,g_exampleName,lang));
-  if (retval==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: code section ended without end marker");
+  if (retval==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"code section ended without end marker");
   doctokenizerYYsetStatePara();
   return retval;
 }
@@ -5249,7 +5324,7 @@ int DocPara::handleCommand(const QCString &cmdName)
   switch (cmdId)
   {
     case CMD_UNKNOWN:
-      warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Found unknown command `\\%s'",qPrint(cmdName));
+      warn_doc_error(g_fileName,doctokenizerYYlineno,"Found unknown command `\\%s'",qPrint(cmdName));
       break;
     case CMD_EMPHASIS:
       m_children.append(new DocStyleChange(this,g_nodeStack.count(),DocStyleChange::Italic,TRUE));
@@ -5395,7 +5470,7 @@ int DocPara::handleCommand(const QCString &cmdName)
         doctokenizerYYsetStateHtmlOnly();
         retval = doctokenizerYYlex();
         m_children.append(new DocVerbatim(this,g_context,g_token->verb,DocVerbatim::HtmlOnly,g_isExample,g_exampleName));
-        if (retval==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: htmlonly section ended without end marker");
+        if (retval==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"htmlonly section ended without end marker");
         doctokenizerYYsetStatePara();
       }
       break;
@@ -5404,7 +5479,7 @@ int DocPara::handleCommand(const QCString &cmdName)
         doctokenizerYYsetStateManOnly();
         retval = doctokenizerYYlex();
         m_children.append(new DocVerbatim(this,g_context,g_token->verb,DocVerbatim::ManOnly,g_isExample,g_exampleName));
-        if (retval==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: manonly section ended without end marker");
+        if (retval==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"manonly section ended without end marker");
         doctokenizerYYsetStatePara();
       }
       break;
@@ -5413,7 +5488,7 @@ int DocPara::handleCommand(const QCString &cmdName)
         doctokenizerYYsetStateRtfOnly();
         retval = doctokenizerYYlex();
         m_children.append(new DocVerbatim(this,g_context,g_token->verb,DocVerbatim::RtfOnly,g_isExample,g_exampleName));
-        if (retval==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: rtfonly section ended without end marker");
+        if (retval==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"rtfonly section ended without end marker");
         doctokenizerYYsetStatePara();
       }
       break;
@@ -5422,7 +5497,7 @@ int DocPara::handleCommand(const QCString &cmdName)
         doctokenizerYYsetStateLatexOnly();
         retval = doctokenizerYYlex();
         m_children.append(new DocVerbatim(this,g_context,g_token->verb,DocVerbatim::LatexOnly,g_isExample,g_exampleName));
-        if (retval==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: latexonly section ended without end marker");
+        if (retval==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"latexonly section ended without end marker");
         doctokenizerYYsetStatePara();
       }
       break;
@@ -5431,7 +5506,7 @@ int DocPara::handleCommand(const QCString &cmdName)
         doctokenizerYYsetStateXmlOnly();
         retval = doctokenizerYYlex();
         m_children.append(new DocVerbatim(this,g_context,g_token->verb,DocVerbatim::XmlOnly,g_isExample,g_exampleName));
-        if (retval==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: xmlonly section ended without end marker");
+        if (retval==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"xmlonly section ended without end marker");
         doctokenizerYYsetStatePara();
       }
       break;
@@ -5440,7 +5515,7 @@ int DocPara::handleCommand(const QCString &cmdName)
         doctokenizerYYsetStateVerbatim();
         retval = doctokenizerYYlex();
         m_children.append(new DocVerbatim(this,g_context,g_token->verb,DocVerbatim::Verbatim,g_isExample,g_exampleName));
-        if (retval==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: verbatim section ended without end marker");
+        if (retval==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"verbatim section ended without end marker");
         doctokenizerYYsetStatePara();
       }
       break;
@@ -5449,7 +5524,7 @@ int DocPara::handleCommand(const QCString &cmdName)
         doctokenizerYYsetStateDot();
         retval = doctokenizerYYlex();
         m_children.append(new DocVerbatim(this,g_context,g_token->verb,DocVerbatim::Dot,g_isExample,g_exampleName));
-        if (retval==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: dot section ended without end marker");
+        if (retval==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"dot section ended without end marker");
         doctokenizerYYsetStatePara();
       }
       break;
@@ -5458,9 +5533,8 @@ int DocPara::handleCommand(const QCString &cmdName)
         doctokenizerYYsetStateMsc();
         retval = doctokenizerYYlex();
         m_children.append(new DocVerbatim(this,g_context,g_token->verb,DocVerbatim::Msc,g_isExample,g_exampleName));
-        if (retval==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: msc section ended without end marker");
+        if (retval==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"msc section ended without end marker");
         doctokenizerYYsetStatePara();
-        VhdlDocGen::createFlowChart(g_memberDef);
       }
       break;
     case CMD_ENDCODE:
@@ -5469,13 +5543,12 @@ int DocPara::handleCommand(const QCString &cmdName)
     case CMD_ENDRTFONLY:
     case CMD_ENDLATEXONLY:
     case CMD_ENDXMLONLY:
+    case CMD_ENDDBONLY:
     case CMD_ENDLINK:
     case CMD_ENDVERBATIM:
     case CMD_ENDDOT:
-      warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected command %s",qPrint(g_token->name));
-      break; 
     case CMD_ENDMSC:
-      warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected command %s",qPrint(g_token->name));
+      warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected command %s",qPrint(g_token->name));
       break; 
     case CMD_PARAM:
       retval = handleParamSection(cmdName,DocParamSect::Param,FALSE,g_token->paramDir);
@@ -5522,34 +5595,7 @@ int DocPara::handleCommand(const QCString &cmdName)
     case CMD_COPYDOC:   // fall through
     case CMD_COPYBRIEF: // fall through
     case CMD_COPYDETAILS:
-      {
-        int tok=doctokenizerYYlex();
-        if (tok!=TK_WHITESPACE)
-        {
-          warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected whitespace after %s command",
-              qPrint(cmdName));
-          break;
-        }
-        tok=doctokenizerYYlex();
-        if (tok==0)
-        {
-          warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected end of comment block while parsing the "
-              "argument of command %s\n", qPrint(cmdName));
-          break;
-        }
-        else if (tok!=TK_WORD && tok!=TK_LNKWORD)
-        {
-          warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected token %s as the argument of %s",
-              tokToString(tok),qPrint(cmdName));
-          break;
-        }
-        DocCopy *cpy = new DocCopy(this,g_token->name,
-            cmdId==CMD_COPYDOC || cmdId==CMD_COPYBRIEF,
-            cmdId==CMD_COPYDOC || cmdId==CMD_COPYDETAILS);
-        //m_children.append(cpy);
-        cpy->parse(m_children);
-        delete cpy;
-      }
+      retval = RetVal_CopyDoc;
       break;
     case CMD_INCLUDE:
       handleInclude(cmdName,DocInclude::Include);
@@ -5614,10 +5660,10 @@ int DocPara::handleCommand(const QCString &cmdName)
       }
       break;
     case CMD_SECREFITEM:
-      warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected command %s",qPrint(g_token->name));
+      warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected command %s",qPrint(g_token->name));
       break;
     case CMD_ENDSECREFLIST:
-      warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected command %s",qPrint(g_token->name));
+      warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected command %s",qPrint(g_token->name));
       break;
     case CMD_FORMULA:
       {
@@ -5629,7 +5675,7 @@ int DocPara::handleCommand(const QCString &cmdName)
     //  retval = handleLanguageSwitch();
     //  break;
     case CMD_INTERNALREF:
-      //warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected command %s",qPrint(g_token->name));
+      //warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected command %s",qPrint(g_token->name));
       {
         DocInternalRef *ref = handleInternalRef(this);
         if (ref)
@@ -5683,7 +5729,7 @@ int DocPara::handleHtmlStartTag(const QCString &tagName,const HtmlAttribList &ta
   if (g_token->emptyTag && !(tagId&XML_CmdMask) && 
       tagId!=HTML_UNKNOWN && tagId!=HTML_IMG && tagId!=HTML_BR)
   {
-      warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: HTML tags may not use the 'empty tag' XHTML syntax.");
+      warn_doc_error(g_fileName,doctokenizerYYlineno,"HTML tags may not use the 'empty tag' XHTML syntax.");
   }
   switch (tagId)
   {
@@ -5704,7 +5750,7 @@ int DocPara::handleHtmlStartTag(const QCString &tagName,const HtmlAttribList &ta
     case HTML_LI:
       if (!insideUL(this) && !insideOL(this))
       {
-        warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: lonely <li> tag found");
+        warn_doc_error(g_fileName,doctokenizerYYlineno,"lonely <li> tag found");
       }
       else
       {
@@ -5767,7 +5813,7 @@ int DocPara::handleHtmlStartTag(const QCString &tagName,const HtmlAttribList &ta
       retval = RetVal_DescTitle;
       break;
     case HTML_DD:
-      warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected tag <dd> found");
+      warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected tag <dd> found");
       break;
     case HTML_TABLE:
       {
@@ -5786,7 +5832,7 @@ int DocPara::handleHtmlStartTag(const QCString &tagName,const HtmlAttribList &ta
       retval = RetVal_TableHCell;
       break;
     case HTML_CAPTION:
-      warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected tag <caption> found");
+      warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected tag <caption> found");
       break;
     case HTML_BR:
       {
@@ -5823,29 +5869,7 @@ int DocPara::handleHtmlStartTag(const QCString &tagName,const HtmlAttribList &ta
       break;
     case HTML_IMG:
       {
-        HtmlAttribListIterator li(tagHtmlAttribs);
-        HtmlAttrib *opt;
-        bool found=FALSE;
-        int index=0;
-        for (li.toFirst();(opt=li.current());++li,++index)
-        {
-          //printf("option name=%s value=%s\n",opt->name.data(),opt->value.data());
-          if (opt->name=="src" && !opt->value.isEmpty())
-          {
-            // copy attributes
-            HtmlAttribList attrList = tagHtmlAttribs;
-            // and remove the src attribute
-            bool result = attrList.remove(index);
-            ASSERT(result);
-            DocImage *img = new DocImage(this,attrList,opt->value,DocImage::Html,opt->value);
-            m_children.append(img);
-            found = TRUE;
-          }
-        }
-        if (!found)
-        {
-          warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: IMG tag does not have a SRC attribute!\n");
-        }
+        handleImg(this,m_children,tagHtmlAttribs);
       }
       break;
     case HTML_BLOCKQUOTE:
@@ -5887,7 +5911,7 @@ int DocPara::handleHtmlStartTag(const QCString &tagName,const HtmlAttribList &ta
           {
             if (Config_getBool("WARN_NO_PARAMDOC"))
             {
-              warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: empty 'name' attribute for <param> tag.");
+              warn_doc_error(g_fileName,doctokenizerYYlineno,"empty 'name' attribute for <param> tag.");
             }
           }
           else
@@ -5899,7 +5923,7 @@ int DocPara::handleHtmlStartTag(const QCString &tagName,const HtmlAttribList &ta
         }
         else
         {
-          warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Missing 'name' attribute from <param> tag.");
+          warn_doc_error(g_fileName,doctokenizerYYlineno,"Missing 'name' attribute from <param> tag.");
         }
       }
       break;
@@ -5917,7 +5941,7 @@ int DocPara::handleHtmlStartTag(const QCString &tagName,const HtmlAttribList &ta
         }
         else
         {
-          warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Missing 'name' attribute from <param%sref> tag.",tagId==XML_PARAMREF?"":"type");
+          warn_doc_error(g_fileName,doctokenizerYYlineno,"Missing 'name' attribute from <param%sref> tag.",tagId==XML_PARAMREF?"":"type");
         }
       }
       break;
@@ -5930,7 +5954,7 @@ int DocPara::handleHtmlStartTag(const QCString &tagName,const HtmlAttribList &ta
         }
         else
         {
-          warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Missing 'name' attribute from <exception> tag.");
+          warn_doc_error(g_fileName,doctokenizerYYlineno,"Missing 'name' attribute from <exception> tag.");
         }
       }
       break;
@@ -5946,7 +5970,7 @@ int DocPara::handleHtmlStartTag(const QCString &tagName,const HtmlAttribList &ta
       }
       else
       {
-        warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: lonely <item> tag found");
+        warn_doc_error(g_fileName,doctokenizerYYlineno,"lonely <item> tag found");
       }
       break;
     case XML_RETURNS:
@@ -5995,7 +6019,7 @@ int DocPara::handleHtmlStartTag(const QCString &tagName,const HtmlAttribList &ta
         }
         else
         {
-          warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Missing 'cref' attribute from <see> tag.");
+          warn_doc_error(g_fileName,doctokenizerYYlineno,"Missing 'cref' attribute from <see> tag.");
         }
       }
       break;
@@ -6027,7 +6051,7 @@ int DocPara::handleHtmlStartTag(const QCString &tagName,const HtmlAttribList &ta
         }
         else
         {
-          warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Missing 'cref' attribute from <seealso> tag.");
+          warn_doc_error(g_fileName,doctokenizerYYlineno,"Missing 'cref' attribute from <seealso> tag.");
         }
       }
       break;
@@ -6060,7 +6084,7 @@ int DocPara::handleHtmlStartTag(const QCString &tagName,const HtmlAttribList &ta
       // These tags are defined in .Net but are currently unsupported
       break;
     case HTML_UNKNOWN:
-      warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unsupported xml/html tag <%s> found", qPrint(tagName));
+      warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported xml/html tag <%s> found", qPrint(tagName));
       m_children.append(new DocWord(this, "<"+tagName+tagHtmlAttribs.toString()+">"));
       break;
   case XML_INHERITDOC:
@@ -6085,7 +6109,7 @@ int DocPara::handleHtmlEndTag(const QCString &tagName)
     case HTML_UL: 
       if (!insideUL(this))
       {
-        warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: found </ul> tag without matching <ul>");
+        warn_doc_error(g_fileName,doctokenizerYYlineno,"found </ul> tag without matching <ul>");
       }
       else
       {
@@ -6095,7 +6119,7 @@ int DocPara::handleHtmlEndTag(const QCString &tagName)
     case HTML_OL: 
       if (!insideOL(this))
       {
-        warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: found </ol> tag without matching <ol>");
+        warn_doc_error(g_fileName,doctokenizerYYlineno,"found </ol> tag without matching <ol>");
       }
       else
       {
@@ -6105,7 +6129,7 @@ int DocPara::handleHtmlEndTag(const QCString &tagName)
     case HTML_LI:
       if (!insideLI(this))
       {
-        warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: found </li> tag without matching <li>");
+        warn_doc_error(g_fileName,doctokenizerYYlineno,"found </li> tag without matching <li>");
       }
       else
       {
@@ -6118,7 +6142,7 @@ int DocPara::handleHtmlEndTag(const QCString &tagName)
     //case HTML_PRE:
     //  if (!insidePRE(this))
     //  {
-    //    warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: found </pre> tag without matching <pre>");
+    //    warn_doc_error(g_fileName,doctokenizerYYlineno,"found </pre> tag without matching <pre>");
     //  }
     //  else
     //  {
@@ -6182,28 +6206,37 @@ int DocPara::handleHtmlEndTag(const QCString &tagName)
       // ignore </th> tag
       break;
     case HTML_CAPTION:
-      warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected tag </caption> found");
+      warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected tag </caption> found");
       break;
     case HTML_BR:
-      warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Illegal </br> tag found\n");
+      warn_doc_error(g_fileName,doctokenizerYYlineno,"Illegal </br> tag found\n");
       break;
     case HTML_H1:
-      warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected tag </h1> found");
+      warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected tag </h1> found");
       break;
     case HTML_H2:
-      warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected tag </h2> found");
+      warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected tag </h2> found");
       break;
     case HTML_H3:
-      warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected tag </h3> found");
+      warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected tag </h3> found");
+      break;
+    case HTML_H4:
+      warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected tag </h4> found");
+      break;
+    case HTML_H5:
+      warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected tag </h5> found");
+      break;
+    case HTML_H6:
+      warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected tag </h6> found");
       break;
     case HTML_IMG:
-      warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected tag </img> found");
+      warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected tag </img> found");
       break;
     case HTML_HR:
-      warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected tag </hr> found");
+      warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected tag </hr> found");
       break;
     case HTML_A:
-      //warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected tag </a> found");
+      //warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected tag </a> found");
       // ignore </a> tag (can be part of <a name=...></a>
       break;
 
@@ -6238,7 +6271,7 @@ int DocPara::handleHtmlEndTag(const QCString &tagName)
       // These tags are defined in .Net but are currently unsupported
       break;
     case HTML_UNKNOWN:
-      warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unsupported xml/html tag </%s> found", qPrint(tagName));
+      warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported xml/html tag </%s> found", qPrint(tagName));
       m_children.append(new DocWord(this,"</"+tagName+">"));
       break;
     default:
@@ -6396,13 +6429,13 @@ reparsetoken:
           }
           else
           {
-            warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: End of list marker found "
+            warn_doc_error(g_fileName,doctokenizerYYlineno,"End of list marker found "
                 "has invalid indent level");
           }
         }
         else
         {
-          warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: End of list marker found without any preceding "
+          warn_doc_error(g_fileName,doctokenizerYYlineno,"End of list marker found without any preceding "
               "list items");
         }
         break;
@@ -6442,7 +6475,7 @@ reparsetoken:
           }
 
           // handle the command
-          retval=handleCommand(g_token->name.copy());
+          retval=handleCommand(g_token->name);
           DBG(("handleCommand returns %x\n",retval));
 
           // check the return value
@@ -6514,7 +6547,7 @@ reparsetoken:
           }
           else
           {
-            warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unsupported symbol %s found",
+            warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported symbol %s found",
                 qPrint(g_token->name));
           }
           break;
@@ -6550,7 +6583,7 @@ reparsetoken:
         break;
       default:
         warn_doc_error(g_fileName,doctokenizerYYlineno,
-            "warning: Found unexpected token (id=%x)\n",tok);
+            "Found unexpected token (id=%x)\n",tok);
         break;
     }
   }
@@ -6611,14 +6644,18 @@ int DocSection::parse()
     }
     if (retval==TK_LISTITEM)
     {
-      warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Invalid list item found");
+      warn_doc_error(g_fileName,doctokenizerYYlineno,"Invalid list item found");
+    }
+    else if (retval==RetVal_CopyDoc)
+    {
+      retval=handleDocCopy(this,m_children);
     }
   } while (retval!=0 && 
            retval!=RetVal_Internal      &&
            retval!=RetVal_Section       &&
            retval!=RetVal_Subsection    &&
            retval!=RetVal_Subsubsection &&
-           retval!=RetVal_Paragraph    
+           retval!=RetVal_Paragraph 
           );
 
   if (lastPar) lastPar->markLast();
@@ -6669,7 +6706,7 @@ int DocSection::parse()
     if (retval==RetVal_Subsection) level=2; 
     else if (retval==RetVal_Subsubsection) level=3;
     else level=4;
-    warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected %s "
+    warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected %s "
             "command found inside %s!",
             sectionLevelToName[level],sectionLevelToName[m_level]);
     retval=0; // stop parsing
@@ -6728,7 +6765,7 @@ void DocText::parse()
           }
           else
           {
-            warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unsupported symbol %s found",
+            warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported symbol %s found",
                 qPrint(g_token->name));
           }
         }
@@ -6767,13 +6804,13 @@ void DocText::parse()
             m_children.append(new DocSymbol(this,DocSymbol::Quot));
             break;
           default:
-            warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected command `%s' found",
+            warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected command `%s' found",
                       qPrint(g_token->name));
             break;
         }
         break;
       default:
-        warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected token %s",
+        warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected token %s",
             tokToString(tok));
         break;
     }
@@ -6815,19 +6852,23 @@ void DocRoot::parse()
     }
     if (retval==TK_LISTITEM)
     {
-      warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Invalid list item found");
+      warn_doc_error(g_fileName,doctokenizerYYlineno,"Invalid list item found");
     }
     else if (retval==RetVal_Subsection)
     {
-      warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: found subsection command outside of section context!");
+      warn_doc_error(g_fileName,doctokenizerYYlineno,"found subsection command outside of section context!");
     }
     else if (retval==RetVal_Subsubsection)
     {
-      warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: found subsubsection command outside of subsection context!");
+      warn_doc_error(g_fileName,doctokenizerYYlineno,"found subsubsection command outside of subsection context!");
     }
     else if (retval==RetVal_Paragraph)
     {
-      warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: found paragraph command outside of subsubsection context!");
+      warn_doc_error(g_fileName,doctokenizerYYlineno,"found paragraph command outside of subsubsection context!");
+    }
+    else if (retval==RetVal_CopyDoc)
+    {
+      retval=handleDocCopy(this,m_children);
     }
   } while (retval!=0 && retval!=RetVal_Section && retval!=RetVal_Internal);
   if (lastPar) lastPar->markLast();
@@ -6846,7 +6887,7 @@ void DocRoot::parse()
     }
     else
     {
-      warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Invalid section id `%s'; ignoring section",qPrint(g_token->sectionId));
+      warn_doc_error(g_fileName,doctokenizerYYlineno,"Invalid section id `%s'; ignoring section",qPrint(g_token->sectionId));
       retval = 0;
     }
   }
@@ -6868,7 +6909,7 @@ void DocRoot::parse()
 
 //--------------------------------------------------------------------------
 
-DocNode *validatingParseDoc(const char *fileName,int startLine,
+DocRoot *validatingParseDoc(const char *fileName,int startLine,
                             Definition *ctx,MemberDef *md,
                             const char *input,bool indexWords,
                             bool isExample, const char *exampleName,
@@ -7031,8 +7072,13 @@ DocNode *validatingParseDoc(const char *fileName,int startLine,
   
   //printf("Starting comment block at %s:%d\n",g_fileName.data(),startLine);
   doctokenizerYYlineno=startLine;
-  doctokenizerYYinit(input,g_fileName);
-
+  QCString inpStr=input;
+  uint inpLen = inpStr.length();
+  if (inpLen>0 && inpStr.at(inpLen-1)!='\n')
+  {
+    inpStr+='\n';
+  }
+  doctokenizerYYinit(inpStr,g_fileName);
 
   // build abstract syntax tree
   DocRoot *root = new DocRoot(md!=0,singleLine);
@@ -7064,7 +7110,7 @@ DocNode *validatingParseDoc(const char *fileName,int startLine,
   return root;
 }
 
-DocNode *validatingParseText(const char *input)
+DocText *validatingParseText(const char *input)
 {
   // store parser state so we can re-enter this function if needed
   docParserPushContext();
index cd51522..b80e5e1 100644 (file)
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -56,7 +56,7 @@ class SectionDict;
  *  @returns         Root node of the abstract syntax tree. Ownership of the
  *                   pointer is handed over to the caller.
  */
-DocNode *validatingParseDoc(const char *fileName,int startLine,
+DocRoot *validatingParseDoc(const char *fileName,int startLine,
                             Definition *context, MemberDef *md,
                             const char *input,bool indexWords,
                             bool isExample,const char *exampleName=0,
@@ -65,7 +65,7 @@ DocNode *validatingParseDoc(const char *fileName,int startLine,
 /*! Main entry point for parsing simple text fragments. These 
  *  fragments are limited to words, whitespace and symbols.
  */
-DocNode *validatingParseText(const char *input);
+DocText *validatingParseText(const char *input);
 
 /*! Searches for section and anchor commands in the input */
 void docFindSections(const char *input,
@@ -381,7 +381,7 @@ class DocWhiteSpace : public DocNode
 class DocVerbatim : public DocNode
 {
   public:
-    enum Type { Code, HtmlOnly, ManOnly, LatexOnly, RtfOnly, XmlOnly, Verbatim, Dot, Msc };
+    enum Type { Code, HtmlOnly, ManOnly, LatexOnly, RtfOnly, XmlOnly, Verbatim, Dot, Msc, DocbookOnly };
     DocVerbatim(DocNode *parent,const QCString &context,
                 const QCString &text, Type t,bool isExample,
                 const QCString &exampleFile,const QCString &lang=QCString());
@@ -1265,6 +1265,7 @@ class DocText : public CompAccept<DocText>, public DocNode
     Kind kind() const       { return Kind_Text; }
     void accept(DocVisitor *v) { CompAccept<DocText>::accept(this,v); }
     void parse();
+    bool isEmpty() const    { return m_children.isEmpty(); }
 };
 
 /** Root node of documentation tree */
@@ -1277,6 +1278,7 @@ class DocRoot : public CompAccept<DocRoot>, public DocNode
     void parse();
     bool indent() const { return m_indent; }
     bool singleLine() const { return m_singleLine; }
+    bool isEmpty() const { return m_children.isEmpty(); }
 
   private:
     bool m_indent;
index dc483d3..2aa2918 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -135,6 +135,11 @@ void DocSets::initialize()
         "     <string>" << publisherId << "</string>\n"
         "     <key>DocSetPublisherName</key>\n"
         "     <string>" << publisherName << "</string>\n"
+        // markers for Dash
+        "     <key>DashDocSetFamily</key>\n" 
+        "     <string>doxy</string>\n"
+        "     <key>DocSetPlatformFamily</key>\n"
+        "     <string>doxygen</string>\n"
         "</dict>\n"
         "</plist>\n";
   }
@@ -391,6 +396,10 @@ void DocSets::addIndexItem(Definition *context,MemberDef *md,
         break;
       case MemberType_Event:
         type="event"; break;
+      case MemberType_Interface:
+        type="ifc"; break;
+      case MemberType_Service:
+        type="svc"; break;
     }
     cd = md->getClassDef();
     nd = md->getNamespaceDef();
index 2fa0125..c5f0dc7 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 5036f19..8804a41 100644 (file)
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -21,6 +21,7 @@
 
 #include <qcstring.h>
 #include <qlist.h>
+#include <stdio.h>
 #include "htmlattrib.h"
 
 class Definition;
@@ -60,7 +61,8 @@ enum Tokens
   RetVal_Internal       = 0x10011,
   RetVal_SwitchLang     = 0x10012,
   RetVal_CloseXml       = 0x10013,
-  RetVal_EndBlockQuote  = 0x10014
+  RetVal_EndBlockQuote  = 0x10014,
+  RetVal_CopyDoc        = 0x10015
 };
 
 /** @brief Data associated with a token used by the comment block parser. */
@@ -135,6 +137,7 @@ void doctokenizerYYsetStateHtmlOnly();
 void doctokenizerYYsetStateManOnly();
 void doctokenizerYYsetStateLatexOnly();
 void doctokenizerYYsetStateXmlOnly();
+void doctokenizerYYsetStateDbOnly();
 void doctokenizerYYsetStateRtfOnly();
 void doctokenizerYYsetStateVerbatim();
 void doctokenizerYYsetStateDot();
index d2b5123..cdf2933 100644 (file)
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -337,8 +337,8 @@ ATTRNAME  [a-z_A-Z\x80-\xFF][a-z_A-Z0-9\x80-\xFF\-]*
 ATTRIB    {ATTRNAME}{WS}*("="{WS}*(("\""[^\"]*"\"")|("'"[^\']*"'")|[^ \t\r\n'"><]+))?
 URLCHAR   [a-z_A-Z0-9\!\~\,\:\;\'\$\?\@\&\%\#\.\-\+\/\=]
 URLMASK   ({URLCHAR}+([({]{URLCHAR}*[)}])?)+
-FILESCHAR [a-z_A-Z0-9\\:\\\/\-\+]
-FILEECHAR [a-z_A-Z0-9\-\+]
+FILESCHAR [a-z_A-Z0-9\\:\\\/\-\+@&#]
+FILEECHAR [a-z_A-Z0-9\-\+@&#]
 HFILEMASK ("."{FILESCHAR}*{FILEECHAR}+)*
 FILEMASK  ({FILESCHAR}*{FILEECHAR}+("."{FILESCHAR}*{FILEECHAR}+)*)|{HFILEMASK}
 LINKMASK  [^ \t\n\r\\@<&${}]+("("[^\n)]*")")?({BLANK}*("const"|"volatile"){BLANK}+)? 
@@ -349,13 +349,14 @@ SPCMD3    {CMD}form#[0-9]+
 SPCMD4    {CMD}"::"
 INOUT    "inout"|"in"|"out"|("in"{BLANK}*","{BLANK}*"out")|("out"{BLANK}*","{BLANK}*"in")
 PARAMIO   {CMD}param{BLANK}*"["{BLANK}*{INOUT}{BLANK}*"]"
-TEMPCHAR  [a-z_A-Z0-9,: \t\*\&]
+TEMPCHAR  [a-z_A-Z0-9.,: \t\*\&\(\)\[\]]
 FUNCCHAR  [a-z_A-Z0-9,:\<\> \t\^\*\&\[\]]
 SCOPESEP  "::"|"#"|"."
 TEMPLPART "<"{TEMPCHAR}*">"
-SCOPEPRE  {ID}{TEMPLPART}?{SCOPESEP}
+ANONNS    "anonymous_namespace{"[^}]*"}"
+SCOPEPRE  (({ID}{TEMPLPART}?)|{ANONNS}){SCOPESEP}
 SCOPEKEYS ":"({ID}":")*
-SCOPECPP  {SCOPEPRE}*(~)?{ID}("<"{TEMPCHAR}*">")?
+SCOPECPP  {SCOPEPRE}*(~)?{ID}{TEMPLPART}?
 SCOPEOBJC {SCOPEPRE}?{ID}{SCOPEKEYS}?
 SCOPEMASK {SCOPECPP}|{SCOPEOBJC}
 FUNCARG   "("{FUNCCHAR}*")"({BLANK}*("volatile"|"const"){BLANK})?
@@ -379,7 +380,7 @@ HTMLTAG   "<"(("/")?){ID}({WS}+{ATTRIB})*{WS}*(("/")?)">"
 HTMLKEYL  "strong"|"center"|"table"|"caption"|"small"|"code"|"dfn"|"var"|"img"|"pre"|"sub"|"sup"|"tr"|"td"|"th"|"ol"|"ul"|"li"|"tt"|"kbd"|"em"|"hr"|"dl"|"dt"|"dd"|"br"|"i"|"a"|"b"|"p"
 HTMLKEYU  "STRONG"|"CENTER"|"TABLE"|"CAPTION"|"SMALL"|"CODE"|"DFN"|"VAR"|"IMG"|"PRE"|"SUB"|"SUP"|"TR"|"TD"|"TH"|"OL"|"UL"|"LI"|"TT"|"KBD"|"EM"|"HR"|"DL"|"DT"|"DD"|"BR"|"I"|"A"|"B"|"P"
 HTMLKEYW  {HTMLKEYL}|{HTMLKEYU}
-REFWORD2  ("#"|"::")?({ID}{TEMPLPART}?("."|"#"|"::"|"-"|"/"))*({ID}(":")?){FUNCARG}?
+REFWORD2  ("#"|"::")?((({ID}{TEMPLPART}?)|{ANONNS})("."|"#"|"::"|"-"|"/"))*({ID}{TEMPLPART}?(":")?){FUNCARG}?
 REFWORD3  ({ID}":")*{ID}":"?
 REFWORD   {LABELID}|{REFWORD2}|{REFWORD3}
 
@@ -401,6 +402,7 @@ REFWORD   {LABELID}|{REFWORD2}|{REFWORD3}
 %x St_LatexOnly
 %x St_RtfOnly
 %x St_XmlOnly
+%x St_DbOnly
 %x St_Verbatim
 %x St_Dot
 %x St_Msc
@@ -688,34 +690,37 @@ REFWORD   {LABELID}|{REFWORD2}|{REFWORD3}
                          g_token->name = yytext;
                          return TK_COMMAND;
                       }
+<St_Para>({BLANK}*\n)+{BLANK}*\n/{LISTITEM} { /* skip trailing paragraph followed by new list item */
+                         if (g_insidePre)
+                         {
+                           REJECT;
+                         }
+                       }
+<St_Para>({BLANK}*\n)+{BLANK}*\n/{MLISTITEM} { /* skip trailing paragraph followed by new list item */
+                         if (!Doxygen::markdownSupport || g_insidePre)
+                         {
+                           REJECT;
+                         }
+                       }
+<St_Para>({BLANK}*\n)+{BLANK}*\n/{OLISTITEM} { /* skip trailing paragraph followed by new list item */
+                         if (!Doxygen::markdownSupport || g_insidePre)
+                         {
+                           REJECT;
+                         }
+                       }
 <St_Para>({BLANK}*\n)+{BLANK}*\n{BLANK}* {
-                         // g_insidePre was always FALSE, so the next section
-                         // was never executed, now g_insidePre is set properly
-                         // again, so the section is commented out to keep the
-                         // old behavior.
-                         //if (g_insidePre)
-                        //{
-                        //  /* Inside a <pre>..</pre> blank lines are treated
-                        //   * as whitespace.
-                        //   */
-                         //  g_token->chars=yytext;
-                        //  return TK_WHITESPACE;
-                        //}
-                        //else // found end of a paragraph
-                        {
-                           g_token->indent=computeIndent(yytext,(int)yyleng);
-                           int i;
-                           // put back the indentation (needed for list items)
-                           for (i=0;i<g_token->indent;i++)
-                           {
-                             unput(' ');
-                           }
-                           // tell flex that after putting the last indent 
-                           // back we are at the beginning of the line
-                           YY_CURRENT_BUFFER->yy_at_bol=1;
-                           // start of a new paragraph
-                          return TK_NEWPARA;
-                        }
+                         g_token->indent=computeIndent(yytext,(int)yyleng);
+                         int i;
+                         // put back the indentation (needed for list items)
+                         for (i=0;i<g_token->indent;i++)
+                         {
+                           unput(' ');
+                         }
+                         // tell flex that after putting the last indent 
+                         // back we are at the beginning of the line
+                         YY_CURRENT_BUFFER->yy_at_bol=1;
+                         // start of a new paragraph
+                        return TK_NEWPARA;
                        }
 <St_CodeOpt>{BLANK}*"{"(".")?{LABELID}"}" {
                          g_token->name = yytext;
@@ -779,6 +784,14 @@ REFWORD   {LABELID}|{REFWORD2}|{REFWORD3}
 <St_XmlOnly>.          {
                         g_token->verb+=yytext;
                       }
+<St_DbOnly>{CMD}"enddocbookonly" {
+                         return RetVal_OK;
+                       }
+<St_DbOnly>[^\\@\n]+  |
+<St_DbOnly>\n         |
+<St_DbOnly>.          {
+                        g_token->verb+=yytext;
+                      }
 <St_Verbatim>{CMD}"endverbatim" {
                         g_token->verb=stripEmptyLines(g_token->verb);
                          return RetVal_OK;
@@ -1091,13 +1104,13 @@ REFWORD   {LABELID}|{REFWORD2}|{REFWORD3}
                                      BEGIN(St_SecSkip);
                                     }
 <St_SecSkip>{CMD}{ID}              {
-                                      if (strcmp(yytext+1,g_endMarker)==0)
+                                      if (qstrcmp(yytext+1,g_endMarker)==0)
                                      {
                                        BEGIN(St_Sections);
                                      }
                                     }
 <St_SecSkip>"-->"                  {
-                                      if (strcmp(yytext,g_endMarker)==0)
+                                      if (qstrcmp(yytext,g_endMarker)==0)
                                      {
                                        BEGIN(St_Sections);
                                      }
@@ -1126,7 +1139,7 @@ REFWORD   {LABELID}|{REFWORD2}|{REFWORD3}
                          BEGIN(St_Sections);
                       }
 <St_SecTitle,St_SecLabel1,St_SecLabel2>. {
-                         warn(g_fileName,yylineno,"warning: Unexpected character `%s' while looking for section label or title",yytext); 
+                         warn(g_fileName,yylineno,"Unexpected character `%s' while looking for section label or title",yytext); 
                        }
 
 <St_Snippet>[^\n]+     |
@@ -1138,15 +1151,15 @@ REFWORD   {LABELID}|{REFWORD2}|{REFWORD3}
    
      /* Generic rules that work for all states */ 
 <*>\n                  { 
-                         warn(g_fileName,yylineno,"warning: Unexpected new line character"); 
+                         warn(g_fileName,yylineno,"Unexpected new line character"); 
                       }
 <*>[\\@<>&$#%~"=]      { /* unescaped special character */
-                         //warn(g_fileName,yylineno,"warning: Unexpected character `%s', assuming command \\%s was meant.",yytext,yytext); 
+                         //warn(g_fileName,yylineno,"Unexpected character `%s', assuming command \\%s was meant.",yytext,yytext); 
                         g_token->name = yytext;
                         return TK_COMMAND;
                        }
 <*>.                   { 
-                         warn(g_fileName,yylineno,"warning: Unexpected character `%s'",yytext); 
+                         warn(g_fileName,yylineno,"Unexpected character `%s'",yytext); 
                       }
 %%
 
@@ -1229,6 +1242,12 @@ void doctokenizerYYsetStateXmlOnly()
   BEGIN(St_XmlOnly);
 }
 
+void doctokenizerYYsetStateDbOnly()
+{
+  g_token->verb="";
+  BEGIN(St_DbOnly);
+}
+
 void doctokenizerYYsetStateLatexOnly()
 {
   g_token->verb="";
index 104dce0..240e137 100644 (file)
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -27,6 +27,7 @@ const int DocVisitor_RTF   = 3;
 const int DocVisitor_Man   = 4;
 const int DocVisitor_Text  = 5;
 const int DocVisitor_Other = 6;
+const int DocVisitor_Docbook = 7;
 
 // forward declarations
 class DocWord;
index 0866768..ffe1028 100644 (file)
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
 
 static const char svgZoomHeader[] =
 "<svg id=\"main\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" xml:space=\"preserve\" onload=\"init(evt)\">\n"
+"<style type=\"text/css\"><![CDATA[\n"
+".edge:hover path { stroke: red; }\n"
+".edge:hover polygon { stroke: red; fill: red; }\n"
+"]]></style>\n"
+"<script type=\"text/javascript\"><![CDATA[\n"
+"var edges = document.getElementsByTagName('g');\n"
+"if (edges && edges.length) {\n"
+"  for (var i=0;i<edges.length;i++) {\n"
+"    if (edges[i].id.substr(0,4)=='edge') {\n"
+"      edges[i].setAttribute('class','edge');\n"
+"    }\n"
+"  }\n"
+"}\n"
+"]]></script>\n"
 "        <defs>\n"
 "                <circle id=\"rim\" cx=\"0\" cy=\"0\" r=\"7\"/>\n"
 "                <circle id=\"rim2\" cx=\"0\" cy=\"0\" r=\"3.5\"/>\n"
@@ -92,29 +106,37 @@ static const char svgZoomHeader[] =
 ;
 
 static const char svgZoomFooter[] =
+// navigation panel
 "        <g id=\"navigator\" transform=\"translate(0 0)\" fill=\"#404254\">\n"
 "                <rect fill=\"#f2f5e9\" fill-opacity=\"0.5\" stroke=\"#606060\" stroke-width=\".5\" x=\"0\" y=\"0\" width=\"60\" height=\"60\"/>\n"
+// zoom in
 "                <use id=\"zoomplus\" xlink:href=\"#zoomPlus\" x=\"17\" y=\"9\" onmousedown=\"handleZoom(evt,'in')\"/>\n"
+// zoom out
 "                <use id=\"zoomminus\" xlink:href=\"#zoomMin\" x=\"42\" y=\"9\" onmousedown=\"handleZoom(evt,'out')\"/>\n"
+// reset zoom
 "                <use id=\"reset\" xlink:href=\"#resetDef\" x=\"30\" y=\"36\" onmousedown=\"handleReset()\"/>\n"
+// arrow up
 "                <g id=\"arrowUp\" xlink:href=\"#dirArrow\" transform=\"translate(30 24)\" onmousedown=\"handlePan(0,-1)\">\n"
 "                  <use xlink:href=\"#rim\" fill=\"#404040\">\n"
 "                        <set attributeName=\"fill\" to=\"#808080\" begin=\"arrowUp.mouseover\" end=\"arrowUp.mouseout\"/>\n"
 "                  </use>\n"
 "                  <path fill=\"none\" stroke=\"white\" stroke-width=\"1.5\" d=\"M0,-3.0v7 M-2.5,-0.5L0,-3.0L2.5,-0.5\"/>\n"
 "                </g>\n"
+// arrow right
 "                <g id=\"arrowRight\" xlink:href=\"#dirArrow\" transform=\"rotate(90) translate(36 -43)\" onmousedown=\"handlePan(1,0)\">\n"
 "                  <use xlink:href=\"#rim\" fill=\"#404040\">\n"
 "                        <set attributeName=\"fill\" to=\"#808080\" begin=\"arrowRight.mouseover\" end=\"arrowRight.mouseout\"/>\n"
 "                  </use>\n"
 "                  <path fill=\"none\" stroke=\"white\" stroke-width=\"1.5\" d=\"M0,-3.0v7 M-2.5,-0.5L0,-3.0L2.5,-0.5\"/>\n"
 "                </g>\n"
+// arrow down
 "                <g id=\"arrowDown\" xlink:href=\"#dirArrow\" transform=\"rotate(180) translate(-30 -48)\" onmousedown=\"handlePan(0,1)\">\n"
 "                  <use xlink:href=\"#rim\" fill=\"#404040\">\n"
 "                        <set attributeName=\"fill\" to=\"#808080\" begin=\"arrowDown.mouseover\" end=\"arrowDown.mouseout\"/>\n"
 "                  </use>\n"
 "                  <path fill=\"none\" stroke=\"white\" stroke-width=\"1.5\" d=\"M0,-3.0v7 M-2.5,-0.5L0,-3.0L2.5,-0.5\"/>\n"
 "                </g>\n"
+// arrow left
 "                <g id=\"arrowLeft\" xlink:href=\"#dirArrow\" transform=\"rotate(270) translate(-36 17)\" onmousedown=\"handlePan(-1,0)\">\n"
 "                  <use xlink:href=\"#rim\" fill=\"#404040\">\n"
 "                        <set attributeName=\"fill\" to=\"#808080\" begin=\"arrowLeft.mouseover\" end=\"arrowLeft.mouseout\"/>\n"
@@ -122,15 +144,7 @@ static const char svgZoomFooter[] =
 "                  <path fill=\"none\" stroke=\"white\" stroke-width=\"1.5\" d=\"M0,-3.0v7 M-2.5,-0.5L0,-3.0L2.5,-0.5\"/>\n"
 "                </g>\n"
 "        </g>\n"
-/*
-"        <svg viewBox=\"0 0 25 25\" width=\"100%\" height=\"30px\" preserveAspectRatio=\"xMaxYMin meet\"> \n"
-"          <g id=\"printButton\" transform=\"scale(0.4 0.4)\" onmousedown=\"handlePrint(evt)\">\n"
-"            <rect height=\"23.33753581\" id=\"paper\" rx=\"2\" style=\"fill:#f2f5e9;fill-rule:evenodd;stroke:#111111;stroke-width:3.224;stroke-linejoin:round;\" transform=\"matrix(1.000000,0.000000,-0.339266,0.940691,0.000000,0.000000)\" width=\"25.55231285\" x=\"26.69387353\" y=\"7.36162977\"/>\n"
-"            <rect height=\"26.272097\" id=\"body\" rx=\"2\" style=\"fill:#404040;fill-rule:evenodd;stroke:#111111;stroke-width:3.125;stroke-linejoin:round;\" width=\"50\" x=\"4.5295201\" y=\"27.078951\"/>\n"
-"            <rect height=\"8.27750969\" id=\"tray\" style=\"fill:#d2d5c9;fill-rule:evenodd;stroke:#111111;stroke-width:3.125;stroke-linecap:round;stroke-linejoin:round;\" width=\"40\" x=\"10.28778839\" y=\"44.96812282\"/>\n"
-"          </g>\n"
-"        </svg>\n"
-*/
+// link to orginial SVG
 "        <svg viewBox=\"0 0 15 15\" width=\"100%\" height=\"30px\" preserveAspectRatio=\"xMaxYMin meet\">\n"
 "         <g id=\"arrow_out\" transform=\"scale(0.3 0.3)\">\n"
 "          <a xlink:href=\"$orgname\" target=\"_base\">\n"
@@ -365,7 +379,7 @@ static bool convertMapFile(FTextStream &t,const char *mapName,
   QFile f(mapName);
   if (!f.open(IO_ReadOnly)) 
   {
-    err("error: problems opening map file %s for inclusion in the docs!\n"
+    err("problems opening map file %s for inclusion in the docs!\n"
         "If you installed Graphviz/dot after a previous failing run, \n"
         "try deleting the output directory and rerun doxygen.\n",mapName);
     return FALSE;
@@ -573,7 +587,7 @@ static bool readSVGSize(const QCString &fileName,int *width,int *height)
     if (numBytes>0)
     {
       buf[numBytes]='\0';
-      if (strncmp(buf,"<!--zoomable ",13)==0)
+      if (qstrncmp(buf,"<!--zoomable ",13)==0)
       {
         *width=-1;
         *height=-1;
@@ -659,7 +673,7 @@ static void checkDotResult(const QCString &imgName)
       {
         if (!(data[1]=='P' && data[2]=='N' && data[3]=='G'))
         {
-          err("error: Image `%s' produced by dot is not a valid PNG!\n"
+          err("Image `%s' produced by dot is not a valid PNG!\n"
               "You should either select a different format "
               "(DOT_IMAGE_FORMAT in the config file) or install a more "
               "recent version of graphviz (1.7+)\n",imgName.data()
@@ -668,13 +682,13 @@ static void checkDotResult(const QCString &imgName)
       }
       else
       {
-        err("error: Could not read image `%s' generated by dot!\n",imgName.data());
+        err("Could not read image `%s' generated by dot!\n",imgName.data());
       }
       fclose(f);
     }
     else
     {
-      err("error: Could not open image `%s' generated by dot!\n",imgName.data());
+      err("Could not open image `%s' generated by dot!\n",imgName.data());
     }
   }
 }
@@ -771,7 +785,7 @@ class DotNodeList : public QList<DotNode>
    ~DotNodeList() {}
    int compareItems(QCollection::Item item1,QCollection::Item item2)
    {
-     return stricmp(((DotNode *)item1)->m_label,((DotNode *)item2)->m_label);
+     return qstricmp(((DotNode *)item1)->m_label,((DotNode *)item2)->m_label);
    }
 };
 
@@ -840,7 +854,7 @@ bool DotRunner::run()
   }
   if (!postCmd.isEmpty() && portable_system(postCmd,postArgs)!=0)
   {
-    err("error: Problems running '%s' as a post-processing step for dot output\n",m_postCmd.data());
+    err("Problems running '%s' as a post-processing step for dot output\n",m_postCmd.data());
     return FALSE;
   }
   if (checkResult) checkDotResult(imageName);
@@ -957,13 +971,13 @@ bool DotFilePatcher::run()
   QFile fo(m_patchFile);
   if (!fi.open(IO_ReadOnly)) 
   {
-    err("error: problem opening file %s for patching!\n",tmpName.data());
+    err("problem opening file %s for patching!\n",tmpName.data());
     QDir::current().rename(tmpName,m_patchFile);
     return FALSE;
   }
   if (!fo.open(IO_WriteOnly))
   {
-    err("error: problem opening file %s for patching!\n",m_patchFile.data());
+    err("problem opening file %s for patching!\n",m_patchFile.data());
     QDir::current().rename(tmpName,m_patchFile);
     return FALSE;
   }
@@ -1108,12 +1122,12 @@ bool DotFilePatcher::run()
     QFile fo(orgName);
     if (!fi.open(IO_ReadOnly)) 
     {
-      err("error: problem opening file %s for reading!\n",tmpName.data());
+      err("problem opening file %s for reading!\n",tmpName.data());
       return FALSE;
     }
     if (!fo.open(IO_WriteOnly))
     {
-      err("error: problem opening file %s for writing!\n",orgName.data());
+      err("problem opening file %s for writing!\n",orgName.data());
       return FALSE;
     }
     FTextStream t(&fo);
@@ -1801,16 +1815,10 @@ void DotNode::writeBox(FTextStream &t,
   else 
   {
     static bool dotTransparent = Config_getBool("DOT_TRANSPARENT");
-    static bool vhdlOpt = Config_getBool("OPTIMIZE_OUTPUT_VHDL");
     if (!dotTransparent)
     {
-      ClassDef* ccd=m_classDef;
-
       t << ",color=\"" << labCol << "\", fillcolor=\"";
-      if (ccd && vhdlOpt && (VhdlDocGen::VhdlClasses)ccd->protection()==VhdlDocGen::ARCHITECTURECLASS)
-        t << "khaki";  
-      else
-        t << "white";
+      t << "white";
       t << "\", style=\"filled\"";
     }
     else
@@ -2016,6 +2024,74 @@ void DotNode::writeXML(FTextStream &t,bool isClassGraph)
   t << "      </node>" << endl;
 }
 
+void DotNode::writeDocbook(FTextStream &t,bool isClassGraph)
+{
+  t << "      <node id=\"" << m_number << "\">" << endl;
+  t << "        <label>" << convertToXML(m_label) << "</label>" << endl;
+  if (!m_url.isEmpty())
+  {
+    QCString url(m_url);
+    char *refPtr = url.data();
+    char *urlPtr = strchr(url.data(),'$');
+    if (urlPtr)
+    {
+      *urlPtr++='\0';
+      t << "        <link refid=\"" << convertToXML(urlPtr) << "\"";
+      if (*refPtr!='\0')
+      {
+        t << " external=\"" << convertToXML(refPtr) << "\"";
+      }
+      t << "/>" << endl;
+    }
+  }
+  if (m_children)
+  {
+    QListIterator<DotNode> nli(*m_children);
+    QListIterator<EdgeInfo> eli(*m_edgeInfo);
+    DotNode *childNode;
+    EdgeInfo *edgeInfo;
+    for (;(childNode=nli.current());++nli,++eli)
+    {
+      edgeInfo=eli.current();
+      t << "        <childnode refid=\"" << childNode->m_number << "\" relation=\"";
+      if (isClassGraph)
+      {
+        switch(edgeInfo->m_color)
+        {
+          case EdgeInfo::Blue:    t << "public-inheritance"; break;
+          case EdgeInfo::Green:   t << "protected-inheritance"; break;
+          case EdgeInfo::Red:     t << "private-inheritance"; break;
+          case EdgeInfo::Purple:  t << "usage"; break;
+          case EdgeInfo::Orange:  t << "template-instance"; break;
+          case EdgeInfo::Grey:    ASSERT(0); break;
+        }
+      }
+      else // include graph
+      {
+        t << "include";
+      }
+      t << "\">" << endl;
+      if (!edgeInfo->m_label.isEmpty())
+      {
+        int p=0;
+        int ni;
+        while ((ni=edgeInfo->m_label.find('\n',p))!=-1)
+        {
+          t << "          <edgelabel>"
+            << convertToXML(edgeInfo->m_label.mid(p,ni-p))
+            << "</edgelabel>" << endl;
+          p=ni+1;
+        }
+        t << "          <edgelabel>"
+          << convertToXML(edgeInfo->m_label.right(edgeInfo->m_label.length()-p))
+          << "</edgelabel>" << endl;
+      }
+      t << "        </childnode>" << endl;
+    }
+  }
+  t << "      </node>" << endl;
+}
+
 
 void DotNode::writeDEF(FTextStream &t)
 {
@@ -2190,15 +2266,13 @@ void DotGfxHierarchyTable::writeGraph(FTextStream &out,
   //printf("DotGfxHierarchyTable::writeGraph(%s)\n",name);
   //printf("m_rootNodes=%p count=%d\n",m_rootNodes,m_rootNodes->count());
   
-  static bool vhdl = Config_getBool("OPTIMIZE_OUTPUT_VHDL");
-
   if (m_rootSubgraphs->count()==0) return;
 
   QDir d(path);
   // store the original directory
   if (!d.exists())
   {
-    err("error: Output dir %s does not exist!\n",path); exit(1);
+    err("Output dir %s does not exist!\n",path); exit(1);
   }
 
   // put each connected subgraph of the hierarchy in a row of the HTML output
@@ -2210,18 +2284,6 @@ void DotGfxHierarchyTable::writeGraph(FTextStream &out,
   for (dnli.toFirst();(n=dnli.current());++dnli)
   {
     QCString baseName;
-
-    if (vhdl)
-    {   
-      QCString l=n->m_url;
-      l=VhdlDocGen::convertFileNameToClassName(l);
-      ClassDef *cd=Doxygen::classSDict->find(l);
-      if (cd==0) continue;
-      // only entities are shown
-      if ((VhdlDocGen::VhdlClasses)cd->protection()!=VhdlDocGen::ENTITYCLASS)
-        continue;
-    }
-
     QCString imgExt = Config_getEnum("DOT_IMAGE_FORMAT");
     baseName.sprintf("inherit_graph_%d",count++);
     //baseName = convertNameToFile(baseName);
@@ -2398,6 +2460,8 @@ void DotGfxHierarchyTable::addClassList(ClassSDict *cl)
   for (cli.toLast();(cd=cli.current());--cli)
   {
     //printf("Trying %s subClasses=%d\n",cd->name().data(),cd->subClasses()->count());
+    if (cd->getLanguage()==SrcLangExt_VHDL  && !(VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::ENTITYCLASS)
+      continue; 
     if (!hasVisibleRoot(cd->baseClasses()) &&
         cd->isVisibleInHierarchy()
        ) // root node in the forest
@@ -2637,7 +2701,7 @@ bool DotClassGraph::determineVisibleNodes(DotNode *rootNode,
     {
       DotNode *n = childQueue.take(0);
       int distance = n->distance();
-      if (!n->isVisible() && distance<maxDistance) // not yet processed
+      if (!n->isVisible() && distance<=maxDistance) // not yet processed
       {
         if (distance>0)
         {
@@ -2666,7 +2730,7 @@ bool DotClassGraph::determineVisibleNodes(DotNode *rootNode,
     if (includeParents && parentQueue.count()>0)
     {
       DotNode *n = parentQueue.take(0);
-      if ((!n->isVisible() || firstNode) && n->distance()<maxDistance) // not yet processed
+      if ((!n->isVisible() || firstNode) && n->distance()<=maxDistance) // not yet processed
       {
         firstNode=FALSE;
         int distance = n->distance();
@@ -3022,7 +3086,7 @@ QCString DotClassGraph::writeGraph(FTextStream &out,
   // store the original directory
   if (!d.exists())
   {
-    err("error: Output dir %s does not exist!\n",path); exit(1);
+    err("Output dir %s does not exist!\n",path); exit(1);
   }
   static bool usePDFLatex = Config_getBool("USE_PDFLATEX");
 
@@ -3169,6 +3233,16 @@ void DotClassGraph::writeXML(FTextStream &t)
   }
 }
 
+void DotClassGraph::writeDocbook(FTextStream &t)
+{
+  QDictIterator<DotNode> dni(*m_usedNodes);
+  DotNode *node;
+  for (;(node=dni.current());++dni)
+  {
+    node->writeDocbook(t,TRUE);
+  }
+}
+
 void DotClassGraph::writeDEF(FTextStream &t)
 {
   QDictIterator<DotNode> dni(*m_usedNodes);
@@ -3253,7 +3327,7 @@ void DotInclDepGraph::determineVisibleNodes(QList<DotNode> &queue, int &maxNodes
   {
     static int maxDistance = Config_getInt("MAX_DOT_GRAPH_DEPTH");
     DotNode *n = queue.take(0);
-    if (!n->isVisible() && n->distance()<maxDistance) // not yet processed
+    if (!n->isVisible() && n->distance()<=maxDistance) // not yet processed
     {
       n->markAsVisible();
       maxNodes--;
@@ -3299,7 +3373,6 @@ void DotInclDepGraph::determineTruncatedNodes(QList<DotNode> &queue)
 
 DotInclDepGraph::DotInclDepGraph(FileDef *fd,bool inverse)
 {
-  m_maxDistance = 0;
   m_inverse = inverse;
   ASSERT(fd!=0);
   m_diskName  = fd->getFileBase().copy();
@@ -3356,7 +3429,7 @@ QCString DotInclDepGraph::writeGraph(FTextStream &out,
   // store the original directory
   if (!d.exists())
   {
-    err("error: Output dir %s does not exist!\n",path); exit(1);
+    err("Output dir %s does not exist!\n",path); exit(1);
   }
   static bool usePDFLatex = Config_getBool("USE_PDFLATEX");
 
@@ -3484,20 +3557,30 @@ void DotInclDepGraph::writeXML(FTextStream &t)
   }
 }
 
+void DotInclDepGraph::writeDocbook(FTextStream &t)
+{
+  QDictIterator<DotNode> dni(*m_usedNodes);
+  DotNode *node;
+  for (;(node=dni.current());++dni)
+  {
+    node->writeDocbook(t,FALSE);
+  }
+}
+
 //-------------------------------------------------------------
 
 int DotCallGraph::m_curNodeNumber = 0;
 
 void DotCallGraph::buildGraph(DotNode *n,MemberDef *md,int distance)
 {
-  LockingPtr<MemberSDict> refs = m_inverse ? md->getReferencedByMembers() : md->getReferencesMembers();
-  if (!refs.isNull())
+  MemberSDict *refs = m_inverse ? md->getReferencedByMembers() : md->getReferencesMembers();
+  if (refs)
   {
     MemberSDict::Iterator mri(*refs);
     MemberDef *rmd;
     for (;(rmd=mri.current());++mri)
     {
-      if (rmd->isFunction() || rmd->isSlot() || rmd->isSignal())
+      if (rmd->showInCallGraph())
       {
         QCString uniqueId;
         uniqueId=rmd->getReference()+"$"+
@@ -3547,7 +3630,7 @@ void DotCallGraph::determineVisibleNodes(QList<DotNode> &queue, int &maxNodes)
   {
     static int maxDistance = Config_getInt("MAX_DOT_GRAPH_DEPTH");
     DotNode *n = queue.take(0);
-    if (!n->isVisible() && n->distance()<maxDistance) // not yet processed
+    if (!n->isVisible() && n->distance()<=maxDistance) // not yet processed
     {
       n->markAsVisible();
       maxNodes--;
@@ -3594,7 +3677,6 @@ void DotCallGraph::determineTruncatedNodes(QList<DotNode> &queue)
 
 DotCallGraph::DotCallGraph(MemberDef *md,bool inverse)
 {
-  m_maxDistance = 0;
   m_inverse = inverse;
   m_diskName = md->getOutputFileBase()+"_"+md->anchor();
   m_scope    = md->getOuterScope();
@@ -3650,7 +3732,7 @@ QCString DotCallGraph::writeGraph(FTextStream &out, GraphOutputFormat format,
   // store the original directory
   if (!d.exists())
   {
-    err("error: Output dir %s does not exist!\n",path); exit(1);
+    err("Output dir %s does not exist!\n",path); exit(1);
   }
   static bool usePDFLatex = Config_getBool("USE_PDFLATEX");
 
@@ -3788,7 +3870,7 @@ QCString DotDirDeps::writeGraph(FTextStream &out,
   // store the original directory
   if (!d.exists())
   {
-    err("error: Output dir %s does not exist!\n",path); exit(1);
+    err("Output dir %s does not exist!\n",path); exit(1);
   }
   static bool usePDFLatex = Config_getBool("USE_PDFLATEX");
 
@@ -3913,7 +3995,7 @@ void generateGraphLegend(const char *path)
   // store the original directory
   if (!d.exists())
   {
-    err("error: Output dir %s does not exist!\n",path); exit(1);
+    err("Output dir %s does not exist!\n",path); exit(1);
   }
 
   QGString theGraph;
@@ -3988,7 +4070,7 @@ void writeDotGraphFromFile(const char *inFile,const char *outDir,
   QDir d(outDir);
   if (!d.exists())
   {
-    err("error: Output dir %s does not exist!\n",outDir); exit(1);
+    err("Output dir %s does not exist!\n",outDir); exit(1);
   }
 
   QCString imgExt = Config_getEnum("DOT_IMAGE_FORMAT");
@@ -4042,7 +4124,7 @@ void writeDotImageMapFromFile(FTextStream &t,
   QDir d(outDir);
   if (!d.exists())
   {
-    err("error: Output dir %s does not exist!\n",outDir.data()); exit(1);
+    err("Output dir %s does not exist!\n",outDir.data()); exit(1);
   }
 
   QCString mapName = baseName+".map";
@@ -4110,8 +4192,8 @@ void DotGroupCollaboration::buildGraph(GroupDef* gd)
   // hierarchy.
 
   // Write parents
-  LockingPtr<GroupList> groups = gd->partOfGroups();
-  if ( groups!=0 )
+  GroupList *groups = gd->partOfGroups();
+  if ( groups )
   {
     GroupListIterator gli(*groups);
     GroupDef *d;
@@ -4304,7 +4386,7 @@ QCString DotGroupCollaboration::writeGraph( FTextStream &t, GraphOutputFormat fo
   // store the original directory
   if (!d.exists())
   {
-    err("error: Output dir %s does not exist!\n",path); exit(1);
+    err("Output dir %s does not exist!\n",path); exit(1);
   }
   static bool usePDFLatex = Config_getBool("USE_PDFLATEX");
 
index 5db58af..a02b32d 100644 (file)
--- a/src/dot.h
+++ b/src/dot.h
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -81,6 +81,7 @@ class DotNode
     int  m_subgraphId;
     void clearWriteFlag();
     void writeXML(FTextStream &t,bool isClassGraph);
+    void writeDocbook(FTextStream &t,bool isClassGraph);
     void writeDEF(FTextStream &t);
     QCString label() const { return m_label; }
     int  number() const { return m_number; }
@@ -169,6 +170,7 @@ class DotClassGraph
                     bool TBRank=TRUE,bool imageMap=TRUE,int graphId=-1) const;
 
     void writeXML(FTextStream &t);
+    void writeDocbook(FTextStream &t);
     void writeDEF(FTextStream &t);
     QCString diskName() const;
 
@@ -201,7 +203,7 @@ class DotInclDepGraph
     bool isTooBig() const;
     QCString diskName() const;
     void writeXML(FTextStream &t);
-
+    void writeDocbook(FTextStream &t);
   private:
     void buildGraph(DotNode *n,FileDef *fd,int distance);
     void determineVisibleNodes(QList<DotNode> &queue,int &maxNodes);
@@ -211,7 +213,6 @@ class DotInclDepGraph
     QDict<DotNode> *m_usedNodes;
     static int      m_curNodeNumber;
     QCString        m_diskName;
-    int             m_maxDistance;
     bool            m_inverse;
 };
 
@@ -235,7 +236,6 @@ class DotCallGraph
     DotNode        *m_startNode;
     static int      m_curNodeNumber;
     QDict<DotNode> *m_usedNodes;
-    int             m_maxDistance;
     int             m_recDepth;
     bool            m_inverse;
     QCString        m_diskName;
index 916c64d..e1fe597 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -57,7 +57,9 @@
 #include "ftvhelp.h"
 #include "defargs.h"
 #include "rtfgen.h"
+#include "sqlite3gen.h"
 #include "xmlgen.h"
+#include "docbookgen.h"
 #include "defgen.h"
 #include "perlmodgen.h"
 #include "reflist.h"
@@ -94,6 +96,7 @@
 #include "membergroup.h"
 #include "docsets.h"
 #include "formula.h"
+#include "settings.h"
 
 #define RECURSE_ENTRYTREE(func,var) \
   do { if (var->children()) { \
@@ -124,6 +127,7 @@ PageSDict       *Doxygen::exampleSDict = 0;
 SectionDict     *Doxygen::sectionDict = 0;        // all page sections
 CiteDict        *Doxygen::citeDict=0;              // database of bibliographic references
 StringDict       Doxygen::aliasDict(257);          // aliases
+QDict<void>      Doxygen::inputPaths(1009);
 FileNameDict    *Doxygen::includeNameDict = 0;     // include names
 FileNameDict    *Doxygen::exampleNameDict = 0;     // examples
 FileNameDict    *Doxygen::imageNameDict = 0;       // images
@@ -141,7 +145,8 @@ QDict<RefList>  *Doxygen::xrefLists = new QDict<RefList>; // dictionary of cross
 bool             Doxygen::parseSourcesNeeded = FALSE;
 QTime            Doxygen::runningTime;
 SearchIndexIntf *Doxygen::searchIndex=0;
-QDict<DefinitionIntf> *Doxygen::symbolMap;
+QDict<DefinitionIntf> *Doxygen::symbolMap = 0;
+QDict<Definition> *Doxygen::clangUsrMap = 0;
 bool             Doxygen::outputToWizard=FALSE;
 QDict<int> *     Doxygen::htmlDirMap = 0;
 QCache<LookupInfo> *Doxygen::lookupCache;
@@ -150,7 +155,6 @@ SDict<DirRelation> Doxygen::dirRelations(257);
 ParserManager   *Doxygen::parserManager = 0;
 QCString Doxygen::htmlFileExtension;
 bool             Doxygen::suppressDocWarnings = FALSE;
-ObjCache        *Doxygen::symbolCache = 0;
 Store           *Doxygen::symbolStorage;
 QCString         Doxygen::objDBFileName;
 QCString         Doxygen::entryDBFileName;
@@ -176,30 +180,75 @@ static bool             g_dumpConfigAsXML = FALSE;
 
 void clearAll()
 {
-  g_inputFiles.clear();      
-  //g_excludeNameDict.clear();  
+  g_inputFiles.clear();
+  //g_excludeNameDict.clear();
   //delete g_outputList; g_outputList=0;
 
-  Doxygen::classSDict->clear();       
-  Doxygen::namespaceSDict->clear();   
-  Doxygen::pageSDict->clear();         
-  Doxygen::exampleSDict->clear();      
-  Doxygen::inputNameList->clear();   
-  Doxygen::formulaList->clear();     
-  Doxygen::sectionDict->clear();       
-  Doxygen::inputNameDict->clear();    
-  Doxygen::includeNameDict->clear();  
-  Doxygen::exampleNameDict->clear();  
-  Doxygen::imageNameDict->clear();     
-  Doxygen::dotFileNameDict->clear();     
-  Doxygen::mscFileNameDict->clear();     
-  Doxygen::formulaDict->clear();      
-  Doxygen::formulaNameDict->clear();  
+  Doxygen::classSDict->clear();
+  Doxygen::namespaceSDict->clear();
+  Doxygen::pageSDict->clear();
+  Doxygen::exampleSDict->clear();
+  Doxygen::inputNameList->clear();
+  Doxygen::formulaList->clear();
+  Doxygen::sectionDict->clear();
+  Doxygen::inputNameDict->clear();
+  Doxygen::includeNameDict->clear();
+  Doxygen::exampleNameDict->clear();
+  Doxygen::imageNameDict->clear();
+  Doxygen::dotFileNameDict->clear();
+  Doxygen::mscFileNameDict->clear();
+  Doxygen::formulaDict->clear();
+  Doxygen::formulaNameDict->clear();
   Doxygen::tagDestinationDict.clear();
   delete Doxygen::citeDict;
   delete Doxygen::mainPage; Doxygen::mainPage=0;
 }
 
+class Statistics 
+{
+  public:
+    Statistics() { stats.setAutoDelete(TRUE); }
+    void begin(const char *name)
+    {
+      msg(name);
+      stat *entry= new stat(name,0);
+      stats.append(entry);
+      time.restart();
+    }
+    void end()
+    {
+      stats.last()->elapsed=((double)time.elapsed())/1000.0;
+    }
+    void print()
+    {
+      bool restore=FALSE;
+      if (Debug::isFlagSet(Debug::Time))
+      {
+        Debug::clearFlag("time");
+        restore=TRUE;
+      }
+      msg("----------------------\n");
+      QListIterator<stat> sli(stats);
+      stat *s;
+      for ( sli.toFirst(); (s=sli.current()); ++sli )
+      {
+        msg("Spent %.3f seconds in %s",s->elapsed,s->name);
+      }
+      if (restore) Debug::setFlag("time");
+    }
+  private:
+    struct stat 
+    {
+      const char *name;
+      double elapsed;
+      stat() : name(NULL),elapsed(0) {}
+      stat(const char *n, double el) : name(n),elapsed(el) {}
+    };
+    QList<stat> stats;
+    QTime       time;
+} g_s;
+
+
 void statistics()
 {
   fprintf(stderr,"--- inputNameDict stats ----\n");
@@ -245,6 +294,24 @@ static void findMember(EntryNav *rootNav,
                        bool isFunc
                       );
 
+enum FindBaseClassRelation_Mode
+{
+  TemplateInstances,
+  DocumentedOnly,
+  Undocumented
+};
+
+static bool findClassRelation(
+                           EntryNav *rootNav,
+                           Definition *context,
+                           ClassDef *cd,
+                           BaseInfo *bi,
+                           QDict<int> *templateNames,
+                           /*bool insertUndocumented*/
+                           FindBaseClassRelation_Mode mode,
+                           bool isArtificial
+                          );
+
 /** A struct contained the data for an STL class */
 struct STLInfo
 {
@@ -710,7 +777,7 @@ static void buildFileList(EntryNav *rootNav)
       {
         warn(
             root->fileName,root->startLine,
-            "warning: file %s already documented. "
+            "file %s already documented. "
             "Skipping documentation.",
             root->name.data()
             );
@@ -744,7 +811,7 @@ static void buildFileList(EntryNav *rootNav)
     {
       const char *fn = root->fileName.data();
       QCString text(4096);
-      text.sprintf("warning: the name `%s' supplied as "
+      text.sprintf("the name `%s' supplied as "
           "the second argument in the \\file statement ",
           qPrint(root->name));
       if (ambig) // name is ambiguous
@@ -799,7 +866,7 @@ static void addIncludeFile(ClassDef *cd,FileDef *ifd,Entry *root)
        )
     { // explicit request
       QCString text;
-      text.sprintf("warning: the name `%s' supplied as "
+      text.sprintf("the name `%s' supplied as "
                   "the argument of the \\class, \\struct, \\union, or \\include command ",
                   qPrint(includeFile)
                  );
@@ -950,7 +1017,7 @@ static Definition *buildScopeFromQualifiedName(const QCString name,int level,Src
       // introduce bogus namespace
       //printf("++ adding dummy namespace %s to %s\n",nsName.data(),prevScope->name().data());
       nd=new NamespaceDef(
-        "[generated]",1,fullScope);
+        "[generated]",1,1,fullScope);
       nd->setLanguage(lang);
 
       // add namespace to the list
@@ -1088,7 +1155,8 @@ ArgumentList *getTemplateArgumentsFromName(
   return ali.current();
 }
 
-static ClassDef::CompoundType convertToCompoundType(int section,int specifier)
+static
+ClassDef::CompoundType convertToCompoundType(int section,uint64 specifier)
 {
   ClassDef::CompoundType sec=ClassDef::Class; 
   if (specifier&Entry::Struct) 
@@ -1103,6 +1171,10 @@ static ClassDef::CompoundType convertToCompoundType(int section,int specifier)
     sec=ClassDef::Protocol;
   else if (specifier&Entry::Exception) 
     sec=ClassDef::Exception;
+  else if (specifier&Entry::Service)
+    sec=ClassDef::Service;
+  else if (specifier&Entry::Singleton)
+    sec=ClassDef::Singleton;
 
   switch(section)
   {
@@ -1130,6 +1202,12 @@ static ClassDef::CompoundType convertToCompoundType(int section,int specifier)
     case Entry::EXCEPTIONDOC_SEC:
       sec=ClassDef::Exception; 
       break;
+    case Entry::SERVICEDOC_SEC:
+      sec=ClassDef::Service;
+      break;
+    case Entry::SINGLETONDOC_SEC:
+      sec=ClassDef::Singleton;
+      break;
   }
   return sec;
 }
@@ -1217,13 +1295,14 @@ static void addClassToContext(EntryNav *rootNav)
       tagName     = rootNav->tagInfo()->tagName;
       refFileName = rootNav->tagInfo()->fileName;
     }
-    cd=new ClassDef(root->fileName,root->startLine,fullName,sec,
-        tagName,refFileName,TRUE,root->spec&Entry::Enum);
+    cd=new ClassDef(root->fileName,root->startLine,root->startColumn,
+        fullName,sec,tagName,refFileName,TRUE,root->spec&Entry::Enum);
     Debug::print(Debug::Classes,0,"  New class `%s' (sec=0x%08x)! #tArgLists=%d\n",
         fullName.data(),sec,root->tArgLists ? (int)root->tArgLists->count() : -1);
     cd->setDocumentation(root->doc,root->docFile,root->docLine); // copy docs to definition
     cd->setBriefDescription(root->brief,root->briefFile,root->briefLine);
     cd->setLanguage(root->lang);    
+    cd->setId(root->id);
     cd->setHidden(root->hidden);        
     cd->setArtificial(root->artificial);        
     cd->setClassSpecifier(root->spec);
@@ -1246,7 +1325,6 @@ static void addClassToContext(EntryNav *rootNav)
     //bool found=addNamespace(root,cd);         
 
     // the empty string test is needed for extract all case     
-    cd->setBriefDescription(root->brief,root->briefFile,root->briefLine);    
     cd->insertUsedFile(root->fileName);
 
     // add class to the list
@@ -1363,7 +1441,7 @@ static void resolveClassNestingRelations()
         d->addInnerCompound(cd);
         cd->setOuterScope(d);
         warn(cd->getDefFileName(),cd->getDefLine(),
-            "warning: Internal inconsistency: scope for class %s not "
+            "Internal inconsistency: scope for class %s not "
             "found!",name.data()
             );
       }
@@ -1415,6 +1493,7 @@ static ClassDef *createTagLessInstance(ClassDef *rootCd,ClassDef *templ,const QC
   fullName+="."+fieldName;
   ClassDef *cd = new ClassDef(templ->getDefFileName(),
                               templ->getDefLine(),
+                              templ->getDefColumn(),
                               fullName,
                               templ->compoundType());
   cd->setDocumentation(templ->documentation(),templ->docFile(),templ->docLine()); // copy docs to definition
@@ -1435,7 +1514,7 @@ static ClassDef *createTagLessInstance(ClassDef *rootCd,ClassDef *templ,const QC
     cd->setFileDef(fd);
     fd->insertClass(cd);
   }
-  LockingPtr<GroupList> groups = rootCd->partOfGroups();
+  GroupList *groups = rootCd->partOfGroups();
   if ( groups!=0 )
   {
     GroupListIterator gli(*groups);
@@ -1458,7 +1537,7 @@ static ClassDef *createTagLessInstance(ClassDef *rootCd,ClassDef *templ,const QC
     for (li.toFirst();(md=li.current());++li)
     {
       //printf("    Member %s type=%s\n",md->name().data(),md->typeString());
-      MemberDef *imd = new MemberDef(md->getDefFileName(),md->getDefLine(),
+      MemberDef *imd = new MemberDef(md->getDefFileName(),md->getDefLine(),md->getDefColumn(),
                                      md->typeString(),md->name(),md->argsString(),md->excpString(),
                                      md->protection(),md->virtualness(),md->isStatic(),Member,
                                      md->memberType(),
@@ -1665,13 +1744,14 @@ static void buildNamespaceList(EntryNav *rootNav)
           tagFileName=rootNav->tagInfo()->fileName;
         }
         //printf("++ new namespace %s lang=%s\n",fullName.data(),langToString(root->lang).data());
-        NamespaceDef *nd=new NamespaceDef(root->fileName,root->startLine,fullName,tagName,tagFileName);
+        NamespaceDef *nd=new NamespaceDef(root->fileName,root->startLine,root->startColumn,fullName,tagName,tagFileName,root->type,root->spec&Entry::Published);
         nd->setDocumentation(root->doc,root->docFile,root->docLine); // copy docs to definition
         nd->setBriefDescription(root->brief,root->briefFile,root->briefLine);
         nd->addSectionsToDefinition(root->anchors);
         nd->setHidden(root->hidden);
         nd->setArtificial(root->artificial);
         nd->setLanguage(root->lang);
+        nd->setId(root->id);
 
         //printf("Adding namespace to group\n");
         addNamespaceToGroups(root,nd);
@@ -1834,7 +1914,7 @@ static void findUsingDirectives(EntryNav *rootNav)
       else // unknown namespace, but add it anyway.
       {
         //printf("++ new unknown namespace %s lang=%s\n",name.data(),langToString(root->lang).data());
-        NamespaceDef *nd=new NamespaceDef(root->fileName,root->startLine,name);
+        NamespaceDef *nd=new NamespaceDef(root->fileName,root->startLine,root->startColumn,name);
         nd->setDocumentation(root->doc,root->docFile,root->docLine); // copy docs to definition
         nd->setBriefDescription(root->brief,root->briefFile,root->briefLine);
         nd->addSectionsToDefinition(root->anchors);
@@ -1842,6 +1922,7 @@ static void findUsingDirectives(EntryNav *rootNav)
         nd->setHidden(root->hidden);
         nd->setArtificial(TRUE);
         nd->setLanguage(root->lang);
+        nd->setId(root->id);
 
         QListIterator<Grouping> gli(*root->groups);
         Grouping *g;
@@ -1950,8 +2031,9 @@ static void findUsingDeclarations(EntryNav *rootNav)
         Debug::print(Debug::Classes,0,"  New using class `%s' (sec=0x%08x)! #tArgLists=%d\n",
              name.data(),root->section,root->tArgLists ? (int)root->tArgLists->count() : -1);
         usingCd = new ClassDef(
-                     "<using>",1,
-                     name,ClassDef::Class);
+                     "<using>",1,1,
+                     name,
+                     ClassDef::Class);
         Doxygen::hiddenClasses->append(root->name,usingCd);
         usingCd->setArtificial(TRUE);
         usingCd->setLanguage(root->lang);
@@ -2029,14 +2111,14 @@ static void findUsingDeclImports(EntryNav *rootNav)
                   //printf("found member %s\n",mni->memberName());
                   MemberDef *newMd = 0;
                   {
-                    LockingPtr<ArgumentList> templAl = md->templateArguments();
-                    LockingPtr<ArgumentList> al = md->templateArguments();
+                    ArgumentList *templAl = md->templateArguments();
+                    ArgumentList *al = md->templateArguments();
                     newMd = new MemberDef(
-                      root->fileName,root->startLine,
+                      root->fileName,root->startLine,root->startColumn,
                       md->typeString(),memName,md->argsString(),
                       md->excpString(),root->protection,root->virt,
                       md->isStatic(),Member,md->memberType(),
-                      templAl.pointer(),al.pointer()
+                      templAl,al
                       );
                   }
                   newMd->setMemberClass(cd);
@@ -2065,6 +2147,7 @@ static void findUsingDeclImports(EntryNav *rootNav)
                   newMd->setMemberGroupId(root->mGrpId);
                   newMd->setMemberSpecifiers(md->getMemberSpecifiers());
                   newMd->setLanguage(root->lang);
+                  newMd->setId(root->id);
 
                   rootNav->releaseEntry();
                 }
@@ -2219,8 +2302,8 @@ static MemberDef *addVariableToClass(
 
   // new member variable, typedef or enum value
   MemberDef *md=new MemberDef(
-      root->fileName,root->startLine,
-      root->type,name,root->args,0,
+      root->fileName,root->startLine,root->startColumn,
+      root->type,name,root->args,root->exception,
       prot,Normal,root->stat,related,
       mtype,root->tArgLists ? root->tArgLists->last() : 0,0);
   md->setTagInfo(rootNav->tagInfo());
@@ -2248,6 +2331,7 @@ static MemberDef *addVariableToClass(
   md->setHidden(root->hidden);
   md->setArtificial(root->artificial);
   md->setLanguage(root->lang);
+  md->setId(root->id);
   addMemberToGroups(root,md);
   //if (root->mGrpId!=-1) 
   //{
@@ -2455,7 +2539,7 @@ static MemberDef *addVariableToFile(
     "    new variable, nd=%s!\n",nd?nd->name().data():"<global>");
   // new global variable, enum value or typedef
   MemberDef *md=new MemberDef(
-      root->fileName,root->startLine,
+      root->fileName,root->startLine,root->startColumn,
       root->type,name,root->args,0,
       Public, Normal,root->stat,Member,
       mtype,root->tArgLists ? root->tArgLists->last() : 0,0);
@@ -2472,6 +2556,7 @@ static MemberDef *addVariableToFile(
   md->setMemberGroupId(root->mGrpId);
   md->setDefinition(def);
   md->setLanguage(root->lang);
+  md->setId(root->id);
   md->enableCallGraph(root->callGraph);
   md->enableCallerGraph(root->callerGraph);
   md->setExplicitExternal(root->explicitExternal);
@@ -2945,6 +3030,149 @@ static void buildVarList(EntryNav *rootNav)
 }
 
 //----------------------------------------------------------------------
+// Searches the Entry tree for Interface sections (UNO IDL only).
+// If found they are stored in their service or in the global list.
+//
+
+static void addInterfaceOrServiceToServiceOrSingleton(
+        EntryNav *const rootNav,
+        ClassDef *const cd,
+        QCString const& rname)
+{
+  Entry *const root = rootNav->entry();
+  FileDef *const fd = rootNav->fileDef();
+  enum MemberType const type = (rootNav->section()==Entry::EXPORTED_INTERFACE_SEC)
+      ? MemberType_Interface
+      : MemberType_Service;
+  MemberDef *const md = new MemberDef(
+      root->fileName, root->startLine, root->startColumn, root->type, rname,
+      "", "", root->protection, root->virt, root->stat, Member,
+      type, 0, root->argList);
+  md->setTagInfo(rootNav->tagInfo());
+  md->setMemberClass(cd);
+  md->setDocumentation(root->doc,root->docFile,root->docLine);
+  md->setDocsForDefinition(false);
+  md->setBriefDescription(root->brief,root->briefFile,root->briefLine);
+  md->setInbodyDocumentation(root->inbodyDocs,root->inbodyFile,root->inbodyLine);
+  md->setBodySegment(root->bodyLine,root->endBodyLine);
+  md->setMemberSpecifiers(root->spec);
+  md->setMemberGroupId(root->mGrpId);
+  md->setTypeConstraints(root->typeConstr);
+  md->setLanguage(root->lang);
+  md->setBodyDef(fd);
+  md->setFileDef(fd);
+  md->addSectionsToDefinition(root->anchors);
+  QCString const def = root->type + " " + rname;
+  md->setDefinition(def);
+  md->enableCallGraph(root->callGraph);
+  md->enableCallerGraph(root->callerGraph);
+
+  Debug::print(Debug::Functions,0,
+      "  Interface Member:\n"
+      "    `%s' `%s' proto=%d\n"
+      "    def=`%s'\n",
+      root->type.data(),
+      rname.data(),
+      root->proto,
+      def.data()
+              );
+
+  // add member to the global list of all members
+  MemberName *mn;
+  if ((mn=Doxygen::memberNameSDict->find(rname)))
+  {
+    mn->append(md);
+  }
+  else
+  {
+    mn = new MemberName(rname);
+    mn->append(md);
+    Doxygen::memberNameSDict->append(rname,mn);
+  }
+
+  // add member to the class cd
+  cd->insertMember(md);
+  // also add the member as a "base" (to get nicer diagrams)
+  // "optional" interface/service get Protected which turns into dashed line
+  BaseInfo base(rname,
+          (root->spec & (Entry::Optional)) ? Protected : Public,Normal);
+  findClassRelation(rootNav,cd,cd,&base,0,DocumentedOnly,true)
+  || findClassRelation(rootNav,cd,cd,&base,0,Undocumented,true);
+  // add file to list of used files
+  cd->insertUsedFile(root->fileName);
+
+  addMemberToGroups(root,md);
+  rootNav->changeSection(Entry::EMPTY_SEC);
+  md->setRefItems(root->sli);
+}
+
+static void buildInterfaceAndServiceList(EntryNav *const rootNav)
+{
+  if (rootNav->section()==Entry::EXPORTED_INTERFACE_SEC ||
+      rootNav->section()==Entry::INCLUDED_SERVICE_SEC)
+  {
+    rootNav->loadEntry(g_storage);
+    Entry *const root = rootNav->entry();
+
+    Debug::print(Debug::Functions,0,
+                 "EXPORTED_INTERFACE_SEC:\n"
+                 "  `%s' `%s'::`%s' `%s' relates=`%s' relatesType=`%d' file=`%s' line=`%d' bodyLine=`%d' #tArgLists=%d mGrpId=%d spec=%lld proto=%d docFile=%s\n",
+                 root->type.data(),
+                 rootNav->parent()->name().data(),
+                 root->name.data(),
+                 root->args.data(),
+                 root->relates.data(),
+                 root->relatesType,
+                 root->fileName.data(),
+                 root->startLine,
+                 root->bodyLine,
+                 root->tArgLists ? (int)root->tArgLists->count() : -1,
+                 root->mGrpId,
+                 root->spec,
+                 root->proto,
+                 root->docFile.data()
+                );
+
+    QCString const rname = removeRedundantWhiteSpace(root->name);
+
+    if (!rname.isEmpty())
+    {
+      QCString const scope = rootNav->parent()->name();
+      ClassDef *const cd = getClass(scope);
+      assert(cd);
+      if (cd && ((ClassDef::Interface == cd->compoundType()) ||
+                 (ClassDef::Service   == cd->compoundType()) ||
+                 (ClassDef::Singleton == cd->compoundType())))
+      {
+        addInterfaceOrServiceToServiceOrSingleton(rootNav,cd,rname);
+      }
+      else
+      {
+        assert(false); // was checked by scanner.l
+      }
+    }
+    else if (rname.isEmpty())
+    {
+      warn(root->fileName,root->startLine,
+           "Illegal member name found.");
+    }
+
+    rootNav->releaseEntry();
+  }
+  // can only have these in IDL anyway
+  switch (rootNav->lang())
+  {
+    case SrcLangExt_Unknown: // fall through (root node always is Unknown)
+    case SrcLangExt_IDL:
+        RECURSE_ENTRYTREE(buildInterfaceAndServiceList,rootNav);
+        break;
+    default:
+        return; // nothing to do here
+  }
+}
+
+
+//----------------------------------------------------------------------
 // Searches the Entry tree for Function sections.
 // If found they are stored in their class or in the global list.
 
@@ -2994,7 +3222,7 @@ static void addMethodToClass(EntryNav *rootNav,ClassDef *cd,
 
   // adding class member
   MemberDef *md=new MemberDef(
-      root->fileName,root->startLine,
+      root->fileName,root->startLine,root->startColumn,
       root->type,name,root->args,root->exception,
       root->protection,root->virt,
       root->stat && root->relatesType != MemberOf,
@@ -3012,6 +3240,7 @@ static void addMethodToClass(EntryNav *rootNav,ClassDef *cd,
   md->setMemberGroupId(root->mGrpId);
   md->setTypeConstraints(root->typeConstr);
   md->setLanguage(root->lang);
+  md->setId(root->id);
   md->setBodyDef(fd);
   md->setFileDef(fd);
   //md->setScopeTemplateArguments(root->tArgList);
@@ -3130,7 +3359,7 @@ static void buildFunctionList(EntryNav *rootNav)
 
     Debug::print(Debug::Functions,0,
                  "FUNCTION_SEC:\n"
-                 "  `%s' `%s'::`%s' `%s' relates=`%s' relatesType=`%d' file=`%s' line=`%d' bodyLine=`%d' #tArgLists=%d mGrpId=%d spec=%d proto=%d docFile=%s\n",
+                 "  `%s' `%s'::`%s' `%s' relates=`%s' relatesType=`%d' file=`%s' line=`%d' bodyLine=`%d' #tArgLists=%d mGrpId=%d spec=%lld proto=%d docFile=%s\n",
                  root->type.data(),
                  rootNav->parent()->name().data(),
                  root->name.data(),
@@ -3257,28 +3486,34 @@ static void buildFunctionList(EntryNav *rootNav)
             if (rnd) rnsName = rnd->name().copy();
             //printf("matching arguments for %s%s %s%s\n",
             //    md->name().data(),md->argsString(),rname.data(),argListToString(root->argList).data());
-            LockingPtr<ArgumentList> mdAl = md->argumentList();
-            LockingPtr<ArgumentList> mdTempl = md->templateArguments();
+            ArgumentList *mdAl = md->argumentList();
+            ArgumentList *mdTempl = md->templateArguments();
 
             // in case of template functions, we need to check if the
             // functions have the same number of template parameters
             bool sameNumTemplateArgs = TRUE;
+            bool matchingReturnTypes = TRUE;
             if (mdTempl!=0 && root->tArgLists)
             {
               if (mdTempl->count()!=root->tArgLists->getLast()->count())
               {
                 sameNumTemplateArgs = FALSE;
               }
+              if (md->typeString()!=removeRedundantWhiteSpace(root->type))
+              {
+                matchingReturnTypes = FALSE;
+              }
             }
 
             bool staticsInDifferentFiles = 
                     root->stat && md->isStatic() && root->fileName!=md->getDefFileName();
 
             if (
-                matchArguments2(md->getOuterScope(),mfd,mdAl.pointer(),
+                matchArguments2(md->getOuterScope(),mfd,mdAl,
                                 rnd ? rnd : Doxygen::globalScope,rfd,root->argList,
                                 FALSE) &&
                 sameNumTemplateArgs && 
+                matchingReturnTypes &&
                 !staticsInDifferentFiles
                )
             {
@@ -3308,7 +3543,7 @@ static void buildFunctionList(EntryNav *rootNav)
               if (found)
               {
                 // merge argument lists
-                mergeArguments(mdAl.pointer(),root->argList,!root->doc.isEmpty());
+                mergeArguments(mdAl,root->argList,!root->doc.isEmpty());
                 // merge documentation
                 if (md->documentation().isEmpty() && !root->doc.isEmpty())
                 {
@@ -3380,13 +3615,14 @@ static void buildFunctionList(EntryNav *rootNav)
           ArgumentList *tArgList = root->tArgLists ? root->tArgLists->last() : 0;
           QCString name=removeRedundantWhiteSpace(rname);
           md=new MemberDef(
-              root->fileName,root->startLine,
+              root->fileName,root->startLine,root->startColumn,
               root->type,name,root->args,root->exception,
               root->protection,root->virt,root->stat,Member,
               MemberType_Function,tArgList,root->argList);
 
           md->setTagInfo(rootNav->tagInfo());
           md->setLanguage(root->lang);
+          md->setId(root->id);
           //md->setDefFile(root->fileName);
           //md->setDefLine(root->startLine);
           md->setDocumentation(root->doc,root->docFile,root->docLine);
@@ -3526,7 +3762,7 @@ static void buildFunctionList(EntryNav *rootNav)
     else if (rname.isEmpty())
     {
         warn(root->fileName,root->startLine,
-             "warning: Illegal member name found."
+             "Illegal member name found."
             );
     }
 
@@ -3560,18 +3796,18 @@ static void findFriends()
           //printf("Checking for matching arguments 
           //        mmd->isRelated()=%d mmd->isFriend()=%d mmd->isFunction()=%d\n",
           //    mmd->isRelated(),mmd->isFriend(),mmd->isFunction());
-          LockingPtr<ArgumentList> mmdAl = mmd->argumentList();
-          LockingPtr<ArgumentList> fmdAl = fmd->argumentList();
+          ArgumentList *mmdAl = mmd->argumentList();
+          ArgumentList *fmdAl = fmd->argumentList();
           if ((mmd->isFriend() || (mmd->isRelated() && mmd->isFunction())) &&
-              matchArguments2(mmd->getOuterScope(), mmd->getFileDef(), mmdAl.pointer(),
-                              fmd->getOuterScope(), fmd->getFileDef(), fmdAl.pointer(),
+              matchArguments2(mmd->getOuterScope(), mmd->getFileDef(), mmdAl,
+                              fmd->getOuterScope(), fmd->getFileDef(), fmdAl,
                               TRUE
                              )
                              
              ) // if the member is related and the arguments match then the 
                // function is actually a friend.
           {
-            mergeArguments(mmdAl.pointer(),fmdAl.pointer());
+            mergeArguments(mmdAl,fmdAl);
             if (!fmd->documentation().isEmpty())
             {
               mmd->setDocumentation(fmd->documentation(),fmd->docFile(),fmd->docLine());
@@ -3678,20 +3914,20 @@ static void transferFunctionReferences()
     }
     if (mdef && mdec)
     {
-      LockingPtr<ArgumentList> mdefAl = mdef->argumentList();
-      LockingPtr<ArgumentList> mdecAl = mdec->argumentList();
+      ArgumentList *mdefAl = mdef->argumentList();
+      ArgumentList *mdecAl = mdec->argumentList();
       if (
-          matchArguments2(mdef->getOuterScope(),mdef->getFileDef(),mdefAl.pointer(),
-                          mdec->getOuterScope(),mdec->getFileDef(),mdecAl.pointer(),
+          matchArguments2(mdef->getOuterScope(),mdef->getFileDef(),mdefAl,
+                          mdec->getOuterScope(),mdec->getFileDef(),mdecAl,
                           TRUE
             )
          ) /* match found */
       {
-        LockingPtr<MemberSDict> defDict = mdef->getReferencesMembers();
-        LockingPtr<MemberSDict> decDict = mdec->getReferencesMembers();
+        MemberSDict *defDict = mdef->getReferencesMembers();
+        MemberSDict *decDict = mdec->getReferencesMembers();
         if (defDict!=0)
         {
-          MemberSDict::Iterator msdi(*defDict);
+          MemberSDict::IteratorDict msdi(*defDict);
           MemberDef *rmd;
           for (msdi.toFirst();(rmd=msdi.current());++msdi)
           {
@@ -3703,7 +3939,7 @@ static void transferFunctionReferences()
         }
         if (decDict!=0)
         {
-          MemberSDict::Iterator msdi(*decDict);
+          MemberSDict::IteratorDict msdi(*decDict);
           MemberDef *rmd;
           for (msdi.toFirst();(rmd=msdi.current());++msdi)
           {
@@ -3718,7 +3954,7 @@ static void transferFunctionReferences()
         decDict = mdec->getReferencedByMembers();
         if (defDict!=0)
         {
-          MemberSDict::Iterator msdi(*defDict);
+          MemberSDict::IteratorDict msdi(*defDict);
           MemberDef *rmd;
           for (msdi.toFirst();(rmd=msdi.current());++msdi)
           {
@@ -3730,7 +3966,7 @@ static void transferFunctionReferences()
         }
         if (decDict!=0)
         {
-          MemberSDict::Iterator msdi(*decDict);
+          MemberSDict::IteratorDict msdi(*decDict);
           MemberDef *rmd;
           for (msdi.toFirst();(rmd=msdi.current());++msdi)
           {
@@ -3769,12 +4005,12 @@ static void transferRelatedFunctionDocumentation()
         MemberNameIterator rmni(*rmn);
         for (rmni.toFirst();(rmd=rmni.current());++rmni) // for each member with the same name
         {
-          LockingPtr<ArgumentList>  mdAl = md->argumentList();
-          LockingPtr<ArgumentList> rmdAl = rmd->argumentList();
+          ArgumentList *mdAl = md->argumentList();
+          ArgumentList *rmdAl = rmd->argumentList();
           //printf("  Member found: related=`%d'\n",rmd->isRelated());
           if ((rmd->isRelated() || rmd->isForeign()) && // related function
-              matchArguments2( md->getOuterScope(), md->getFileDef(), mdAl.pointer(),
-                              rmd->getOuterScope(),rmd->getFileDef(),rmdAl.pointer(),
+              matchArguments2( md->getOuterScope(), md->getFileDef(), mdAl,
+                              rmd->getOuterScope(),rmd->getFileDef(),rmdAl,
                               TRUE
                              )
              )
@@ -3863,24 +4099,6 @@ static ClassDef *findClassWithinClassContext(Definition *context,ClassDef *cd,co
   return result;
 }
 
-enum FindBaseClassRelation_Mode 
-{ 
-  TemplateInstances, 
-  DocumentedOnly, 
-  Undocumented 
-};
-
-static bool findClassRelation(
-                           EntryNav *rootNav,
-                           Definition *context,
-                           ClassDef *cd,
-                           BaseInfo *bi,
-                           QDict<int> *templateNames,
-                           /*bool insertUndocumented*/
-                           FindBaseClassRelation_Mode mode,
-                           bool isArtificial
-                          );
-
 
 static void findUsedClassesForClass(EntryNav *rootNav,
                            Definition *context,
@@ -3978,7 +4196,9 @@ static void findUsedClassesForClass(EntryNav *rootNav,
                   {
                     usedCd = new ClassDef(
                         masterCd->getDefFileName(),masterCd->getDefLine(),
-                        usedName,ClassDef::Class);
+                        masterCd->getDefColumn(),
+                        usedName,
+                        ClassDef::Class);
                     //printf("making %s a template argument!!!\n",usedCd->name().data());
                     usedCd->makeTemplateArgument();
                     usedCd->setUsedOnly(TRUE);
@@ -4028,6 +4248,7 @@ static void findUsedClassesForClass(EntryNav *rootNav,
               Debug::print(Debug::Classes,0,"  New undocumented used class `%s'\n", type.data());
               usedCd = new ClassDef(
                   masterCd->getDefFileName(),masterCd->getDefLine(),
+                  masterCd->getDefColumn(),
                   type,ClassDef::Class);
               usedCd->setUsedOnly(TRUE);
               usedCd->setLanguage(masterCd->getLanguage());
@@ -4143,7 +4364,7 @@ static bool findTemplateInstanceRelation(Entry *root,
 
   bool freshInstance=FALSE;
   ClassDef *instanceClass = templateClass->insertTemplateInstance(
-                     root->fileName,root->startLine,templSpec,freshInstance);
+                     root->fileName,root->startLine,root->startColumn,templSpec,freshInstance);
   if (isArtificial) instanceClass->setArtificial(TRUE);
   instanceClass->setLanguage(root->lang);
 
@@ -4369,7 +4590,13 @@ static bool findClassRelation(
       //   ) // Check for base class with the same name.
       //     // If found then look in the outer scope for a match
       //     // and prevent recursion.
-      if (!isRecursiveBaseClass(rootNav->name(),baseClassName) || explicitGlobalScope)
+      if (!isRecursiveBaseClass(rootNav->name(),baseClassName)
+          || explicitGlobalScope
+          // sadly isRecursiveBaseClass always true for UNO IDL ifc/svc members
+          // (i.e. this is needed for addInterfaceOrServiceToServiceOrSingleton)
+          || (rootNav->lang()==SrcLangExt_IDL &&
+              (rootNav->section()==Entry::EXPORTED_INTERFACE_SEC ||
+               rootNav->section()==Entry::INCLUDED_SERVICE_SEC)))
       {
         Debug::print(
             Debug::Classes,0,"    class relation %s inherited/used by %s found (%s and %s) templSpec='%s'\n",
@@ -4517,10 +4744,22 @@ static bool findClassRelation(
               usedName=biName;
               //printf("***** usedName=%s templSpec=%s\n",usedName.data(),templSpec.data());
             }
-            if (Config_getBool("SIP_SUPPORT")) bi->prot=Public;
-            cd->insertBaseClass(baseClass,usedName,bi->prot,bi->virt,templSpec);
-            // add this class as super class to the base class
-            baseClass->insertSubClass(cd,bi->prot,bi->virt,templSpec);
+            static bool sipSupport = Config_getBool("SIP_SUPPORT");
+            if (sipSupport) bi->prot=Public;
+            if (!cd->isSubClass(baseClass)) // check for recursion, see bug690787
+            {
+              cd->insertBaseClass(baseClass,usedName,bi->prot,bi->virt,templSpec);
+              // add this class as super class to the base class
+              baseClass->insertSubClass(cd,bi->prot,bi->virt,templSpec);
+            }
+            else
+            {
+              warn(root->fileName,root->startLine,
+                  "Detected potential recursive class relation "
+                  "between class %s and base class %s!",
+                  cd->name().data(),baseClass->name().data()
+                  );
+            }
           }
           return TRUE;
         }
@@ -4536,8 +4775,9 @@ static bool findClassRelation(
             baseClass=Doxygen::hiddenClasses->find(baseClassName);
             if (baseClass==0)
             {
-              baseClass=new ClassDef(root->fileName,root->startLine,
-                                 baseClassName,ClassDef::Class);
+              baseClass=new ClassDef(root->fileName,root->startLine,root->startColumn,
+                                 baseClassName,
+                                 ClassDef::Class);
               Doxygen::hiddenClasses->append(baseClassName,baseClass);
               if (isArtificial) baseClass->setArtificial(TRUE);
               baseClass->setLanguage(root->lang);
@@ -4550,8 +4790,9 @@ static bool findClassRelation(
             //    baseClassName.data(),baseClass,biName.data(),templSpec.data());
             if (baseClass==0)
             {
-              baseClass=new ClassDef(root->fileName,root->startLine,
-                  baseClassName,ClassDef::Class);
+              baseClass=new ClassDef(root->fileName,root->startLine,root->startColumn,
+                  baseClassName,
+                  ClassDef::Class);
               Doxygen::classSDict->append(baseClassName,baseClass);
               if (isArtificial) baseClass->setArtificial(TRUE);
               baseClass->setLanguage(root->lang);
@@ -4746,7 +4987,7 @@ static void computeClassRelations()
          )
         warn_undoc(
                    root->fileName,root->startLine,
-                   "warning: Compound %s is not documented.",
+                   "Compound %s is not documented.",
                    root->name.data()
              );
     }
@@ -4935,8 +5176,8 @@ static void addListReferences()
       name = pd->getGroupDef()->getOutputFileBase();
     }
     {
-      LockingPtr< QList<ListItemInfo> > xrefItems = pd->xrefListItems();
-      addRefItem(xrefItems.pointer(),
+      QList<ListItemInfo> *xrefItems = pd->xrefListItems();
+      addRefItem(xrefItems,
           name,
           theTranslator->trPage(TRUE,TRUE),
           name,pd->title(),0);
@@ -4951,8 +5192,8 @@ static void addListReferences()
     //{
     //  name = dd->getGroupDef()->getOutputFileBase();
     //}
-    LockingPtr< QList<ListItemInfo> > xrefItems = dd->xrefListItems();
-    addRefItem(xrefItems.pointer(),
+    QList<ListItemInfo> *xrefItems = dd->xrefListItems();
+    addRefItem(xrefItems,
         name,
         theTranslator->trDir(TRUE,TRUE),
         name,dd->displayName(),0);
@@ -5007,23 +5248,23 @@ static void addMemberDocs(EntryNav *rootNav,
   // TODO determine scope based on root not md
   Definition *rscope = md->getOuterScope();
 
-  LockingPtr<ArgumentList> mdAl = md->argumentList();
+  ArgumentList *mdAl = md->argumentList();
   if (al)
   {
     //printf("merging arguments (1) docs=%d\n",root->doc.isEmpty());
-    mergeArguments(mdAl.pointer(),al,!root->doc.isEmpty());
+    mergeArguments(mdAl,al,!root->doc.isEmpty());
   }
   else
   {
     if ( 
-          matchArguments2( md->getOuterScope(), md->getFileDef(), mdAl.pointer(),
+          matchArguments2( md->getOuterScope(), md->getFileDef(), mdAl,
                            rscope,rfd,root->argList,
                            TRUE
                          )
        ) 
     {
       //printf("merging arguments (2)\n");
-      mergeArguments(mdAl.pointer(),root->argList,!root->doc.isEmpty());
+      mergeArguments(mdAl,root->argList,!root->doc.isEmpty());
     }
   }
   if (over_load)  // the \overload keyword was used
@@ -5098,7 +5339,7 @@ static void addMemberDocs(EntryNav *rootNav,
       {
         warn(
              root->fileName,root->startLine,
-             "warning: member %s belongs to two different groups. The second "
+             "member %s belongs to two different groups. The second "
              "one found here will be ignored.",
              md->name().data()
             );
@@ -5131,6 +5372,7 @@ static ClassDef *findClassDefinition(FileDef *fd,NamespaceDef *nd,
 
 static bool findGlobalMember(EntryNav *rootNav, 
                            const QCString &namespaceName,
+                           const char *type,
                            const char *name, 
                            const char *tempArg,
                            const char *, 
@@ -5138,8 +5380,8 @@ static bool findGlobalMember(EntryNav *rootNav,
 {
   Entry *root = rootNav->entry();
   Debug::print(Debug::FindMembers,0,
-       "2. findGlobalMember(namespace=%s,name=%s,tempArg=%s,decl=%s)\n",
-          namespaceName.data(),name,tempArg,decl);
+       "2. findGlobalMember(namespace=%s,type=%s,name=%s,tempArg=%s,decl=%s)\n",
+          namespaceName.data(),type,name,tempArg,decl);
   QCString n=name;
   if (n.isEmpty()) return FALSE;
   if (n.find("::")!=-1) return FALSE; // skip undefined class members
@@ -5150,7 +5392,7 @@ static bool findGlobalMember(EntryNav *rootNav,
   }
   if (mn) // function name defined
   {
-    Debug::print(Debug::FindMembers,0,"3. Found function scope\n");
+    Debug::print(Debug::FindMembers,0,"3. Found symbol scope\n");
     //int count=0;
     MemberNameIterator mni(*mn);
     MemberDef *md;
@@ -5184,11 +5426,11 @@ static bool findGlobalMember(EntryNav *rootNav,
         NamespaceDef *rnd = 0;
         if (!namespaceName.isEmpty()) rnd = Doxygen::namespaceSDict->find(namespaceName);
 
-        LockingPtr<ArgumentList> mdAl = md->argumentList();
+        ArgumentList *mdAl = md->argumentList();
         bool matching=
           (mdAl==0 && root->argList->count()==0) ||
           md->isVariable() || md->isTypedef() || /* in case of function pointers */
-          matchArguments2(md->getOuterScope(),md->getFileDef(),mdAl.pointer(),
+          matchArguments2(md->getOuterScope(),md->getFileDef(),mdAl,
                           rnd ? rnd : Doxygen::globalScope,fd,root->argList,
                           FALSE);
 
@@ -5197,8 +5439,8 @@ static bool findGlobalMember(EntryNav *rootNav,
         // different functions.
         if (matching && root->tArgLists)
         {
-          LockingPtr<ArgumentList> mdTempl = md->templateArguments();
-          if (mdTempl!=0)
+          ArgumentList *mdTempl = md->templateArguments();
+          if (mdTempl)
           {
             if (root->tArgLists->getLast()->count()!=mdTempl->count())
             {
@@ -5222,6 +5464,19 @@ static bool findGlobalMember(EntryNav *rootNav,
           matching = FALSE;
         }
 
+        // for template member we also need to check the return type
+        if (md->templateArguments()!=0 && root->tArgLists!=0)
+        {
+          //printf("Comparing return types '%s'<->'%s'\n",
+          //    md->typeString(),type);
+          if (md->templateArguments()->count()!=root->tArgLists->last()->count() ||
+              qstrcmp(md->typeString(),type)!=0)
+          {
+            //printf(" ---> no matching\n");
+            matching = FALSE;
+          }
+        }
+
         if (matching) // add docs to the member
         {
           Debug::print(Debug::FindMembers,0,"5. Match found\n");
@@ -5235,7 +5490,7 @@ static bool findGlobalMember(EntryNav *rootNav,
       QCString fullFuncDecl=decl;
       if (root->argList) fullFuncDecl+=argListToString(root->argList,TRUE);
       QCString warnMsg =
-         QCString("warning: no matching file member found for \n")+substitute(fullFuncDecl,"%","%%");
+         QCString("no matching file member found for \n")+substitute(fullFuncDecl,"%","%%");
       if (mn->count()>0)
       {
         warnMsg+="\nPossible candidates:\n";
@@ -5260,7 +5515,7 @@ static bool findGlobalMember(EntryNav *rootNav,
        )
     {
       warn(root->fileName,root->startLine,
-           "warning: documented function `%s' was not declared or defined.",decl
+           "documented symbol `%s' was not declared or defined.",decl
           );
     }
   }
@@ -5430,7 +5685,7 @@ static void findMember(EntryNav *rootNav,
   Debug::print(Debug::FindMembers,0,
                "findMember(root=%p,funcDecl=`%s',related=`%s',overload=%d,"
                "isFunc=%d mGrpId=%d tArgList=%p (#=%d) "
-               "spec=%d lang=%x\n",
+               "spec=%lld lang=%x\n",
                root,funcDecl.data(),root->relates.data(),overloaded,isFunc,root->mGrpId,
                root->tArgLists,root->tArgLists ? root->tArgLists->count() : 0,
                root->spec,root->lang
@@ -5789,10 +6044,10 @@ static void findMember(EntryNav *rootNav,
               // get the template parameter lists found at the member declaration
               QList<ArgumentList> declTemplArgs;
               cd->getTemplateParameterLists(declTemplArgs);
-              LockingPtr<ArgumentList> templAl = md->templateArguments();
-              if (templAl!=0)
+              ArgumentList *templAl = md->templateArguments();
+              if (templAl)
               {
-                declTemplArgs.append(templAl.pointer());
+                declTemplArgs.append(templAl);
               }
 
               // get the template parameter lists found at the member definition
@@ -5806,10 +6061,10 @@ static void findMember(EntryNav *rootNav,
               /* substitute the occurrences of class template names in the 
                * argument list before matching 
                */
-              LockingPtr<ArgumentList> mdAl = md->argumentList();
+              ArgumentList *mdAl = md->argumentList();
               if (declTemplArgs.count()>0 && defTemplArgs &&
                   declTemplArgs.count()==defTemplArgs->count() &&
-                  mdAl.pointer()
+                  mdAl
                  )
               {
                 /* the function definition has template arguments
@@ -5819,13 +6074,13 @@ static void findMember(EntryNav *rootNav,
                  */
                 argList = new ArgumentList;
                 substituteTemplatesInArgList(declTemplArgs,*defTemplArgs,
-                    mdAl.pointer(),argList);
+                    mdAl,argList);
 
                 substDone=TRUE;
               }
               else /* no template arguments, compare argument lists directly */
               {
-                argList = mdAl.pointer();
+                argList = mdAl;
               }
 
               Debug::print(Debug::FindMembers,0,
@@ -5836,7 +6091,7 @@ static void findMember(EntryNav *rootNav,
 
               bool matching=
                 md->isVariable() || md->isTypedef() || // needed for function pointers
-                (mdAl.pointer()==0 && root->argList->count()==0) || 
+                (mdAl==0 && root->argList->count()==0) || 
                 matchArguments2(
                     md->getClassDef(),md->getFileDef(),argList, 
                     cd,fd,root->argList,
@@ -5847,6 +6102,21 @@ static void findMember(EntryNav *rootNav,
                 matching = FALSE; // don't match methods and attributes with the same name
               }
 
+              // for template member we also need to check the return type
+              if (md->templateArguments()!=0 && root->tArgLists!=0)
+              {
+                //printf("Comparing return types '%s'<->'%s' args %d<->%d\n",
+                //    md->typeString(),funcType.data(),
+                //    md->templateArguments()->count(),root->tArgLists->last()->count());
+                if (md->templateArguments()->count()!=root->tArgLists->last()->count() ||
+                    qstrcmp(md->typeString(),funcType))
+                {
+                  //printf(" ---> no matching\n");
+                  matching = FALSE;
+                }
+              }
+
+
               Debug::print(Debug::FindMembers,0,
                   "6. match results of matchArguments2 = %d\n",matching);
 
@@ -5907,7 +6177,7 @@ static void findMember(EntryNav *rootNav,
                 //printf("ccd->name()==%s className=%s\n",ccd->name().data(),className.data());
                 if (ccd!=0 && rightScopeMatch(ccd->name(),className)) 
                 {
-                  LockingPtr<ArgumentList> templAl = md->templateArguments();
+                  ArgumentList *templAl = md->templateArguments();
                   if (root->tArgLists && templAl!=0 &&
                       root->tArgLists->getLast()->count()<=templAl->count())
                   { 
@@ -5954,7 +6224,7 @@ static void findMember(EntryNav *rootNav,
               }
             }
 
-            QCString warnMsg = "warning: no ";
+            QCString warnMsg = "no ";
             if (noMatchCount>1) warnMsg+="uniquely ";
             warnMsg+="matching class member found for \n";
 
@@ -5984,11 +6254,11 @@ static void findMember(EntryNav *rootNav,
                 ClassDef *cd=md->getClassDef();
                 if (cd!=0 && rightScopeMatch(cd->name(),className))
                 {
-                  LockingPtr<ArgumentList> templAl = md->templateArguments();
+                  ArgumentList *templAl = md->templateArguments();
                   if (templAl!=0)
                   {
                     warnMsg+="  'template ";
-                    warnMsg+=tempArgListToString(templAl.pointer());
+                    warnMsg+=tempArgListToString(templAl);
                     warnMsg+='\n';
                   }
                   warnMsg+="  ";
@@ -6033,7 +6303,7 @@ static void findMember(EntryNav *rootNav,
           ArgumentList *tArgList = new ArgumentList;
           //  getTemplateArgumentsFromName(cd->name()+"::"+funcName,root->tArgLists);
           md=new MemberDef(
-              root->fileName,root->startLine,
+              root->fileName,root->startLine,root->startColumn,
               funcType,funcName,funcArgs,exceptions,
               declMd ? declMd->protection() : root->protection,
               root->virt,root->stat,Member,
@@ -6041,6 +6311,7 @@ static void findMember(EntryNav *rootNav,
           //printf("new specialized member %s args=`%s'\n",md->name().data(),funcArgs.data());
           md->setTagInfo(rootNav->tagInfo());
           md->setLanguage(root->lang);
+          md->setId(root->id);
           md->setMemberClass(cd);
           md->setTemplateSpecialization(TRUE);
           md->setTypeConstraints(root->typeConstr);
@@ -6099,12 +6370,13 @@ static void findMember(EntryNav *rootNav,
             getTemplateArgumentsFromName(cd->name()+"::"+funcName,root->tArgLists);
           //printf("new related member %s args=`%s'\n",md->name().data(),funcArgs.data());
           MemberDef *md=new MemberDef(
-              root->fileName,root->startLine,
+              root->fileName,root->startLine,root->startColumn,
               funcType,funcName,funcArgs,exceptions,
               root->protection,root->virt,root->stat,Related,
               mtype,tArgList,root->argList);
           md->setTagInfo(rootNav->tagInfo());
           md->setLanguage(root->lang);
+          md->setId(root->id);
           md->setTypeConstraints(root->typeConstr);
           md->setMemberClass(cd);
           md->setDefinition(funcDecl);
@@ -6131,12 +6403,12 @@ static void findMember(EntryNav *rootNav,
       }
       else // unrelated function with the same name as a member
       {
-        if (!findGlobalMember(rootNav,namespaceName,funcName,funcTempList,funcArgs,funcDecl))
+        if (!findGlobalMember(rootNav,namespaceName,funcType,funcName,funcTempList,funcArgs,funcDecl))
         {
           QCString fullFuncDecl=funcDecl.copy();
           if (isFunc) fullFuncDecl+=argListToString(root->argList,TRUE);
           warn(root->fileName,root->startLine,
-               "warning: Cannot determine class for function\n%s",
+               "Cannot determine class for function\n%s",
                fullFuncDecl.data()
               );   
         }
@@ -6180,11 +6452,11 @@ static void findMember(EntryNav *rootNav,
           MemberDef *rmd=mn->first();
           while (rmd && newMember) // see if we got another member with matching arguments
           {
-            LockingPtr<ArgumentList> rmdAl = rmd->argumentList();
+            ArgumentList *rmdAl = rmd->argumentList();
 
             newMember=
               className!=rmd->getOuterScope()->name() ||
-              !matchArguments2(rmd->getOuterScope(),rmd->getFileDef(),rmdAl.pointer(),
+              !matchArguments2(rmd->getOuterScope(),rmd->getFileDef(),rmdAl,
                                cd,fd,root->argList,
                                TRUE);
             if (newMember) rmd=mn->next();
@@ -6229,7 +6501,7 @@ static void findMember(EntryNav *rootNav,
           // the related function, which don't have to do with
           // those of the related class.
           MemberDef *md=new MemberDef(
-              root->fileName,root->startLine,
+              root->fileName,root->startLine,root->startColumn,
               funcType,funcName,funcArgs,exceptions,
               root->protection,root->virt,
               root->stat && !isMemberOf,
@@ -6274,10 +6546,10 @@ static void findMember(EntryNav *rootNav,
               MemberDef *rmd=rmn->first();
               while (rmd && !found) // see if we got another member with matching arguments
               {
-                LockingPtr<ArgumentList> rmdAl = rmd->argumentList();
+                ArgumentList *rmdAl = rmd->argumentList();
                 // check for matching argument lists
                 if (
-                    matchArguments2(rmd->getOuterScope(),rmd->getFileDef(),rmdAl.pointer(),
+                    matchArguments2(rmd->getOuterScope(),rmd->getFileDef(),rmdAl,
                                     cd,fd,root->argList,
                                     TRUE)
                    )
@@ -6318,6 +6590,7 @@ static void findMember(EntryNav *rootNav,
           md->addSectionsToDefinition(root->anchors);
           md->setMemberGroupId(root->mGrpId);
           md->setLanguage(root->lang);
+          md->setId(root->id);
           //md->setMemberDefTemplateArguments(root->mtArgList);
           mn->append(md);
           cd->insertMember(md);
@@ -6338,12 +6611,12 @@ static void findMember(EntryNav *rootNav,
         }
         if (root->relatesType == Duplicate)
         {
-          if (!findGlobalMember(rootNav,namespaceName,funcName,funcTempList,funcArgs,funcDecl))
+          if (!findGlobalMember(rootNav,namespaceName,funcType,funcName,funcTempList,funcArgs,funcDecl))
           {
             QCString fullFuncDecl=funcDecl.copy();
             if (isFunc) fullFuncDecl+=argListToString(root->argList,TRUE);
             warn(root->fileName,root->startLine,
-               "warning: Cannot determine file/namespace for relatedalso function\n%s",
+               "Cannot determine file/namespace for relatedalso function\n%s",
                fullFuncDecl.data()
               );   
           }
@@ -6352,7 +6625,7 @@ static void findMember(EntryNav *rootNav,
       else
       {
         warn_undoc(root->fileName,root->startLine,
-                   "warning: class `%s' for related function `%s' is not "
+                   "class `%s' for related function `%s' is not "
                    "documented.", 
                    className.data(),funcName.data()
                   );
@@ -6369,12 +6642,13 @@ localObjCMethod:
               "  scopeName=%s className=%s\n",root->name.data(),scopeName.data(),className.data());
         //printf("Local objective C method `%s' of class `%s' found\n",root->name.data(),cd->name().data());
         MemberDef *md=new MemberDef(
-            root->fileName,root->startLine,
+            root->fileName,root->startLine,root->startColumn,
             funcType,funcName,funcArgs,exceptions,
             root->protection,root->virt,root->stat,Member,
             MemberType_Function,0,root->argList);
         md->setTagInfo(rootNav->tagInfo());
         md->setLanguage(root->lang);
+        md->setId(root->id);
         md->makeImplementationDetail();
         md->setMemberClass(cd);
         md->setDefinition(funcDecl);
@@ -6412,18 +6686,18 @@ localObjCMethod:
     }
     else // unrelated not overloaded member found
     {
-      bool globMem = findGlobalMember(rootNav,namespaceName,funcName,funcTempList,funcArgs,funcDecl);
+      bool globMem = findGlobalMember(rootNav,namespaceName,funcType,funcName,funcTempList,funcArgs,funcDecl);
       if (className.isEmpty() && !globMem)
       {
         warn(root->fileName,root->startLine,
-             "warning: class for member `%s' cannot "
+             "class for member `%s' cannot "
              "be found.", funcName.data()
             ); 
       }
       else if (!className.isEmpty() && !globMem)
       {
         warn(root->fileName,root->startLine,
-             "warning: member `%s' of class `%s' cannot be found",
+             "member `%s' of class `%s' cannot be found",
              funcName.data(),className.data());
       }
     }
@@ -6432,7 +6706,7 @@ localObjCMethod:
   {
     // this should not be called
     warn(root->fileName,root->startLine,
-         "warning: member with no name found.");
+         "member with no name found.");
   }
   return;
 } 
@@ -6446,7 +6720,7 @@ static void filterMemberDocumentation(EntryNav *rootNav)
   Entry *root = rootNav->entry();
   int i=-1,l;
   Debug::print(Debug::FindMembers,0,
-      "findMemberDocumentation(): root->type=`%s' root->inside=`%s' root->name=`%s' root->args=`%s' section=%x root->spec=%d root->mGrpId=%d\n",
+      "findMemberDocumentation(): root->type=`%s' root->inside=`%s' root->name=`%s' root->args=`%s' section=%x root->spec=%lld root->mGrpId=%d\n",
       root->type.data(),root->inside.data(),root->name.data(),root->args.data(),root->section,root->spec,root->mGrpId
       );
   //printf("rootNav->parent()->name()=%s\n",rootNav->parent()->name().data());
@@ -6551,6 +6825,11 @@ static void filterMemberDocumentation(EntryNav *rootNav)
     //if (!root->relates.isEmpty()) printf("  Relates %s\n",root->relates.data());
     findMember(rootNav,root->name,FALSE,FALSE);
   }
+  else if (root->section==Entry::EXPORTED_INTERFACE_SEC ||
+           root->section==Entry::INCLUDED_SERVICE_SEC)
+  {
+    findMember(rootNav,root->type + " " + root->name,FALSE,FALSE);
+  }
   else
   {
     // skip section 
@@ -6565,7 +6844,9 @@ static void findMemberDocumentation(EntryNav *rootNav)
       rootNav->section()==Entry::FUNCTION_SEC ||
       rootNav->section()==Entry::VARIABLE_SEC ||
       rootNav->section()==Entry::VARIABLEDOC_SEC ||
-      rootNav->section()==Entry::DEFINE_SEC
+      rootNav->section()==Entry::DEFINE_SEC ||
+      rootNav->section()==Entry::INCLUDED_SERVICE_SEC ||
+      rootNav->section()==Entry::EXPORTED_INTERFACE_SEC
      )
   {
     rootNav->loadEntry(g_storage);
@@ -6695,7 +6976,7 @@ static void findEnums(EntryNav *rootNav)
     {
       // new enum type
       md = new MemberDef(
-          root->fileName,root->startLine,
+          root->fileName,root->startLine,root->startColumn,
           0,name,0,0,
           root->protection,Normal,FALSE,
           isMemberOf ? Foreign : isRelated ? Related : Member,
@@ -6703,9 +6984,11 @@ static void findEnums(EntryNav *rootNav)
           0,0);
       md->setTagInfo(rootNav->tagInfo());
       md->setLanguage(root->lang);
+      md->setId(root->id);
       if (!isGlobal) md->setMemberClass(cd); else md->setFileDef(fd);
       md->setBodySegment(root->bodyLine,root->endBodyLine);
       md->setBodyDef(rootNav->fileDef());
+      md->setMemberSpecifiers(root->spec); // UNO IDL "published"
       md->setEnumBaseType(root->args);
       //printf("Enum %s definition at line %d of %s: protection=%d\n",
       //    root->name.data(),root->bodyLine,root->fileName.data(),root->protection);
@@ -6906,7 +7189,7 @@ static void addEnumValuesToEnums(EntryNav *rootNav)
                     substitute(rootNav->name(),"::",".")) // enum value scope matches that of the enum
                 {
                   MemberDef *fmd=new MemberDef(
-                      root->fileName,root->startLine,
+                      root->fileName,root->startLine,root->startColumn,
                       root->type,root->name,root->args,0,
                       Public, Normal,root->stat,Member,
                       MemberType_EnumValue,0,0);
@@ -6916,6 +7199,7 @@ static void addEnumValuesToEnums(EntryNav *rootNav)
                   fmd->setOuterScope(md->getOuterScope());
                   fmd->setTagInfo(e->tagInfo());
                   fmd->setLanguage(root->lang);
+                  fmd->setId(root->id);
                   fmd->setDocumentation(root->doc,root->docFile,root->docLine);
                   fmd->setBriefDescription(root->brief,root->briefFile,root->briefLine);
                   fmd->addSectionsToDefinition(root->anchors);
@@ -6926,7 +7210,18 @@ static void addEnumValuesToEnums(EntryNav *rootNav)
                   fmd->setRefItems(root->sli);
                   fmd->setAnchor();
                   md->insertEnumField(fmd);
-                  fmd->setEnumScope(md);
+                  fmd->setEnumScope(md,TRUE);
+                  MemberName *mn=mnsd->find(root->name);
+                  if (mn)
+                  {
+                    mn->append(fmd);
+                  }
+                  else 
+                  {
+                    mn = new MemberName(root->name);
+                    mn->append(fmd);
+                    mnsd->append(root->name,mn);
+                  }
                 }
                 e->releaseEntry();
               }
@@ -7137,7 +7432,7 @@ static void findEnumDocumentation(EntryNav *rootNav)
       if (!found)
       {
         warn(root->fileName,root->startLine,
-             "warning: Documentation for undefined enum `%s' found.",
+             "Documentation for undefined enum `%s' found.",
              name.data()
             );
       }
@@ -7164,9 +7459,9 @@ static void findDEV(const MemberNameSDict &mnsd)
     {
       if (md->isEnumerate()) // member is an enum
       {
-        LockingPtr<MemberList> fmdl = md->enumFieldList();
+        MemberList *fmdl = md->enumFieldList();
         int documentedEnumValues=0;
-        if (fmdl!=0) // enum has values
+        if (fmdl) // enum has values
         {
           MemberListIterator fmni(*fmdl);
           MemberDef *fmd;
@@ -7266,15 +7561,15 @@ static void computeMemberRelations()
               mcd->isBaseClass(bmcd,TRUE))
           {
             //printf("  derived scope\n");
-            LockingPtr<ArgumentList> bmdAl = bmd->argumentList();
-            LockingPtr<ArgumentList>  mdAl =  md->argumentList();
+            ArgumentList *bmdAl = bmd->argumentList();
+            ArgumentList *mdAl =  md->argumentList();
             //printf(" Base argList=`%s'\n Super argList=`%s'\n",
             //        argListToString(bmdAl.pointer()).data(),
             //        argListToString(mdAl.pointer()).data()
             //      );
             if ( 
-                matchArguments2(bmd->getOuterScope(),bmd->getFileDef(),bmdAl.pointer(),
-                  md->getOuterScope(), md->getFileDef(), mdAl.pointer(),
+                matchArguments2(bmd->getOuterScope(),bmd->getFileDef(),bmdAl,
+                  md->getOuterScope(), md->getFileDef(), mdAl,
                   TRUE
                   ) 
                )
@@ -7388,24 +7683,136 @@ static void generateFileSources()
 {
   if (Doxygen::inputNameList->count()>0)
   {
-    FileNameListIterator fnli(*Doxygen::inputNameList); 
-    FileName *fn;
-    for (;(fn=fnli.current());++fnli)
+#if USE_LIBCLANG
+    static bool clangAssistedParsing = Config_getBool("CLANG_ASSISTED_PARSING");
+    if (clangAssistedParsing)
     {
-      FileNameIterator fni(*fn);
-      FileDef *fd;
-      for (;(fd=fni.current());++fni)
+      QDict<void> g_processedFiles(10007);
+
+      // create a dictionary with files to process
+      QDict<void> g_filesToProcess(10007);
+      FileNameListIterator fnli(*Doxygen::inputNameList); 
+      FileName *fn;
+      for (fnli.toFirst();(fn=fnli.current());++fnli)
       {
-        if (fd->generateSourceFile()) // sources need to be shown in the output
+        FileNameIterator fni(*fn);
+        FileDef *fd;
+        for (;(fd=fni.current());++fni)
         {
-          msg("Generating code for file %s...\n",fd->docName().data());
-          fd->writeSource(*g_outputList);
+          g_filesToProcess.insert(fd->absFilePath(),(void*)0x8);
         }
-        else if (!fd->isReference() && Doxygen::parseSourcesNeeded)
-          // we needed to parse the sources even if we do not show them
+      }
+      // process source files (and their include dependencies)
+      for (fnli.toFirst();(fn=fnli.current());++fnli)
+      {
+        FileNameIterator fni(*fn);
+        FileDef *fd;
+        for (;(fd=fni.current());++fni)
         {
-          msg("Parsing code for file %s...\n",fd->docName().data());
-          fd->parseSource();
+          if (fd->isSource() && !fd->isReference())
+          {
+            QStrList filesInSameTu;
+            fd->getAllIncludeFilesRecursively(filesInSameTu);
+            fd->startParsing();
+            if (fd->generateSourceFile()) // sources need to be shown in the output
+            {
+              msg("Generating code for file %s...\n",fd->docName().data());
+              fd->writeSource(*g_outputList,FALSE,filesInSameTu);
+
+            }
+            else if (!fd->isReference() && Doxygen::parseSourcesNeeded)
+              // we needed to parse the sources even if we do not show them
+            {
+              msg("Parsing code for file %s...\n",fd->docName().data());
+              fd->parseSource(FALSE,filesInSameTu);
+            }
+
+            char *incFile = filesInSameTu.first();
+            while (incFile && g_filesToProcess.find(incFile))
+            {
+              if (fd->absFilePath()!=incFile && !g_processedFiles.find(incFile))
+              {
+                QStrList moreFiles;
+                bool ambig;
+                FileDef *ifd=findFileDef(Doxygen::inputNameDict,incFile,ambig);
+                if (ifd && !ifd->isReference())
+                {
+                  if (ifd->generateSourceFile()) // sources need to be shown in the output
+                  {
+                    msg(" Generating code for file %s...\n",ifd->docName().data());
+                    ifd->writeSource(*g_outputList,TRUE,moreFiles);
+
+                  }
+                  else if (!ifd->isReference() && Doxygen::parseSourcesNeeded)
+                    // we needed to parse the sources even if we do not show them
+                  {
+                    msg(" Parsing code for file %s...\n",ifd->docName().data());
+                    ifd->parseSource(TRUE,moreFiles);
+                  }
+                  g_processedFiles.insert(incFile,(void*)0x8);
+                }
+              }
+              incFile = filesInSameTu.next();
+            }
+            fd->finishParsing();
+            g_processedFiles.insert(fd->absFilePath(),(void*)0x8);
+          }
+        }
+      }
+      // process remaining files
+      for (fnli.toFirst();(fn=fnli.current());++fnli)
+      {
+        FileNameIterator fni(*fn);
+        FileDef *fd;
+        for (;(fd=fni.current());++fni)
+        {
+          if (!g_processedFiles.find(fd->absFilePath())) // not yet processed
+          {
+            QStrList filesInSameTu;
+            fd->startParsing();
+            if (fd->generateSourceFile()) // sources need to be shown in the output
+            {
+              msg("Generating code for file %s...\n",fd->docName().data());
+              fd->writeSource(*g_outputList,FALSE,filesInSameTu);
+
+            }
+            else if (!fd->isReference() && Doxygen::parseSourcesNeeded)
+              // we needed to parse the sources even if we do not show them
+            {
+              msg("Parsing code for file %s...\n",fd->docName().data());
+              fd->parseSource(FALSE,filesInSameTu);
+            }
+            fd->finishParsing();
+          }
+        }
+      }
+    }
+    else
+#endif
+    {
+      FileNameListIterator fnli(*Doxygen::inputNameList); 
+      FileName *fn;
+      for (;(fn=fnli.current());++fnli)
+      {
+        FileNameIterator fni(*fn);
+        FileDef *fd;
+        for (;(fd=fni.current());++fni)
+        {
+          QStrList filesInSameTu;
+          fd->startParsing();
+          if (fd->generateSourceFile()) // sources need to be shown in the output
+          {
+            msg("Generating code for file %s...\n",fd->docName().data());
+            fd->writeSource(*g_outputList,FALSE,filesInSameTu);
+
+          }
+          else if (!fd->isReference() && Doxygen::parseSourcesNeeded)
+            // we needed to parse the sources even if we do not show them
+          {
+            msg("Parsing code for file %s...\n",fd->docName().data());
+            fd->parseSource(FALSE,filesInSameTu);
+          }
+          fd->finishParsing();
         }
       }
     }
@@ -7912,7 +8319,7 @@ static void findDefineDocumentation(EntryNav *rootNav)
 
     if (rootNav->tagInfo() && !root->name.isEmpty()) // define read from a tag file
     {
-      MemberDef *md=new MemberDef("<tagfile>",1,
+      MemberDef *md=new MemberDef("<tagfile>",1,1,
                     "#define",root->name,root->args,0,
                     Public,Normal,FALSE,Member,MemberType_Define,0,0);
       md->setTagInfo(rootNav->tagInfo());
@@ -8013,7 +8420,7 @@ static void findDefineDocumentation(EntryNav *rootNav)
           }
           md=mn->next();
         }
-        //warn("warning: define %s found in the following files:\n",root->name.data());
+        //warn("define %s found in the following files:\n",root->name.data());
         //warn("Cannot determine where to add the documentation found "
         //     "at line %d of file %s. \n",
         //     root->startLine,root->fileName.data());
@@ -8025,14 +8432,14 @@ static void findDefineDocumentation(EntryNav *rootNav)
       if (preEnabled)
       {
         warn(root->fileName,root->startLine,
-             "warning: documentation for unknown define %s found.\n",
+             "documentation for unknown define %s found.\n",
              root->name.data()
             );
       }
       else
       {
         warn(root->fileName,root->startLine,
-             "warning: found documented #define but ignoring it because "
+             "found documented #define but ignoring it because "
              "ENABLE_PREPROCESSING is NO.\n",
              root->name.data()
             );
@@ -8079,7 +8486,7 @@ static void findDirDocumentation(EntryNav *rootNav)
         if (matchingDir)
         {
            warn(root->fileName,root->startLine,
-             "warning: \\dir command matches multiple directories.\n"
+             "\\dir command matches multiple directories.\n"
              "  Applying the command for directory %s\n"
              "  Ignoring the command for directory %s\n",
              matchingDir->name().data(),dir->name().data()
@@ -8101,7 +8508,7 @@ static void findDirDocumentation(EntryNav *rootNav)
     }
     else
     {
-      warn(root->fileName,root->startLine,"warning: No matching "
+      warn(root->fileName,root->startLine,"No matching "
           "directory found for command \\dir %s\n",normalizedName.data());
     }
     rootNav->releaseEntry();
@@ -8183,7 +8590,7 @@ static void findMainPage(EntryNav *rootNav)
     else
     {
       warn(root->fileName,root->startLine,
-           "warning: found more than one \\mainpage comment block! Skipping this "
+           "found more than one \\mainpage comment block! Skipping this "
            "block."
           );
     }
@@ -8239,7 +8646,7 @@ static void checkPageRelations()
     {
       if (ppd==pd)
       {
-        err("warning: page defined at line %d of file %s with label %s is a subpage "
+        err("page defined at line %d of file %s with label %s is a subpage "
             "of itself! Please remove this cyclic dependency.\n",
             pd->docLine(),pd->docFile().data(),pd->name().data());
         exit(1);
@@ -8354,7 +8761,7 @@ static void buildExampleList(EntryNav *rootNav)
     if (Doxygen::exampleSDict->find(root->name))
     {
       warn(root->fileName,root->startLine,
-          "warning: Example %s was already documented. Ignoring "
+          "Example %s was already documented. Ignoring "
           "documentation found here.",
           root->name.data()
           );
@@ -8416,7 +8823,7 @@ static void generateExampleDocs()
     g_outputList->docify(pd->name());
     endTitle(*g_outputList,n,0);
     g_outputList->startContents();
-    g_outputList->parseDoc(pd->docFile(),                            // file
+    g_outputList->generateDoc(pd->docFile(),                            // file
                          pd->docLine(),                            // startLine
                          pd,                                       // context
                          0,                                        // memberDef
@@ -8573,7 +8980,7 @@ static void generateConfigFile(const char *configFile,bool shortList,
       {
         msg("\n\nConfiguration file `%s' created.\n\n",configFile);
         msg("Now edit the configuration file and enter\n\n");
-        if (strcmp(configFile,"Doxyfile") || strcmp(configFile,"doxyfile"))
+        if (qstrcmp(configFile,"Doxyfile") || qstrcmp(configFile,"doxyfile"))
           msg("  doxygen %s\n\n",configFile);
         else
           msg("  doxygen\n\n");
@@ -8587,7 +8994,7 @@ static void generateConfigFile(const char *configFile,bool shortList,
   }
   else
   {
-    err("error: Cannot open file %s for writing\n",configFile);
+    err("Cannot open file %s for writing\n",configFile);
     exit(1);
   }
 }
@@ -8616,7 +9023,7 @@ static void readTagFile(Entry *root,const char *tl)
     fileName = tagLine.left(eqPos).stripWhiteSpace();
     destName = tagLine.right(tagLine.length()-eqPos-1).stripWhiteSpace();
     QFileInfo fi(fileName);
-    Doxygen::tagDestinationDict.insert(fi.fileName().utf8(),new QCString(destName));
+    Doxygen::tagDestinationDict.insert(fi.absFilePath().utf8(),new QCString(destName));
     //printf("insert tagDestination %s->%s\n",fi.fileName().data(),destName.data());
   }
   else
@@ -8627,7 +9034,7 @@ static void readTagFile(Entry *root,const char *tl)
   QFileInfo fi(fileName);
   if (!fi.exists() || !fi.isFile())
   {
-    err("error: Tag file `%s' does not exist or is not a file. Skipping it...\n",
+    err("Tag file `%s' does not exist or is not a file. Skipping it...\n",
         fileName.data());
     return;
   }
@@ -8637,7 +9044,7 @@ static void readTagFile(Entry *root,const char *tl)
   else
     msg("Reading tag file `%s'...\n",fileName.data());
 
-  parseTagFile(root,fi.absFilePath().utf8(),fi.fileName().utf8());
+  parseTagFile(root,fi.absFilePath().utf8());
 }
 
 //----------------------------------------------------------------------------
@@ -8696,9 +9103,9 @@ static void copyLogo()
   }
 }
 
-static void copyExtraFiles()
+static void copyExtraFiles(const QCString& filesOption,const QCString &outputOption)
 {
-  QStrList files = Config_getList("HTML_EXTRA_FILES");
+  QStrList files = Config_getList(filesOption);
   uint i;
   for (i=0; i<files.count(); ++i)
   {
@@ -8709,66 +9116,186 @@ static void copyExtraFiles()
       QFileInfo fi(fileName);
       if (!fi.exists()) 
       {
-        err("Extra HTML file '%s' specified in HTML_EXTRA_FILES does not exist!\n", fileName.data());
+        err("Extra file '%s' specified in" + filesOption + " does not exist!\n", fileName.data());
       }
       else
       {
-        QCString destFileName = Config_getString("HTML_OUTPUT")+"/"+fi.fileName().data();
-        Doxygen::indexList->addImageFile(fi.fileName().data());
+        QCString destFileName = Config_getString(outputOption)+"/"+fi.fileName().data();
+        Doxygen::indexList->addImageFile(fi.fileName().utf8());
         copyFile(fileName, destFileName);
       }
     }
   }
 }
 
-//! parse the list of input files
-static void parseFiles(Entry *root,EntryNav *rootNav)
+//----------------------------------------------------------------------------
+
+static ParserInterface *getParserForFile(const char *fn)
 {
-  QCString *s=g_inputFiles.first();
-  while (s)
+  QCString fileName=fn;
+  QCString extension;
+  int ei = fileName.findRev('.');
+  if (ei!=-1)
+  {
+    extension=fileName.right(fileName.length()-ei);
+  }
+  else
   {
-    QCString fileName=*s;
-    QCString extension;
-    int ei = fileName.findRev('.');
-    if (ei!=-1) extension=fileName.right(fileName.length()-ei);
-    ParserInterface *parser = Doxygen::parserManager->getParser(extension);
+    extension = ".no_extension";
+  }
 
-    QFileInfo fi(fileName);
-    BufStr preBuf(fi.size()+4096);
+  return Doxygen::parserManager->getParser(extension);
+}
 
-    if (Config_getBool("ENABLE_PREPROCESSING") && 
-        parser->needsPreprocessing(extension))
-    {
-      BufStr inBuf(fi.size()+4096);
-      msg("Preprocessing %s...\n",s->data());
-      readInputFile(fileName,inBuf);
-      preprocessFile(fileName,inBuf,preBuf);
-    }
-    else // no preprocessing
-    {
-      msg("Reading %s...\n",s->data());
-      readInputFile(fileName,preBuf);
-    }
+static void parseFile(ParserInterface *parser,
+                      Entry *root,EntryNav *rootNav,FileDef *fd,const char *fn,
+                      bool sameTu,QStrList &filesInSameTu)
+{
+#if USE_LIBCLANG
+  static bool clangAssistedParsing = Config_getBool("CLANG_ASSISTED_PARSING");
+#else
+  static bool clangAssistedParsing = FALSE;
+#endif
+  QCString fileName=fn;
+  QCString extension;
+  int ei = fileName.findRev('.');
+  if (ei!=-1)
+  {
+    extension=fileName.right(fileName.length()-ei);
+  }
+  else
+  {
+    extension = ".no_extension";
+  }
 
-    BufStr convBuf(preBuf.curPos()+1024);
+  QFileInfo fi(fileName);
+  BufStr preBuf(fi.size()+4096);
 
-    // convert multi-line C++ comments to C style comments
-    convertCppComments(&preBuf,&convBuf,fileName);
+  if (Config_getBool("ENABLE_PREPROCESSING") && 
+      parser->needsPreprocessing(extension))
+  {
+    BufStr inBuf(fi.size()+4096);
+    msg("Preprocessing %s...\n",fn);
+    readInputFile(fileName,inBuf);
+    preprocessFile(fileName,inBuf,preBuf);
+  }
+  else // no preprocessing
+  {
+    msg("Reading %s...\n",fn);
+    readInputFile(fileName,preBuf);
+  }
 
-    convBuf.addChar('\0');
+  BufStr convBuf(preBuf.curPos()+1024);
 
-    // use language parse to parse the file
-    parser->parseInput(fileName,convBuf.data(),root);
+  // convert multi-line C++ comments to C style comments
+  convertCppComments(&preBuf,&convBuf,fileName);
 
-    // store the Entry tree in a file and create an index to
-    // navigate/load entries
-    bool ambig;
-    FileDef *fd=findFileDef(Doxygen::inputNameDict,fileName,ambig);
-    ASSERT(fd!=0);
-    //printf("root->createNavigationIndex for %s\n",fd->name().data());
-    root->createNavigationIndex(rootNav,g_storage,fd);
+  convBuf.addChar('\0');
+
+  if (clangAssistedParsing && !sameTu)
+  {
+    fd->getAllIncludeFilesRecursively(filesInSameTu);
+  }
+
+  // use language parse to parse the file
+  parser->parseInput(fileName,convBuf.data(),root,sameTu,filesInSameTu);
+
+  // store the Entry tree in a file and create an index to
+  // navigate/load entries
+  //printf("root->createNavigationIndex for %s\n",fd->name().data());
+  root->createNavigationIndex(rootNav,g_storage,fd);
+}
+
+//! parse the list of input files
+static void parseFiles(Entry *root,EntryNav *rootNav)
+{
+#if USE_LIBCLANG
+  static bool clangAssistedParsing = Config_getBool("CLANG_ASSISTED_PARSING");
+  if (clangAssistedParsing)
+  {
+    QDict<void> g_processedFiles(10007);
+
+    // create a dictionary with files to process
+    QDict<void> g_filesToProcess(10007);
+    QCString *s=g_inputFiles.first();
+    while (s)
+    {
+      g_filesToProcess.insert(*s,(void*)0x8);
+      s=g_inputFiles.next();
+    }
+    s=g_inputFiles.first();
+
+    // process source files (and their include dependencies)
+    while (s)
+    {
+      bool ambig;
+      FileDef *fd=findFileDef(Doxygen::inputNameDict,s->data(),ambig);
+      ASSERT(fd!=0);
+      if (fd->isSource() && !fd->isReference()) // this is a source file
+      {
+        QStrList filesInSameTu;
+        ParserInterface * parser = getParserForFile(s->data());
+        parser->startTranslationUnit(s->data());
+        parseFile(parser,root,rootNav,fd,s->data(),FALSE,filesInSameTu);
+        //printf("  got %d extra files in tu\n",filesInSameTu.count());
 
-    s=g_inputFiles.next();
+        // Now process any include files in the same translation unit 
+        // first. When libclang is used this is much more efficient.
+        char *incFile = filesInSameTu.first();
+        while (incFile && g_filesToProcess.find(incFile))
+        {
+          if (qstrcmp(incFile,s->data()) && !g_processedFiles.find(incFile))
+          {
+            FileDef *ifd=findFileDef(Doxygen::inputNameDict,incFile,ambig);
+            if (ifd && !ifd->isReference())
+            {
+              QStrList moreFiles;
+              //printf("  Processing %s in same translation unit as %s\n",incFile,s->data());
+              parseFile(parser,root,rootNav,ifd,incFile,TRUE,moreFiles);
+              g_processedFiles.insert(incFile,(void*)0x8);
+            }
+          }
+          incFile = filesInSameTu.next();
+        }
+        parser->finishTranslationUnit();
+        g_processedFiles.insert(*s,(void*)0x8);
+      }
+      s=g_inputFiles.next();
+    }
+    // process remaining files
+    s=g_inputFiles.first();
+    while (s)
+    {
+      if (!g_processedFiles.find(*s)) // not yet processed
+      {
+        bool ambig;
+        QStrList filesInSameTu;
+        FileDef *fd=findFileDef(Doxygen::inputNameDict,s->data(),ambig);
+        ASSERT(fd!=0);
+        ParserInterface * parser = getParserForFile(s->data());
+        parser->startTranslationUnit(s->data());
+        parseFile(parser,root,rootNav,fd,s->data(),FALSE,filesInSameTu);
+        parser->finishTranslationUnit();
+        g_processedFiles.insert(*s,(void*)0x8);
+      }
+      s=g_inputFiles.next();
+    }
+  }
+  else // normal pocessing
+#endif
+  {
+    QCString *s=g_inputFiles.first();
+    while (s)
+    {
+      bool ambig;
+      QStrList filesInSameTu;
+      FileDef *fd=findFileDef(Doxygen::inputNameDict,s->data(),ambig);
+      ASSERT(fd!=0);
+      ParserInterface * parser = getParserForFile(s->data());
+      parser->startTranslationUnit(s->data());
+      parseFile(parser,root,rootNav,fd,s->data(),FALSE,filesInSameTu);
+      s=g_inputFiles.next();
+    }
   }
 }
 
@@ -8858,10 +9385,15 @@ int readDir(QFileInfo *fi,
             StringDict *resultDict,
             bool errorIfNotExist,
             bool recursive,
-            QDict<void> *killDict
+            QDict<void> *killDict,
+            QDict<void> *paths
            )
 {
   QCString dirName = fi->absFilePath().utf8();
+  if (paths && paths->find(dirName)==0)
+  {
+    paths->insert(dirName,(void*)0x8);
+  }
   if (fi->isSymLink())
   {
     dirName = resolveSymlink(dirName.data());
@@ -8890,7 +9422,7 @@ int readDir(QFileInfo *fi,
         {
           if (errorIfNotExist)
           {
-            err("warning: source %s is not a readable file or directory... skipping.\n",cfi->absFilePath().data());
+            warn_uncond("source %s is not a readable file or directory... skipping.\n",cfi->absFilePath().data());
           }
         }
         else if (cfi->isFile() && 
@@ -8937,7 +9469,7 @@ int readDir(QFileInfo *fi,
           cfi->setFile(cfi->absFilePath());
           totalSize+=readDir(cfi,fnList,fnDict,exclDict,
               patList,exclPatList,resultList,resultDict,errorIfNotExist,
-              recursive,killDict);
+              recursive,killDict,paths);
         }
       }
       ++it;
@@ -8961,7 +9493,8 @@ int readFileOrDirectory(const char *s,
                         StringDict *resultDict,
                         bool recursive,
                         bool errorIfNotExist,
-                        QDict<void> *killDict
+                        QDict<void> *killDict,
+                        QDict<void> *paths
                        )
 {
   //printf("killDict=%p count=%d\n",killDict,killDict->count());
@@ -8981,15 +9514,21 @@ int readFileOrDirectory(const char *s,
       {
         if (errorIfNotExist)
         {
-          err("warning: source %s is not a readable file or directory... skipping.\n",s);
+          warn_uncond("source %s is not a readable file or directory... skipping.\n",s);
         }
       }
       else if (!Config_getBool("EXCLUDE_SYMLINKS") || !fi.isSymLink())
       {
         if (fi.isFile())
         {
+          QCString dirPath = fi.dirPath(TRUE).utf8();
+          QCString filePath = fi.absFilePath().utf8();
+          if (paths && paths->find(dirPath))
+          {
+            paths->insert(dirPath,(void*)0x8);
+          }
           //printf("killDict->find(%s)\n",fi.absFilePath().data());
-          if (killDict==0 || killDict->find(fi.absFilePath().utf8())==0)
+          if (killDict==0 || killDict->find(filePath)==0)
           {
             totalSize+=fi.size()+fi.absFilePath().length()+4; //readFile(&fi,fiList,input); 
             //fiList->inSort(new FileInfo(fi));
@@ -8997,7 +9536,7 @@ int readFileOrDirectory(const char *s,
             //printf("New file %s\n",name.data());
             if (fnDict)
             {
-              FileDef  *fd=new FileDef(fi.dirPath(TRUE).utf8()+"/",name);
+              FileDef  *fd=new FileDef(dirPath+"/",name);
               FileName *fn=0;
               if (!name.isEmpty() && (fn=(*fnDict)[name]))
               {
@@ -9005,7 +9544,7 @@ int readFileOrDirectory(const char *s,
               }
               else
               {
-                fn = new FileName(fi.absFilePath().utf8(),name);
+                fn = new FileName(filePath,name);
                 fn->append(fd);
                 if (fnList) fnList->inSort(fn);
                 fnDict->insert(name,fn);
@@ -9014,9 +9553,9 @@ int readFileOrDirectory(const char *s,
             QCString *rs=0;
             if (resultList || resultDict)
             {
-              rs=new QCString(fi.absFilePath().utf8());
+              rs=new QCString(filePath);
               if (resultList) resultList->append(rs);
-              if (resultDict) resultDict->insert(fi.absFilePath().utf8(),rs);
+              if (resultDict) resultDict->insert(filePath,rs);
             }
 
             if (killDict) killDict->insert(fi.absFilePath().utf8(),(void *)0x8);
@@ -9026,7 +9565,7 @@ int readFileOrDirectory(const char *s,
         {
           totalSize+=readDir(&fi,fnList,fnDict,exclDict,patList,
               exclPatList,resultList,resultDict,errorIfNotExist,
-              recursive,killDict);
+              recursive,killDict,paths);
         }
       }
     }
@@ -9050,7 +9589,7 @@ void readFormulaRepository()
       int se=line.find(':'); // find name and text separator.
       if (se==-1)
       {
-        err("warning: formula.repository is corrupted!\n");
+        warn_uncond("formula.repository is corrupted!\n");
         break;
       }
       else
@@ -9223,7 +9762,7 @@ void dumpConfigAsXML()
 
 static void usage(const char *name)
 {
-  msg("Doxygen version %s\nCopyright Dimitri van Heesch 1997-2012\n\n",versionString);
+  msg("Doxygen version %s\nCopyright Dimitri van Heesch 1997-2013\n\n",versionString);
   msg("You can use doxygen in a number of ways:\n\n");
   msg("1) Use doxygen to generate a template configuration file:\n");
   msg("    %s [-s] -g [configName]\n\n",name);
@@ -9255,7 +9794,7 @@ static void usage(const char *name)
 static const char *getArg(int argc,char **argv,int &optind)
 {
   char *s=0;
-  if (strlen(&argv[optind][2])>0)
+  if (qstrlen(&argv[optind][2])>0)
     s=&argv[optind][2];
   else if (optind+1<argc && argv[optind+1][0]!='-')
     s=argv[++optind];
@@ -9272,8 +9811,6 @@ void initDoxygen()
   setlocale(LC_CTYPE,"C"); // to get isspace(0xA0)==0, needed for UTF-8
   setlocale(LC_NUMERIC,"C");
 
-  //Doxygen::symbolMap->setAutoDelete(TRUE);
-
   Doxygen::runningTime.start();
   initPreprocessor();
 
@@ -9293,7 +9830,10 @@ void initDoxygen()
   initNamespaceMemberIndices();
   initFileMemberIndices();
 
-  Doxygen::symbolMap     = new QDict<DefinitionIntf>(1000);
+  Doxygen::symbolMap     = new QDict<DefinitionIntf>(50177);
+#ifdef USE_LIBCLANG
+  Doxygen::clangUsrMap   = new QDict<Definition>(50177);
+#endif
   Doxygen::inputNameList = new FileNameList;
   Doxygen::inputNameList->setAutoDelete(TRUE);
   Doxygen::memberNameSDict = new MemberNameSDict(10000);   
@@ -9302,7 +9842,7 @@ void initDoxygen()
   Doxygen::functionNameSDict->setAutoDelete(TRUE);
   Doxygen::groupSDict = new GroupSDict(17);          
   Doxygen::groupSDict->setAutoDelete(TRUE);
-  Doxygen::globalScope = new NamespaceDef("<globalScope>",1,"<globalScope>");
+  Doxygen::globalScope = new NamespaceDef("<globalScope>",1,1,"<globalScope>");
   Doxygen::namespaceSDict = new NamespaceSDict(20);      
   Doxygen::namespaceSDict->setAutoDelete(TRUE);
   Doxygen::classSDict = new ClassSDict(1009);         
@@ -9334,6 +9874,19 @@ void initDoxygen()
   Doxygen::formulaNameDict = new FormulaDict(1009);
   Doxygen::sectionDict = new SectionDict(257);
   Doxygen::sectionDict->setAutoDelete(TRUE);
+
+  /**************************************************************************
+   *            Initialize some global constants
+   **************************************************************************/
+  
+  g_compoundKeywordDict.insert("template class",(void *)8);
+  g_compoundKeywordDict.insert("template struct",(void *)8);
+  g_compoundKeywordDict.insert("class",(void *)8);
+  g_compoundKeywordDict.insert("struct",(void *)8);
+  g_compoundKeywordDict.insert("union",(void *)8);
+  g_compoundKeywordDict.insert("interface",(void *)8);
+  g_compoundKeywordDict.insert("exception",(void *)8);
+
 }
 
 void cleanUpDoxygen()
@@ -9434,7 +9987,7 @@ void readConfiguration(int argc, char **argv)
       case 'g':
         genConfig=TRUE;
         configName=getArg(argc,argv,optind);
-        if (strcmp(argv[optind+1],"-")==0)
+        if (optind+1<argc && qstrcmp(argv[optind+1],"-")==0)
         { configName="-"; optind++; }
         if (!configName) 
         { configName="Doxyfile"; }
@@ -9459,15 +10012,15 @@ void readConfiguration(int argc, char **argv)
         formatName=getArg(argc,argv,optind);
         if (!formatName)
         {
-          err("error: option -e is missing format specifier rtf.\n");
+          err("option -e is missing format specifier rtf.\n");
           cleanUpDoxygen();
           exit(1);
         }
-        if (stricmp(formatName,"rtf")==0)
+        if (qstricmp(formatName,"rtf")==0)
         {
           if (optind+1>=argc)
           {
-            err("error: option \"-e rtf\" is missing an extensions file name\n");
+            err("option \"-e rtf\" is missing an extensions file name\n");
             cleanUpDoxygen();
             exit(1);
           }
@@ -9479,7 +10032,7 @@ void readConfiguration(int argc, char **argv)
           cleanUpDoxygen();
           exit(1);
         }
-        err("error: option \"-e\" has invalid format specifier.\n");
+        err("option \"-e\" has invalid format specifier.\n");
         cleanUpDoxygen();
         exit(1);
         break; 
@@ -9487,15 +10040,15 @@ void readConfiguration(int argc, char **argv)
         formatName=getArg(argc,argv,optind);
         if (!formatName)
         {
-          err("error: option -w is missing format specifier rtf, html or latex\n");
+          err("option -w is missing format specifier rtf, html or latex\n");
           cleanUpDoxygen();
           exit(1);
         } 
-        if (stricmp(formatName,"rtf")==0)
+        if (qstricmp(formatName,"rtf")==0)
         {
           if (optind+1>=argc)
           {
-            err("error: option \"-w rtf\" is missing a style sheet file name\n");
+            err("option \"-w rtf\" is missing a style sheet file name\n");
             cleanUpDoxygen();
             exit(1);
           }
@@ -9507,7 +10060,7 @@ void readConfiguration(int argc, char **argv)
           cleanUpDoxygen();
           exit(1);
         }
-        else if (stricmp(formatName,"html")==0)
+        else if (qstricmp(formatName,"html")==0)
         {
           if (optind+4<argc || QFileInfo("Doxyfile").exists())
           {
@@ -9532,7 +10085,7 @@ void readConfiguration(int argc, char **argv)
           }
           if (optind+3>=argc)
           {
-            err("error: option \"-w html\" does not have enough arguments\n");
+            err("option \"-w html\" does not have enough arguments\n");
             cleanUpDoxygen();
             exit(1);
           }
@@ -9540,7 +10093,7 @@ void readConfiguration(int argc, char **argv)
           QCString outputLanguage=Config_getEnum("OUTPUT_LANGUAGE");
           if (!setTranslator(outputLanguage))
           {
-            err("warning: Output language %s not supported! Using English instead.\n", outputLanguage.data());
+            warn_uncond("Output language %s not supported! Using English instead.\n", outputLanguage.data());
           }
 
           QFile f;
@@ -9561,7 +10114,7 @@ void readConfiguration(int argc, char **argv)
           cleanUpDoxygen();
           exit(0);
         }
-        else if (stricmp(formatName,"latex")==0)
+        else if (qstricmp(formatName,"latex")==0)
         {
           if (optind+4<argc) // use config file to get settings
           {
@@ -9581,7 +10134,7 @@ void readConfiguration(int argc, char **argv)
           }
           if (optind+3>=argc)
           {
-            err("error: option \"-w latex\" does not have enough arguments\n");
+            err("option \"-w latex\" does not have enough arguments\n");
             cleanUpDoxygen();
             exit(1);
           }
@@ -9589,7 +10142,7 @@ void readConfiguration(int argc, char **argv)
           QCString outputLanguage=Config_getEnum("OUTPUT_LANGUAGE");
           if (!setTranslator(outputLanguage))
           {
-            err("warning: Output language %s not supported! Using English instead.\n", outputLanguage.data());
+            warn_uncond("Output language %s not supported! Using English instead.\n", outputLanguage.data());
           }
 
           QFile f;
@@ -9612,7 +10165,7 @@ void readConfiguration(int argc, char **argv)
         }
         else
         {
-          err("error: Illegal format specifier %s: should be one of rtf, html, latex, or bst\n",formatName);
+          err("Illegal format specifier %s: should be one of rtf, html, latex, or bst\n",formatName);
           cleanUpDoxygen();
           exit(1);
         }
@@ -9624,11 +10177,11 @@ void readConfiguration(int argc, char **argv)
         g_dumpConfigAsXML = TRUE;
         break;
       case '-':
-        if (strcmp(&argv[optind][2],"help")==0)
+        if (qstrcmp(&argv[optind][2],"help")==0)
         {
           usage(argv[0]);
         }
-        else if (strcmp(&argv[optind][2],"version")==0)
+        else if (qstrcmp(&argv[optind][2],"version")==0)
         {
           msg("%s\n",versionString); 
           cleanUpDoxygen();
@@ -9699,13 +10252,13 @@ void readConfiguration(int argc, char **argv)
   else
   {
     QFileInfo fi(argv[optind]);
-    if (fi.exists() || strcmp(argv[optind],"-")==0)
+    if (fi.exists() || qstrcmp(argv[optind],"-")==0)
     {
       configName=argv[optind];
     }
     else
     {
-      err("error: configuration file %s not found!\n",argv[optind]);
+      err("configuration file %s not found!\n",argv[optind]);
       usage(argv[0]);
     }
   }
@@ -9713,7 +10266,7 @@ void readConfiguration(int argc, char **argv)
 
   if (!Config::instance()->parse(configName))
   {
-    err("error: could not open or read configuration file %s!\n",configName);
+    err("could not open or read configuration file %s!\n",configName);
     cleanUpDoxygen();
     exit(1);
   }
@@ -9748,7 +10301,7 @@ void adjustConfiguration()
   QCString outputLanguage=Config_getEnum("OUTPUT_LANGUAGE");
   if (!setTranslator(outputLanguage))
   {
-    err("warning: Output language %s not supported! Using English instead.\n",
+    warn_uncond("Output language %s not supported! Using English instead.\n",
        outputLanguage.data());
   }
   QStrList &includePath = Config_getList("INCLUDE_PATH");
@@ -9901,7 +10454,7 @@ static QCString getQchFileName()
       + QCString(".qch");
 }
 
-void searchInputFiles(StringList &inputFiles)
+void searchInputFiles()
 {
   QStrList &exclPatterns = Config_getList("EXCLUDE_PATTERNS");
   bool alwaysRecursive = Config_getBool("RECURSIVE");
@@ -9909,7 +10462,7 @@ void searchInputFiles(StringList &inputFiles)
   excludeNameDict.setAutoDelete(TRUE);
 
   // gather names of all files in the include path
-  msg("Searching for include files...\n");
+  g_s.begin("Searching for include files...\n");
   QStrList &includePathList = Config_getList("INCLUDE_PATH");
   char *s=includePathList.first();
   while (s)
@@ -9924,8 +10477,9 @@ void searchInputFiles(StringList &inputFiles)
                         alwaysRecursive);
     s=includePathList.next(); 
   }
-  
-  msg("Searching for example files...\n");
+  g_s.end();
+
+  g_s.begin("Searching for example files...\n");
   QStrList &examplePathList = Config_getList("EXAMPLE_PATH");
   s=examplePathList.first();
   while (s)
@@ -9936,8 +10490,9 @@ void searchInputFiles(StringList &inputFiles)
                         (alwaysRecursive || Config_getBool("EXAMPLE_RECURSIVE")));
     s=examplePathList.next(); 
   }
+  g_s.end();
 
-  msg("Searching for images...\n");
+  g_s.begin("Searching for images...\n");
   QStrList &imagePathList=Config_getList("IMAGE_PATH");
   s=imagePathList.first();
   while (s)
@@ -9947,8 +10502,9 @@ void searchInputFiles(StringList &inputFiles)
                         alwaysRecursive);
     s=imagePathList.next(); 
   }
+  g_s.end();
 
-  msg("Searching for dot files...\n");
+  g_s.begin("Searching for dot files...\n");
   QStrList &dotFileList=Config_getList("DOTFILE_DIRS");
   s=dotFileList.first();
   while (s)
@@ -9958,8 +10514,9 @@ void searchInputFiles(StringList &inputFiles)
                         alwaysRecursive);
     s=dotFileList.next(); 
   }
+  g_s.end();
 
-  msg("Searching for msc files...\n");
+  g_s.begin("Searching for msc files...\n");
   QStrList &mscFileList=Config_getList("MSCFILE_DIRS");
   s=mscFileList.first();
   while (s)
@@ -9969,9 +10526,9 @@ void searchInputFiles(StringList &inputFiles)
                         alwaysRecursive);
     s=mscFileList.next(); 
   }
+  g_s.end();
 
-
-  msg("Searching for files to exclude\n");
+  g_s.begin("Searching for files to exclude\n");
   QStrList &excludeList = Config_getList("EXCLUDE");
   s=excludeList.first();
   while (s)
@@ -9982,38 +10539,44 @@ void searchInputFiles(StringList &inputFiles)
                         FALSE);
     s=excludeList.next();
   }
+  g_s.end();
 
   /**************************************************************************
    *             Determine Input Files                                      *
    **************************************************************************/
 
-  msg("Searching for files to process...\n");
+  g_s.begin("Searching for files to process...\n");
   QDict<void> *killDict = new QDict<void>(10007);
   int inputSize=0;
   QStrList &inputList=Config_getList("INPUT");
-  inputFiles.setAutoDelete(TRUE);
+  g_inputFiles.setAutoDelete(TRUE);
   s=inputList.first();
   while (s)
   {
     QCString path=s;
     uint l = path.length();
-    // strip trailing slashes
-    if (path.at(l-1)=='\\' || path.at(l-1)=='/') path=path.left(l-1);
-
-    inputSize+=readFileOrDirectory(
-        path,
-        Doxygen::inputNameList,
-        Doxygen::inputNameDict,
-        &excludeNameDict,
-        &Config_getList("FILE_PATTERNS"),
-        &exclPatterns,
-        &inputFiles,0,
-        alwaysRecursive,
-        TRUE,
-        killDict);
+    if (l>0)
+    {
+      // strip trailing slashes
+      if (path.at(l-1)=='\\' || path.at(l-1)=='/') path=path.left(l-1);
+  
+      inputSize+=readFileOrDirectory(
+          path,
+          Doxygen::inputNameList,
+          Doxygen::inputNameDict,
+          &excludeNameDict,
+          &Config_getList("FILE_PATTERNS"),
+          &exclPatterns,
+          &g_inputFiles,0,
+          alwaysRecursive,
+          TRUE,
+          killDict,
+          &Doxygen::inputPaths);
+    }
     s=inputList.next();
   }
   delete killDict;
+  g_s.end();
 }
 
   
@@ -10038,14 +10601,14 @@ void parseInput()
       dir.setPath(QDir::currentDirPath());
       if (!dir.mkdir(outputDirectory))
       {
-        err("error: tag OUTPUT_DIRECTORY: Output directory `%s' does not "
+        err("tag OUTPUT_DIRECTORY: Output directory `%s' does not "
            "exist and cannot be created\n",outputDirectory.data());
         cleanUpDoxygen();
         exit(1);
       }
-      else if (!Config_getBool("QUIET"))
+      else
       {
-       err("Notice: Output directory `%s' does not exist. "
+       msg("Notice: Output directory `%s' does not exist. "
            "I have created it for you.\n", outputDirectory.data());
       }
       dir.cd(outputDirectory);
@@ -10057,16 +10620,10 @@ void parseInput()
    *            Initialize global lists and dictionaries
    **************************************************************************/
 
-  int cacheSize = Config_getInt("SYMBOL_CACHE_SIZE");
-  if (cacheSize<0) cacheSize=0;
-  if (cacheSize>9) cacheSize=9;
-  Doxygen::symbolCache   = new ObjCache(16+cacheSize); // 16 -> room for 65536 elements, 
-                                                       //       ~2.0 MByte "overhead"
-  //Doxygen::symbolCache   = new ObjCache(1);  // only to stress test cache behaviour
   Doxygen::symbolStorage = new Store;
 
   // also scale lookup cache with SYMBOL_CACHE_SIZE
-  cacheSize = Config_getInt("LOOKUP_CACHE_SIZE");
+  int cacheSize = Config_getInt("LOOKUP_CACHE_SIZE");
   if (cacheSize<0) cacheSize=0;
   if (cacheSize>9) cacheSize=9;
   uint lookupSize = 65536 << cacheSize;
@@ -10090,18 +10647,6 @@ void parseInput()
   }
 
 
-  /**************************************************************************
-   *            Initialize some global constants
-   **************************************************************************/
-  
-  g_compoundKeywordDict.insert("template class",(void *)8);
-  g_compoundKeywordDict.insert("template struct",(void *)8);
-  g_compoundKeywordDict.insert("class",(void *)8);
-  g_compoundKeywordDict.insert("struct",(void *)8);
-  g_compoundKeywordDict.insert("union",(void *)8);
-  g_compoundKeywordDict.insert("interface",(void *)8);
-  g_compoundKeywordDict.insert("exception",(void *)8);
-
 
   /**************************************************************************
    *            Check/create output directorties                            *
@@ -10112,6 +10657,11 @@ void parseInput()
   if (generateHtml)
     htmlOutput = createOutputDirectory(outputDirectory,"HTML_OUTPUT","/html");
 
+  QCString docbookOutput;
+  bool &generateDocbook = Config_getBool("GENERATE_DOCBOOK");
+  if (generateDocbook)
+    docbookOutput = createOutputDirectory(outputDirectory,"DOCBOOK_OUTPUT","/docbook");
+
   QCString xmlOutput;
   bool &generateXml = Config_getBool("GENERATE_XML");
   if (generateXml)
@@ -10132,6 +10682,10 @@ void parseInput()
   if (generateMan)
     manOutput = createOutputDirectory(outputDirectory,"MAN_OUTPUT","/man");
 
+  //QCString sqlOutput;
+  //bool &generateSql = Config_getBool("GENERATE_SQLITE3");
+  //if (generateSql)
+  //  sqlOutput = createOutputDirectory(outputDirectory,"SQLITE3_OUTPUT","/sqlite3");
 
   if (Config_getBool("HAVE_DOT"))
   {
@@ -10178,7 +10732,7 @@ void parseInput()
   }
   else if (!defaultLayoutUsed)
   {
-    err("warning: failed to open layout file '%s' for reading!\n",layoutFileName.data());
+    warn_uncond("failed to open layout file '%s' for reading!\n",layoutFileName.data());
   }
 
   /**************************************************************************
@@ -10187,14 +10741,14 @@ void parseInput()
  
   // prevent search in the output directories
   QStrList &exclPatterns = Config_getList("EXCLUDE_PATTERNS");
-  if (generateHtml)  exclPatterns.append(htmlOutput);
-  if (generateXml)   exclPatterns.append(xmlOutput);
-  if (generateLatex) exclPatterns.append(latexOutput);
-  if (generateRtf)   exclPatterns.append(rtfOutput);
-  if (generateMan)   exclPatterns.append(manOutput);
+  if (generateHtml)    exclPatterns.append(htmlOutput);
+  if (generateDocbook) exclPatterns.append(docbookOutput);
+  if (generateXml)     exclPatterns.append(xmlOutput);
+  if (generateLatex)   exclPatterns.append(latexOutput);
+  if (generateRtf)     exclPatterns.append(rtfOutput);
+  if (generateMan)     exclPatterns.append(manOutput);
 
-
-  searchInputFiles(g_inputFiles);
+  searchInputFiles();
 
   // Notice: the order of the function calls below is very important!
   
@@ -10238,8 +10792,10 @@ void parseInput()
     addSTLClasses(rootNav);
   }
 
+  g_s.begin("Parsing files\n");
   parseFiles(root,rootNav);
   g_storage->close();
+  g_s.end();
 
   // we are done with input scanning now, so free up the buffers used by flex
   // (can be around 4MB)
@@ -10257,34 +10813,41 @@ void parseInput()
   /**************************************************************************
    *             Gather information                                         * 
    **************************************************************************/
-  
-  msg("Building group list...\n");
+
+  g_s.begin("Building group list...\n");
   buildGroupList(rootNav);
   organizeSubGroups(rootNav);
+  g_s.end();
 
-  msg("Building directory list...\n");
+  g_s.begin("Building directory list...\n");
   buildDirectories();
   findDirDocumentation(rootNav);
+  g_s.end();
 
-  msg("Building namespace list...\n");
+  g_s.begin("Building namespace list...\n");
   buildNamespaceList(rootNav);
   findUsingDirectives(rootNav);
+  g_s.end();
 
-  msg("Building file list...\n");
+  g_s.begin("Building file list...\n");
   buildFileList(rootNav);
+  g_s.end();
   //generateFileTree();
-  
-  msg("Building class list...\n");
+
+  g_s.begin("Building class list...\n");
   buildClassList(rootNav);
+  g_s.end();
 
-  msg("Associating documentation with classes...\n");
+  g_s.begin("Associating documentation with classes...\n");
   buildClassDocList(rootNav);
 
   // build list of using declarations here (global list)
   buildListOfUsingDecls(rootNav);
-  
-  msg("Computing nesting relations for classes...\n");
+  g_s.end();
+
+  g_s.begin("Computing nesting relations for classes...\n");
   resolveClassNestingRelations();
+  g_s.end();
   // 1.8.2-20121111: no longer add nested classes to the group as well
   //distributeClassGroupRelations(); 
 
@@ -10295,97 +10858,124 @@ void parseInput()
   // we don't need the list of using declaration anymore
   g_usingDeclarations.clear();
 
-  msg("Building example list...\n");
+  g_s.begin("Building example list...\n");
   buildExampleList(rootNav);
-  
-  msg("Searching for enumerations...\n");
+  g_s.end();
+
+  g_s.begin("Searching for enumerations...\n");
   findEnums(rootNav);
-  
+  g_s.end();
+
   // Since buildVarList calls isVarWithConstructor
   // and this calls getResolvedClass we need to process
   // typedefs first so the relations between classes via typedefs
   // are properly resolved. See bug 536385 for an example.
-  msg("Searching for documented typedefs...\n");
+  g_s.begin("Searching for documented typedefs...\n");
   buildTypedefList(rootNav);
+  g_s.end();
 
-  msg("Searching for members imported via using declarations...\n");
+  g_s.begin("Searching for members imported via using declarations...\n");
   findUsingDeclImports(rootNav);
   // this should be after buildTypedefList in order to properly import
   // used typedefs
   findUsingDeclarations(rootNav);
+  g_s.end();
 
-  msg("Searching for included using directives...\n");
+  g_s.begin("Searching for included using directives...\n");
   findIncludedUsingDirectives();
+  g_s.end();
 
-  msg("Searching for documented variables...\n");
+  g_s.begin("Searching for documented variables...\n");
   buildVarList(rootNav);
+  g_s.end();
 
-  msg("Building member list...\n"); // using class info only !
+  g_s.begin("Building interface member list...\n");
+  buildInterfaceAndServiceList(rootNav); // UNO IDL
+
+  g_s.begin("Building member list...\n"); // using class info only !
   buildFunctionList(rootNav);
+  g_s.end();
 
-  msg("Searching for friends...\n");
+  g_s.begin("Searching for friends...\n");
   findFriends();
-  
-  msg("Searching for documented defines...\n");
-  findDefineDocumentation(rootNav); 
-  
-  findClassEntries(rootNav);         
-  msg("Computing class inheritance relations...\n");
-  findInheritedTemplateInstances();       
-  msg("Computing class usage relations...\n");
-  findUsedTemplateInstances();       
+  g_s.end();
+
+  g_s.begin("Searching for documented defines...\n");
+  findDefineDocumentation(rootNav);
+  g_s.end();
+
+  g_s.begin("Computing class inheritance relations...\n");
+  findClassEntries(rootNav);
+  findInheritedTemplateInstances();
+  g_s.end();
+
+  g_s.begin("Computing class usage relations...\n");
+  findUsedTemplateInstances();
+  g_s.end();
+
   if (Config_getBool("INLINE_SIMPLE_STRUCTS"))
   {
-    msg("Searching for tag less structs...\n");
+    g_s.begin("Searching for tag less structs...\n");
     findTagLessClasses();
+    g_s.end();
   }
 
-  msg("Flushing cached template relations that have become invalid...\n");
+  g_s.begin("Flushing cached template relations that have become invalid...\n");
   flushCachedTemplateRelations();
-  
-  msg("Creating members for template instances...\n");
+  g_s.end();
+
+  g_s.begin("Creating members for template instances...\n");
   createTemplateInstanceMembers();
+  g_s.end();
 
-  msg("Computing class relations...\n");
-  computeTemplateClassRelations(); 
+  g_s.begin("Computing class relations...\n");
+  computeTemplateClassRelations();
   flushUnresolvedRelations();
   if (Config_getBool("OPTIMIZE_OUTPUT_VHDL"))
   {
     VhdlDocGen::computeVhdlComponentRelations(); 
   }
-  computeClassRelations();        
-  g_classEntries.clear();          
+  computeClassRelations();
+  g_classEntries.clear();
+  g_s.end();
 
-  msg("Add enum values to enums...\n");
+  g_s.begin("Add enum values to enums...\n");
   addEnumValuesToEnums(rootNav);
   findEnumDocumentation(rootNav);
+  g_s.end();
 
-  msg("Searching for member function documentation...\n");
+  g_s.begin("Searching for member function documentation...\n");
   findObjCMethodDefinitions(rootNav);
   findMemberDocumentation(rootNav); // may introduce new members !
 
   transferRelatedFunctionDocumentation();
   transferFunctionDocumentation();
-  
-  msg("Building page list...\n");
+  g_s.end();
+
+  g_s.begin("Building page list...\n");
   buildPageList(rootNav);
+  g_s.end();
 
-  msg("Search for main page...\n");
+  g_s.begin("Search for main page...\n");
   findMainPage(rootNav);
+  g_s.end();
 
-  msg("Computing page relations...\n");
+  g_s.begin("Computing page relations...\n");
   computePageRelations(rootNav);
   checkPageRelations();
+  g_s.end();
 
-  msg("Determining the scope of groups...\n");
+  g_s.begin("Determining the scope of groups...\n");
   findGroupScope(rootNav);
+  g_s.end();
 
-  msg("Sorting lists...\n");
+  g_s.begin("Sorting lists...\n");
   Doxygen::memberNameSDict->sort();
   Doxygen::functionNameSDict->sort();
   Doxygen::hiddenClasses->sort();
   Doxygen::classSDict->sort();
-  
+  g_s.end();
+
   msg("Freeing entry tree\n");
   delete rootNav;
   g_storage->close();
@@ -10394,78 +10984,98 @@ void parseInput()
 
   QDir thisDir;
   thisDir.remove(Doxygen::entryDBFileName);
-  
-  msg("Determining which enums are documented\n");
+
+  g_s.begin("Determining which enums are documented\n");
   findDocumentedEnumValues();
+  g_s.end();
 
-  msg("Computing member relations...\n");
+  g_s.begin("Computing member relations...\n");
   mergeCategories();
   computeMemberRelations();
+  g_s.end();
 
-  msg("Building full member lists recursively...\n");
+  g_s.begin("Building full member lists recursively...\n");
   buildCompleteMemberLists();
-  
-  msg("Adding members to member groups.\n");
+  g_s.end();
+
+  g_s.begin("Adding members to member groups.\n");
   addMembersToMemberGroup();
+  g_s.end();
 
   if (Config_getBool("DISTRIBUTE_GROUP_DOC"))
   {
-    msg("Distributing member group documentation.\n");
+    g_s.begin("Distributing member group documentation.\n");
     distributeMemberGroupDocumentation();
+    g_s.end();
   }
-  
-  msg("Computing member references...\n");
-  computeMemberReferences(); 
+
+  g_s.begin("Computing member references...\n");
+  computeMemberReferences();
+  g_s.end();
 
   if (Config_getBool("INHERIT_DOCS"))
   {
-    msg("Inheriting documentation...\n");
+    g_s.begin("Inheriting documentation...\n");
     inheritDocumentation();
+    g_s.end();
   }
 
   // compute the shortest possible names of all files
   // without losing the uniqueness of the file names.
-  msg("Generating disk names...\n");
+  g_s.begin("Generating disk names...\n");
   Doxygen::inputNameList->generateDiskNames();
-  
-  msg("Adding source references...\n");
+  g_s.end();
+
+  g_s.begin("Adding source references...\n");
   addSourceReferences();
+  g_s.end();
 
-  msg("Adding xrefitems...\n");
+  g_s.begin("Adding xrefitems...\n");
   addListReferences();
   generateXRefPages();
+  g_s.end();
 
-  msg("Sorting member lists...\n");
+  g_s.begin("Sorting member lists...\n");
   sortMemberLists();
+  g_s.end();
 
   if (Config_getBool("DIRECTORY_GRAPH"))
   {
-    msg("Computing dependencies between directories...\n");
+    g_s.begin("Computing dependencies between directories...\n");
     computeDirDependencies();
+    g_s.end();
   }
 
-  //msg("Resolving citations...\n");
+  //g_s.begin("Resolving citations...\n");
   //Doxygen::citeDict->resolve();
 
-  msg("Generating citations page...\n");
+  g_s.begin("Generating citations page...\n");
   Doxygen::citeDict->generatePage();
+  g_s.end();
 
-  msg("Counting data structures...\n");
+  g_s.begin("Counting data structures...\n");
   countDataStructures();
-  msg("Resolving user defined references...\n");
+  g_s.end();
+
+  g_s.begin("Resolving user defined references...\n");
   resolveUserReferences();
+  g_s.end();
 
-  msg("Finding anchors and sections in the documentation...\n");
+  g_s.begin("Finding anchors and sections in the documentation...\n");
   findSectionsInDocumentation();
+  g_s.end();
 
+  g_s.begin("Transferring function references...\n");
   transferFunctionReferences();
+  g_s.end();
 
-  msg("Combining using relations...\n");
+  g_s.begin("Combining using relations...\n");
   combineUsingRelations();
+  g_s.end();
 
-  msg("Adding members to index pages...\n");
+  g_s.begin("Adding members to index pages...\n");
   addMembersToIndex();
+  g_s.end();
 
   if (Config_getBool("OPTIMIZE_OUTPUT_VHDL") && 
       Config_getBool("HAVE_DOT") &&
@@ -10519,13 +11129,16 @@ void generateOutput()
     // copy static stuff
     copyStyleSheet();
     copyLogo();
-    copyExtraFiles();
+    copyExtraFiles("HTML_EXTRA_FILES","HTML_OUTPUT");
     FTVHelp::generateTreeViewImages();
   }
   if (generateLatex) 
   {
     g_outputList->add(new LatexGenerator);
     LatexGenerator::init();
+
+    // copy static stuff
+    copyExtraFiles("LATEX_EXTRA_FILES","LATEX_OUTPUT");
   }
   if (generateMan)
   {
@@ -10537,15 +11150,14 @@ void generateOutput()
     g_outputList->add(new RTFGenerator);
     RTFGenerator::init();
   }
-
   if (Config_getBool("USE_HTAGS"))
   {
     Htags::useHtags = TRUE;
     QCString htmldir = Config_getString("HTML_OUTPUT");
     if (!Htags::execute(htmldir))
-       err("error: USE_HTAGS is YES but htags(1) failed. \n");
+       err("USE_HTAGS is YES but htags(1) failed. \n");
     if (!Htags::loadFilemap(htmldir))
-       err("error: htags(1) ended normally but failed to load the filemap. \n");
+       err("htags(1) ended normally but failed to load the filemap. \n");
   }
   
   /**************************************************************************
@@ -10559,7 +11171,7 @@ void generateOutput()
     tag=new QFile(generateTagFile);
     if (!tag->open(IO_WriteOnly))
     {
-      err("error: cannot open tag file %s for writing\n",
+      err("cannot open tag file %s for writing\n",
           generateTagFile.data()
          );
       cleanUpDoxygen();
@@ -10574,22 +11186,11 @@ void generateOutput()
   if (generateLatex) writeDoxFont(Config_getString("LATEX_OUTPUT"));
   if (generateRtf)   writeDoxFont(Config_getString("RTF_OUTPUT"));
 
-  msg("Generating style sheet...\n");
+  g_s.begin("Generating style sheet...\n");
   //printf("writing style info\n");
-  QCString genString = 
-        theTranslator->trGeneratedAt(dateToString(TRUE),Config_getString("PROJECT_NAME"));
   g_outputList->writeStyleInfo(0); // write first part
-  g_outputList->disableAllBut(OutputGenerator::Latex);
-  g_outputList->parseText(genString);
-  g_outputList->writeStyleInfo(1); // write second part
-  //parseText(*g_outputList,theTranslator->trWrittenBy());
-  g_outputList->writeStyleInfo(2); // write third part
-  g_outputList->parseText(genString);
-  g_outputList->writeStyleInfo(3); // write fourth part
-  //parseText(*g_outputList,theTranslator->trWrittenBy());
-  g_outputList->writeStyleInfo(4); // write last part
-  g_outputList->enableAll();
-  
+  g_s.end();
+
   static bool searchEngine      = Config_getBool("SEARCHENGINE");
   static bool serverBasedSearch = Config_getBool("SERVER_BASED_SEARCH");
 
@@ -10598,12 +11199,12 @@ void generateOutput()
   // what categories we find in this function.
   if (generateHtml && searchEngine)
   {
-    msg("Generating search indices...\n");
+    g_s.begin("Generating search indices...\n");
     QCString searchDirName = Config_getString("HTML_OUTPUT")+"/search";
     QDir searchDir(searchDirName);
     if (!searchDir.exists() && !searchDir.mkdir(searchDirName))
     {
-      err("error: Could not create search results directory '%s' $PWD='%s'\n",
+      err("Could not create search results directory '%s' $PWD='%s'\n",
           searchDirName.data(),QDir::currentDirPath().data());
       exit(1);
     }
@@ -10612,46 +11213,57 @@ void generateOutput()
     {
       writeJavascriptSearchIndex();
     }
+    g_s.end();
   }
 
-  msg("Generating example documentation...\n");
+  g_s.begin("Generating example documentation...\n");
   generateExampleDocs();
+  g_s.end();
 
-  msg("Generating file sources...\n");
   if (!Htags::useHtags)
   {
+    g_s.begin("Generating file sources...\n");
     generateFileSources();
+    g_s.end();
   }
 
-  msg("Generating file documentation...\n");
+  g_s.begin("Generating file documentation...\n");
   generateFileDocs();
-  
-  msg("Generating page documentation...\n");
+  g_s.end();
+
+  g_s.begin("Generating page documentation...\n");
   generatePageDocs();
-  
-  msg("Generating group documentation...\n");
+  g_s.end();
+
+  g_s.begin("Generating group documentation...\n");
   generateGroupDocs();
+  g_s.end();
 
-  msg("Generating class documentation...\n");
+  g_s.begin("Generating class documentation...\n");
   generateClassDocs();
-  
-  msg("Generating namespace index...\n");
+  g_s.end();
+
+  g_s.begin("Generating namespace index...\n");
   generateNamespaceDocs();
-  
+  g_s.end();
+
   if (Config_getBool("GENERATE_LEGEND"))
   {
-    msg("Generating graph info page...\n");
+    g_s.begin("Generating graph info page...\n");
     writeGraphInfo(*g_outputList);
+    g_s.end();
   }
 
-  msg("Generating directory documentation...\n");
+  g_s.begin("Generating directory documentation...\n");
   generateDirDocs(*g_outputList);
+  g_s.end();
 
   if (Doxygen::formulaList->count()>0 && generateHtml
       && !Config_getBool("USE_MATHJAX"))
   {
-    msg("Generating bitmaps for formulas in HTML...\n");
+    g_s.begin("Generating bitmaps for formulas in HTML...\n");
     Doxygen::formulaList->generateBitmaps(Config_getString("HTML_OUTPUT"));
+    g_s.end();
   }
   
   writeMainPageTagFileData();
@@ -10661,8 +11273,9 @@ void generateOutput()
     writeIndexHierarchy(*g_outputList);
   }
 
-  msg("finalizing index lists...\n");
+  g_s.begin("finalizing index lists...\n");
   Doxygen::indexList->finalize();
+  g_s.end();
 
   if (!generateTagFile.isEmpty())
   {
@@ -10682,24 +11295,41 @@ void generateOutput()
 
   if (Config_getBool("GENERATE_XML"))
   {
-    msg("Generating XML output...\n");
+    g_s.begin("Generating XML output...\n");
     Doxygen::generatingXmlOutput=TRUE;
     generateXML();
     Doxygen::generatingXmlOutput=FALSE;
+    g_s.end();
+  }
+  if (USE_SQLITE3)
+  {
+    g_s.begin("Generating SQLITE3 output...\n");
+    generateSqlite3();
+    g_s.end();
+  }
+
+  if (Config_getBool("GENERATE_DOCBOOK"))
+  {
+    g_s.begin("Generating Docbook output...\n");
+    generateDocbook();
+    g_s.end();
   }
+
   if (Config_getBool("GENERATE_AUTOGEN_DEF"))
   {
-    msg("Generating AutoGen DEF output...\n");
+    g_s.begin("Generating AutoGen DEF output...\n");
     generateDEF();
+    g_s.end();
   }
   if (Config_getBool("GENERATE_PERLMOD"))
   {
-    msg("Generating Perl module output...\n");
+    g_s.begin("Generating Perl module output...\n");
     generatePerlMod();
+    g_s.end();
   }
   if (generateHtml && searchEngine && serverBasedSearch)
   {
-    msg("Generating search index\n");
+    g_s.begin("Generating search index\n");
     if (Doxygen::searchIndex->kind()==SearchIndexIntf::Internal) // write own search index
     {
       HtmlGenerator::writeSearchPage();
@@ -10719,42 +11349,47 @@ void generateOutput()
       }
       Doxygen::searchIndex->write(searchDataFile);
     }
+    g_s.end();
   }
 
   if (generateRtf)
   {
-    msg("Combining RTF output...\n");
+    g_s.begin("Combining RTF output...\n");
     if (!RTFGenerator::preProcessFileInplace(Config_getString("RTF_OUTPUT"),"refman.rtf"))
     {
       err("An error occurred during post-processing the RTF files!\n");
     }
+    g_s.end();
   }
 
   if (Config_getBool("HAVE_DOT"))
   {
+    g_s.begin("Running dot...\n");
     DotManager::instance()->run();
+    g_s.end();
   }
 
   if (generateHtml &&
       Config_getBool("GENERATE_HTMLHELP") && 
       !Config_getString("HHC_LOCATION").isEmpty())
   {
-    msg("Running html help compiler...\n");
+    g_s.begin("Running html help compiler...\n");
     QString oldDir = QDir::currentDirPath();
     QDir::setCurrent(Config_getString("HTML_OUTPUT"));
     portable_sysTimerStart();
     if (portable_system(Config_getString("HHC_LOCATION"), "index.hhp", FALSE))
     {
-      err("error: failed to run html help compiler on index.hhp\n");
+      err("failed to run html help compiler on index.hhp\n");
     }
     portable_sysTimerStop();
     QDir::setCurrent(oldDir);
+    g_s.end();
   }
   if ( generateHtml &&
        Config_getBool("GENERATE_QHP") && 
       !Config_getString("QHG_LOCATION").isEmpty())
   {
-    msg("Running qhelpgenerator...\n");
+    g_s.begin("Running qhelpgenerator...\n");
     QCString const qhpFileName = Qhp::getQhpFileName();
     QCString const qchFileName = getQchFileName();
 
@@ -10764,26 +11399,14 @@ void generateOutput()
     portable_sysTimerStart();
     if (portable_system(Config_getString("QHG_LOCATION"), args.data(), FALSE))
     {
-      err("error: failed to run qhelpgenerator on index.qhp\n");
+      err("failed to run qhelpgenerator on index.qhp\n");
     }
     portable_sysTimerStop();
     QDir::setCurrent(oldDir);
+    g_s.end();
   }
 
   int cacheParam;
-  if (Doxygen::symbolCache)
-  {
-    msg("symbol cache used %d/%d hits=%d misses=%d\n",
-        Doxygen::symbolCache->count(),
-        Doxygen::symbolCache->size(),
-        Doxygen::symbolCache->hits(),
-        Doxygen::symbolCache->misses());
-    cacheParam = computeIdealCacheParam(Doxygen::symbolCache->misses());
-    if (cacheParam>Config_getInt("SYMBOL_CACHE_SIZE"))
-    {
-      msg("Note: based on cache misses the ideal setting for SYMBOL_CACHE_SIZE is %d at the cost of higher memory usage.\n",cacheParam);
-    }
-  }
   msg("lookup cache used %d/%d hits=%d misses=%d\n",
       Doxygen::lookupCache->count(),
       Doxygen::lookupCache->size(),
@@ -10801,6 +11424,7 @@ void generateOutput()
          ((double)Doxygen::runningTime.elapsed())/1000.0,
          portable_getSysElapsedTime()
         );
+    g_s.print();
   }
   else
   {
@@ -10819,8 +11443,8 @@ void generateOutput()
   thisDir.remove(Doxygen::objDBFileName);
   Config::deleteInstance();
   QTextCodec::deleteAllCodecs();
-  delete Doxygen::symbolCache;
   delete Doxygen::symbolMap;
+  delete Doxygen::clangUsrMap;
   delete Doxygen::symbolStorage;
   g_successfulRun=TRUE;
 }
index 544cc71..c314142 100644 (file)
@@ -1,7 +1,7 @@
 /* The standard CSS for doxygen $doxygenversion */
 
 body, table, div, p, dl {
-       font: 400 14px/19px Roboto,sans-serif;
+       font: 400 14px/22px Roboto,sans-serif;
 }
 
 /* @group Heading Levels */
@@ -11,6 +11,7 @@ h1.groupheader {
 }
 
 .title {
+       font: 400 14px/28px Roboto,sans-serif;
        font-size: 150%;
        font-weight: bold;
        margin: 10px 2px;
@@ -168,8 +169,8 @@ pre.fragment {
 }
 
 div.fragment {
-        padding: 4px;
-        margin: 4px;
+        padding: 0px;
+        margin: 0px;
        background-color: ##FC;
        border: 1px solid ##CC;
 }
@@ -687,6 +688,7 @@ div.directory {
 .directory td.entry {
         white-space: nowrap;
         padding-right: 6px;
+       padding-top: 3px;
 }
 
 .directory td.entry a {
@@ -787,7 +789,7 @@ table.fieldtable {
 }
 
 .fieldtable td.fieldname {
-        padding-top: 5px;
+        padding-top: 3px;
 }
 
 .fieldtable td.fielddoc {
@@ -796,7 +798,7 @@ table.fieldtable {
 }
 
 .fieldtable td.fielddoc p:first-child {
-        margin-top: 2px;
+        margin-top: 0px;
 }       
         
 .fieldtable td.fielddoc p:last-child {
index 9ead4c1..4edf395 100644 (file)
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -103,6 +103,7 @@ class Doxygen
     static bool                      insideMainPage;
     static FileNameDict             *includeNameDict;
     static FileNameDict             *exampleNameDict;
+    static QDict<void>               inputPaths;
     static FileNameDict             *inputNameDict;
     static FileNameList             *inputNameList;
     static FileNameDict             *imageNameDict;
@@ -130,6 +131,7 @@ class Doxygen
     static QTime                     runningTime;
     static SearchIndexIntf          *searchIndex;
     static QDict<DefinitionIntf>    *symbolMap;
+    static QDict<Definition>        *clangUsrMap;
     static bool                      outputToWizard;
     static QDict<int>               *htmlDirMap;
     static QCache<LookupInfo>       *lookupCache;
@@ -137,7 +139,6 @@ class Doxygen
     static SDict<DirRelation>        dirRelations;
     static ParserManager            *parserManager;
     static bool                      suppressDocWarnings;
-    static ObjCache                 *symbolCache;
     static Store                    *symbolStorage;
     static QCString                  objDBFileName;
     static QCString                  entryDBFileName;
@@ -161,6 +162,7 @@ void parseInput();
 void generateOutput();
 void readAliases();
 void readFormulaRepository();
+void cleanUpDoxygen();
 int readFileOrDirectory(const char *s,
                         FileNameList *fnList,
                         FileNameDict *fnDict,
@@ -171,7 +173,8 @@ int readFileOrDirectory(const char *s,
                         StringDict *resultDict,
                         bool recursive,
                         bool errorIfNotExist=TRUE,
-                        QDict<void> *killDict = 0
+                        QDict<void> *killDict = 0,
+                        QDict<void> *paths = 0
                        );
 int readDir(QFileInfo *fi,
             FileNameList *fnList,
index 736c6c6..7941149 100644 (file)
@@ -6,7 +6,7 @@ Introduction
 
 This page provides a high-level overview of the internals of doxygen, with
 links to the relevant parts of the code. This document is intended for
-developers who want to work on doxygen. Users of doxygen are refered to the
+developers who want to work on doxygen. Users of doxygen are referred to the
 [User Manual](http://www.doxygen.org/manual.html).
 
 The generic starting point of the application is of cource the main() function.
@@ -92,7 +92,7 @@ For doxygen specific concepts the following subclasses are available
 - GroupDef: for storing grouping related data
 - PageDef: for storing page related data
 
-Finally the data for members of classes, namespaces, and files is stored is
+Finally the data for members of classes, namespaces, and files is stored in
 the subclass MemberDef.
 
 Producing output
index 42ffaa0..15af1f5 100644 (file)
@@ -1,7 +1,7 @@
 #
 # 
 #
-# Copyright (C) 1997-2012 by Dimitri van Heesch.
+# Copyright (C) 1997-2013 by Dimitri van Heesch.
 #
 # Permission to use, copy, modify, and distribute this software and its
 # documentation under the terms of the GNU General Public License is hereby 
@@ -18,15 +18,15 @@ TEMPLATE     =      app.t
 CONFIG       = console warn_on $extraopts
 HEADERS      = doxygen.h 
 SOURCES      = main.cpp 
-unix:LIBS                  += -L../lib -ldoxygen -ldoxycfg -lqtools -lmd5 -lpthread
+unix:LIBS                  += -L../lib -ldoxygen -ldoxycfg -lqtools -lmd5 -lpthread %%SQLITE3_LIBS%% %%LIBCLANG_LIBS%%
 win32:INCLUDEPATH          += .
-win32-mingw:LIBS           += -L../lib -ldoxygen -ldoxycfg -lqtools -lmd5 -lpthread
+win32-mingw:LIBS           += -L../lib -ldoxygen -ldoxycfg -lqtools -lmd5 -lpthread %%SQLITE3_LIBS%% %%LIBCLANG_LIBS%%
 win32-msvc:LIBS            += qtools.lib md5.lib doxygen.lib doxycfg.lib shell32.lib iconv.lib
 win32-msvc:TMAKE_LFLAGS    += /LIBPATH:..\lib
 win32-borland:LIBS         += qtools.lib md5.lib doxygen.lib doxycfg.lib shell32.lib iconv.lib
 win32-borland:TMAKE_LFLAGS += -L..\lib -L$(BCB)\lib\psdk
 win32:TMAKE_CXXFLAGS       += -DQT_NODLL
-win32-g++:LIBS             = -L../lib -ldoxygen -ldoxycfg -lqtools -lmd5 -liconv -lpthread
+win32-g++:LIBS             = -L../lib -ldoxygen -ldoxycfg -lqtools -lmd5 -liconv -lpthread %%SQLITE3_LIBS%% %%LIBCLANG_LIBS%% -Wl,--as-needed -lole32
 win32-g++:TMAKE_CXXFLAGS   += -fno-exceptions -fno-rtti
 INCLUDEPATH                += ../qtools ../libmd5 .
 DESTDIR                    =  ../bin
diff --git a/src/doxygen.sty b/src/doxygen.sty
new file mode 100644 (file)
index 0000000..199abf8
--- /dev/null
@@ -0,0 +1,464 @@
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{doxygen}
+
+% Packages used by this style file
+\RequirePackage{alltt}
+\RequirePackage{array}
+\RequirePackage{calc}
+\RequirePackage{float}
+\RequirePackage{ifthen}
+\RequirePackage{verbatim}
+\RequirePackage[table]{xcolor}
+\RequirePackage{xtab}
+
+%---------- Internal commands used in this style file ----------------
+
+\newcommand{\ensurespace}[1]{%
+  \begingroup%
+    \setlength{\dimen@}{#1}%
+    \vskip\z@\@plus\dimen@%
+    \penalty -100\vskip\z@\@plus -\dimen@%
+    \vskip\dimen@%
+    \penalty 9999%
+    \vskip -\dimen@%
+    \vskip\z@skip% hide the previous |\vskip| from |\addvspace|
+  \endgroup%
+}
+
+\newcommand{\DoxyLabelFont}{}
+\newcommand{\entrylabel}[1]{%
+  {%
+    \parbox[b]{\labelwidth-4pt}{%
+      \makebox[0pt][l]{\DoxyLabelFont#1}%
+      \vspace{1.5\baselineskip}%
+    }%
+  }%
+}
+
+\newenvironment{DoxyDesc}[1]{%
+  \ensurespace{4\baselineskip}%
+  \begin{list}{}{%
+    \settowidth{\labelwidth}{20pt}%
+    \setlength{\parsep}{0pt}%
+    \setlength{\itemsep}{0pt}%
+    \setlength{\leftmargin}{\labelwidth+\labelsep}%
+    \renewcommand{\makelabel}{\entrylabel}%
+  }%
+  \item[#1]%
+}{%
+  \end{list}%
+}
+
+\newsavebox{\xrefbox}
+\newlength{\xreflength}
+\newcommand{\xreflabel}[1]{%
+  \sbox{\xrefbox}{#1}%
+  \setlength{\xreflength}{\wd\xrefbox}%
+  \ifthenelse{\xreflength>\labelwidth}{%
+    \begin{minipage}{\textwidth}%
+      \setlength{\parindent}{0pt}%
+      \hangindent=15pt\bfseries #1\vspace{1.2\itemsep}%
+    \end{minipage}%
+  }{%
+   \parbox[b]{\labelwidth}{\makebox[0pt][l]{\textbf{#1}}}%
+  }%
+}
+
+%---------- Commands used by doxygen LaTeX output generator ----------
+
+% Used by <pre> ... </pre>
+\newenvironment{DoxyPre}{%
+  \small%
+  \begin{alltt}%
+}{%
+  \end{alltt}%
+  \normalsize%
+}
+
+% Used by @code ... @endcode
+\newenvironment{DoxyCode}{%
+  \par%
+  \scriptsize%
+  \begin{alltt}%
+}{%
+  \end{alltt}%
+  \normalsize%
+}
+
+% Used by @example, @include, @includelineno and @dontinclude
+\newenvironment{DoxyCodeInclude}{%
+  \DoxyCode%
+}{%
+  \endDoxyCode%
+}
+
+% Used by @verbatim ... @endverbatim
+\newenvironment{DoxyVerb}{%
+  \footnotesize%
+  \verbatim%
+}{%
+  \endverbatim%
+  \normalsize%
+}
+
+% Used by @verbinclude
+\newenvironment{DoxyVerbInclude}{%
+  \DoxyVerb%
+}{%
+  \endDoxyVerb%
+}
+
+% Used by numbered lists (using '-#' or <ol> ... </ol>)
+\newenvironment{DoxyEnumerate}{%
+  \enumerate%
+}{%
+  \endenumerate%
+}
+
+% Used by bullet lists (using '-', @li, @arg, or <ul> ... </ul>)
+\newenvironment{DoxyItemize}{%
+  \itemize%
+}{%
+  \enditemize%
+}
+
+% Used by description lists (using <dl> ... </dl>)
+\newenvironment{DoxyDescription}{%
+  \description%
+}{%
+  \enddescription%
+}
+
+% Used by @image, @dotfile, @dot ... @enddot, and @msc ... @endmsc
+% (only if caption is specified)
+\newenvironment{DoxyImage}{%
+  \begin{figure}[H]%
+    \begin{center}%
+}{%
+    \end{center}%
+  \end{figure}%
+}
+
+% Used by @image, @dotfile, @dot ... @enddot, and @msc ... @endmsc
+% (only if no caption is specified)
+\newenvironment{DoxyImageNoCaption}{%
+}{%
+}
+
+% Used by @attention
+\newenvironment{DoxyAttention}[1]{%
+  \begin{DoxyDesc}{#1}%
+}{%
+  \end{DoxyDesc}%
+}
+
+% Used by @author and @authors
+\newenvironment{DoxyAuthor}[1]{%
+  \begin{DoxyDesc}{#1}%
+}{%
+  \end{DoxyDesc}%
+}
+
+% Used by @date
+\newenvironment{DoxyDate}[1]{%
+  \begin{DoxyDesc}{#1}%
+}{%
+  \end{DoxyDesc}%
+}
+
+% Used by @invariant
+\newenvironment{DoxyInvariant}[1]{%
+  \begin{DoxyDesc}{#1}%
+}{%
+  \end{DoxyDesc}%
+}
+
+% Used by @note
+\newenvironment{DoxyNote}[1]{%
+  \begin{DoxyDesc}{#1}%
+}{%
+  \end{DoxyDesc}%
+}
+
+% Used by @post
+\newenvironment{DoxyPostcond}[1]{%
+  \begin{DoxyDesc}{#1}%
+}{%
+  \end{DoxyDesc}%
+}
+
+% Used by @pre
+\newenvironment{DoxyPrecond}[1]{%
+  \begin{DoxyDesc}{#1}%
+}{%
+  \end{DoxyDesc}%
+}
+
+% Used by @copyright
+\newenvironment{DoxyCopyright}[1]{%
+  \begin{DoxyDesc}{#1}%
+}{%
+  \end{DoxyDesc}%
+}
+
+% Used by @remark
+\newenvironment{DoxyRemark}[1]{%
+  \begin{DoxyDesc}{#1}%
+}{%
+  \end{DoxyDesc}%
+}
+
+% Used by @return and @returns
+\newenvironment{DoxyReturn}[1]{%
+  \begin{DoxyDesc}{#1}%
+}{%
+  \end{DoxyDesc}%
+}
+
+% Used by @since
+\newenvironment{DoxySince}[1]{%
+  \begin{DoxyDesc}{#1}%
+}{%
+  \end{DoxyDesc}%
+}
+
+% Used by @see
+\newenvironment{DoxySeeAlso}[1]{%
+  \begin{DoxyDesc}{#1}%
+}{%
+  \end{DoxyDesc}%
+}
+
+% Used by @version
+\newenvironment{DoxyVersion}[1]{%
+  \begin{DoxyDesc}{#1}%
+}{%
+  \end{DoxyDesc}%
+}
+
+% Used by @warning
+\newenvironment{DoxyWarning}[1]{%
+  \begin{DoxyDesc}{#1}%
+}{%
+  \end{DoxyDesc}%
+}
+
+% Used by @internal
+\newenvironment{DoxyInternal}[1]{%
+  \paragraph*{#1}%
+}{%
+}
+
+% Used by @par and @paragraph
+\newenvironment{DoxyParagraph}[1]{%
+  \begin{list}{}{%
+    \settowidth{\labelwidth}{40pt}%
+    \setlength{\leftmargin}{\labelwidth}%
+    \setlength{\parsep}{0pt}%
+    \setlength{\itemsep}{-4pt}%
+    \renewcommand{\makelabel}{\entrylabel}%
+  }%
+  \item[#1]%
+}{%
+  \end{list}%
+}
+
+% Used by parameter lists
+\newenvironment{DoxyParams}[2][]{%
+    \par%
+    \tabletail{\hline}%
+    \tablelasttail{\hline}%
+    \tablefirsthead{}%
+    \tablehead{}%
+    \ifthenelse{\equal{#1}{}}%
+    {\tablefirsthead{\multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #2}\\[1ex]}%
+     \begin{xtabular}{|>{\raggedleft\hspace{0pt}}p{0.15\textwidth}|%
+                        p{0.805\textwidth}|}}%
+    {\ifthenelse{\equal{#1}{1}}%
+      {\tablefirsthead{\multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #2}\\[1ex]}%
+       \begin{xtabular}{|>{\centering}p{0.10\textwidth}|%
+                         >{\raggedleft\hspace{0pt}}p{0.15\textwidth}|%
+                         p{0.678\textwidth}|}}%
+      {\tablefirsthead{\multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #2}\\[1ex]}%
+       \begin{xtabular}{|>{\centering}p{0.10\textwidth}|%
+                         >{\centering\hspace{0pt}}p{0.15\textwidth}|%
+                         >{\raggedleft\hspace{0pt}}p{0.15\textwidth}|%
+                         p{0.501\textwidth}|}}%
+    }\hline%
+}{%
+    \end{xtabular}%
+    \tablefirsthead{}%
+    \vspace{6pt}%
+}
+
+% Used for fields of simple structs
+\newenvironment{DoxyFields}[1]{%
+    \par%
+    \tabletail{\hline}%
+    \tablelasttail{\hline}%
+    \tablehead{}%
+    \tablefirsthead{\multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]}%
+    \begin{xtabular}{|>{\raggedleft\hspace{0pt}}p{0.15\textwidth}|%
+                         p{0.15\textwidth}|%
+                         p{0.63\textwidth}|}%
+    \hline%
+}{%
+    \end{xtabular}%
+    \tablefirsthead{}%
+    \vspace{6pt}%
+}
+
+% Used for parameters within a detailed function description
+\newenvironment{DoxyParamCaption}{%
+  \renewcommand{\item}[2][]{##1 {\em ##2}}%
+}{%
+}
+
+% Used by return value lists
+\newenvironment{DoxyRetVals}[1]{%
+    \par%
+    \tabletail{\hline}%
+    \tablelasttail{\hline}%
+    \tablehead{}%
+    \tablefirsthead{\multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]}%
+    \begin{xtabular}{|>{\raggedleft\hspace{0pt}}p{0.25\textwidth}|%
+                          p{0.705\textwidth}|}%
+    \hline%
+}{%
+    \end{xtabular}%
+    \tablefirsthead{}%
+    \vspace{6pt}%
+}
+
+% Used by exception lists
+\newenvironment{DoxyExceptions}[1]{%
+    \par%
+    \tabletail{\hline}%
+    \tablelasttail{\hline}%
+    \tablehead{}%
+    \tablefirsthead{\multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]}%
+    \begin{xtabular}{|>{\raggedleft\hspace{0pt}}p{0.25\textwidth}|%
+                          p{0.705\textwidth}|}%
+    \hline%
+}{%
+    \end{xtabular}%
+    \tablefirsthead{}%
+    \vspace{6pt}%
+}
+
+% Used by template parameter lists
+\newenvironment{DoxyTemplParams}[1]{%
+    \par%
+    \tabletail{\hline}%
+    \tablelasttail{\hline}%
+    \tablehead{}%
+    \tablefirsthead{\multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]}%
+    \begin{xtabular}{|>{\raggedleft\hspace{0pt}}p{0.25\textwidth}|%
+                          p{0.705\textwidth}|}%
+    \hline%
+}{%
+    \end{xtabular}%
+    \tablefirsthead{}%
+    \vspace{6pt}%
+}
+
+% Used for member lists
+\newenvironment{DoxyCompactItemize}{%
+  \begin{itemize}%
+    \setlength{\itemsep}{-3pt}%
+    \setlength{\parsep}{0pt}%
+    \setlength{\topsep}{0pt}%
+    \setlength{\partopsep}{0pt}%
+}{%
+  \end{itemize}%
+}
+
+% Used for member descriptions
+\newenvironment{DoxyCompactList}{%
+  \begin{list}{}{%
+    \setlength{\leftmargin}{0.5cm}%
+    \setlength{\itemsep}{0pt}%
+    \setlength{\parsep}{0pt}%
+    \setlength{\topsep}{0pt}%
+    \renewcommand{\makelabel}{\hfill}%
+  }%
+}{%
+  \end{list}%
+}
+
+% Used for reference lists (@bug, @deprecated, @todo, etc.)
+\newenvironment{DoxyRefList}{%
+  \begin{list}{}{%
+    \setlength{\labelwidth}{10pt}%
+    \setlength{\leftmargin}{\labelwidth}%
+    \addtolength{\leftmargin}{\labelsep}%
+    \renewcommand{\makelabel}{\xreflabel}%
+  }%
+}{%
+  \end{list}%
+}
+
+% Used by @bug, @deprecated, @todo, etc.
+\newenvironment{DoxyRefDesc}[1]{%
+  \begin{list}{}{%
+    \renewcommand\makelabel[1]{\textbf{##1}}%
+    \settowidth\labelwidth{\makelabel{#1}}%
+    \setlength\leftmargin{\labelwidth+\labelsep}%
+  }%
+}{%
+  \end{list}%
+}
+
+% Used by parameter lists and simple sections
+\newenvironment{Desc}
+{\begin{list}{}{%
+    \settowidth{\labelwidth}{40pt}%
+    \setlength{\leftmargin}{\labelwidth}%
+    \setlength{\parsep}{0pt}%
+    \setlength{\itemsep}{-4pt}%
+    \renewcommand{\makelabel}{\entrylabel}%
+  }
+}{%
+  \end{list}%
+}
+
+% Used by tables
+\newcommand{\PBS}[1]{\let\temp=\\#1\let\\=\temp}%
+\newlength{\tmplength}%
+\newenvironment{TabularC}[1]%
+{%
+\setlength{\tmplength}%
+     {\linewidth/(#1)-\tabcolsep*2-\arrayrulewidth*(#1+1)/(#1)}%
+      \par\begin{xtabular*}{\linewidth}%
+             {*{#1}{|>{\PBS\raggedright\hspace{0pt}}p{\the\tmplength}}|}%
+}%
+{\end{xtabular*}\par}%
+
+% Used for member group headers
+\newenvironment{Indent}{%
+  \begin{list}{}{%
+    \setlength{\leftmargin}{0.5cm}%
+  }%
+  \item[]\ignorespaces%
+}{%
+  \unskip%
+  \end{list}%
+}
+
+% Used when hyperlinks are turned off
+\newcommand{\doxyref}[3]{%
+  \textbf{#1} (\textnormal{#2}\,\pageref{#3})%
+}
+
+% Used for syntax highlighting
+\definecolor{comment}{rgb}{0.5,0.0,0.0}
+\definecolor{keyword}{rgb}{0.0,0.5,0.0}
+\definecolor{keywordtype}{rgb}{0.38,0.25,0.125}
+\definecolor{keywordflow}{rgb}{0.88,0.5,0.0}
+\definecolor{preprocessor}{rgb}{0.5,0.38,0.125}
+\definecolor{stringliteral}{rgb}{0.0,0.125,0.25}
+\definecolor{charliteral}{rgb}{0.0,0.5,0.5}
+\definecolor{vhdldigit}{rgb}{1.0,0.0,1.0}
+\definecolor{vhdlkeyword}{rgb}{0.43,0.0,0.43}
+\definecolor{vhdllogic}{rgb}{1.0,0.0,0.0}
+\definecolor{vhdlchar}{rgb}{0.0,0.0,0.0}
index 2b3f668..d5348fe 100644 (file)
@@ -1,7 +1,7 @@
 "/* The standard CSS for doxygen $doxygenversion */\n"
 "\n"
 "body, table, div, p, dl {\n"
-"      font: 400 14px/19px Roboto,sans-serif;\n"
+"      font: 400 14px/22px Roboto,sans-serif;\n"
 "}\n"
 "\n"
 "/* @group Heading Levels */\n"
@@ -11,6 +11,7 @@
 "}\n"
 "\n"
 ".title {\n"
+"      font: 400 14px/28px Roboto,sans-serif;\n"
 "      font-size: 150%;\n"
 "      font-weight: bold;\n"
 "      margin: 10px 2px;\n"
 "}\n"
 "\n"
 "div.fragment {\n"
-"        padding: 4px;\n"
-"        margin: 4px;\n"
+"        padding: 0px;\n"
+"        margin: 0px;\n"
 "      background-color: ##FC;\n"
 "      border: 1px solid ##CC;\n"
 "}\n"
 ".directory td.entry {\n"
 "        white-space: nowrap;\n"
 "        padding-right: 6px;\n"
+"      padding-top: 3px;\n"
 "}\n"
 "\n"
 ".directory td.entry a {\n"
 "}\n"
 "\n"
 ".fieldtable td.fieldname {\n"
-"        padding-top: 5px;\n"
+"        padding-top: 3px;\n"
 "}\n"
 "\n"
 ".fieldtable td.fielddoc {\n"
 "}\n"
 "\n"
 ".fieldtable td.fielddoc p:first-child {\n"
-"        margin-top: 2px;\n"
+"        margin-top: 0px;\n"
 "}       \n"
 "        \n"
 ".fieldtable td.fielddoc p:last-child {\n"
diff --git a/src/doxygen_sty.h b/src/doxygen_sty.h
new file mode 100644 (file)
index 0000000..fedbd17
--- /dev/null
@@ -0,0 +1,464 @@
+"\\NeedsTeXFormat{LaTeX2e}\n"
+"\\ProvidesPackage{doxygen}\n"
+"\n"
+"% Packages used by this style file\n"
+"\\RequirePackage{alltt}\n"
+"\\RequirePackage{array}\n"
+"\\RequirePackage{calc}\n"
+"\\RequirePackage{float}\n"
+"\\RequirePackage{ifthen}\n"
+"\\RequirePackage{verbatim}\n"
+"\\RequirePackage[table]{xcolor}\n"
+"\\RequirePackage{xtab}\n"
+"\n"
+"%---------- Internal commands used in this style file ----------------\n"
+"\n"
+"\\newcommand{\\ensurespace}[1]{%\n"
+"  \\begingroup%\n"
+"    \\setlength{\\dimen@}{#1}%\n"
+"    \\vskip\\z@\\@plus\\dimen@%\n"
+"    \\penalty -100\\vskip\\z@\\@plus -\\dimen@%\n"
+"    \\vskip\\dimen@%\n"
+"    \\penalty 9999%\n"
+"    \\vskip -\\dimen@%\n"
+"    \\vskip\\z@skip% hide the previous |\\vskip| from |\\addvspace|\n"
+"  \\endgroup%\n"
+"}\n"
+"\n"
+"\\newcommand{\\DoxyLabelFont}{}\n"
+"\\newcommand{\\entrylabel}[1]{%\n"
+"  {%\n"
+"    \\parbox[b]{\\labelwidth-4pt}{%\n"
+"      \\makebox[0pt][l]{\\DoxyLabelFont#1}%\n"
+"      \\vspace{1.5\\baselineskip}%\n"
+"    }%\n"
+"  }%\n"
+"}\n"
+"\n"
+"\\newenvironment{DoxyDesc}[1]{%\n"
+"  \\ensurespace{4\\baselineskip}%\n"
+"  \\begin{list}{}{%\n"
+"    \\settowidth{\\labelwidth}{20pt}%\n"
+"    \\setlength{\\parsep}{0pt}%\n"
+"    \\setlength{\\itemsep}{0pt}%\n"
+"    \\setlength{\\leftmargin}{\\labelwidth+\\labelsep}%\n"
+"    \\renewcommand{\\makelabel}{\\entrylabel}%\n"
+"  }%\n"
+"  \\item[#1]%\n"
+"}{%\n"
+"  \\end{list}%\n"
+"}\n"
+"\n"
+"\\newsavebox{\\xrefbox}\n"
+"\\newlength{\\xreflength}\n"
+"\\newcommand{\\xreflabel}[1]{%\n"
+"  \\sbox{\\xrefbox}{#1}%\n"
+"  \\setlength{\\xreflength}{\\wd\\xrefbox}%\n"
+"  \\ifthenelse{\\xreflength>\\labelwidth}{%\n"
+"    \\begin{minipage}{\\textwidth}%\n"
+"      \\setlength{\\parindent}{0pt}%\n"
+"      \\hangindent=15pt\\bfseries #1\\vspace{1.2\\itemsep}%\n"
+"    \\end{minipage}%\n"
+"  }{%\n"
+"   \\parbox[b]{\\labelwidth}{\\makebox[0pt][l]{\\textbf{#1}}}%\n"
+"  }%\n"
+"}\n"
+"\n"
+"%---------- Commands used by doxygen LaTeX output generator ----------\n"
+"\n"
+"% Used by <pre> ... </pre>\n"
+"\\newenvironment{DoxyPre}{%\n"
+"  \\small%\n"
+"  \\begin{alltt}%\n"
+"}{%\n"
+"  \\end{alltt}%\n"
+"  \\normalsize%\n"
+"}\n"
+"\n"
+"% Used by @code ... @endcode\n"
+"\\newenvironment{DoxyCode}{%\n"
+"  \\par%\n"
+"  \\scriptsize%\n"
+"  \\begin{alltt}%\n"
+"}{%\n"
+"  \\end{alltt}%\n"
+"  \\normalsize%\n"
+"}\n"
+"\n"
+"% Used by @example, @include, @includelineno and @dontinclude\n"
+"\\newenvironment{DoxyCodeInclude}{%\n"
+"  \\DoxyCode%\n"
+"}{%\n"
+"  \\endDoxyCode%\n"
+"}\n"
+"\n"
+"% Used by @verbatim ... @endverbatim\n"
+"\\newenvironment{DoxyVerb}{%\n"
+"  \\footnotesize%\n"
+"  \\verbatim%\n"
+"}{%\n"
+"  \\endverbatim%\n"
+"  \\normalsize%\n"
+"}\n"
+"\n"
+"% Used by @verbinclude\n"
+"\\newenvironment{DoxyVerbInclude}{%\n"
+"  \\DoxyVerb%\n"
+"}{%\n"
+"  \\endDoxyVerb%\n"
+"}\n"
+"\n"
+"% Used by numbered lists (using '-#' or <ol> ... </ol>)\n"
+"\\newenvironment{DoxyEnumerate}{%\n"
+"  \\enumerate%\n"
+"}{%\n"
+"  \\endenumerate%\n"
+"}\n"
+"\n"
+"% Used by bullet lists (using '-', @li, @arg, or <ul> ... </ul>)\n"
+"\\newenvironment{DoxyItemize}{%\n"
+"  \\itemize%\n"
+"}{%\n"
+"  \\enditemize%\n"
+"}\n"
+"\n"
+"% Used by description lists (using <dl> ... </dl>)\n"
+"\\newenvironment{DoxyDescription}{%\n"
+"  \\description%\n"
+"}{%\n"
+"  \\enddescription%\n"
+"}\n"
+"\n"
+"% Used by @image, @dotfile, @dot ... @enddot, and @msc ... @endmsc\n"
+"% (only if caption is specified)\n"
+"\\newenvironment{DoxyImage}{%\n"
+"  \\begin{figure}[H]%\n"
+"    \\begin{center}%\n"
+"}{%\n"
+"    \\end{center}%\n"
+"  \\end{figure}%\n"
+"}\n"
+"\n"
+"% Used by @image, @dotfile, @dot ... @enddot, and @msc ... @endmsc\n"
+"% (only if no caption is specified)\n"
+"\\newenvironment{DoxyImageNoCaption}{%\n"
+"}{%\n"
+"}\n"
+"\n"
+"% Used by @attention\n"
+"\\newenvironment{DoxyAttention}[1]{%\n"
+"  \\begin{DoxyDesc}{#1}%\n"
+"}{%\n"
+"  \\end{DoxyDesc}%\n"
+"}\n"
+"\n"
+"% Used by @author and @authors\n"
+"\\newenvironment{DoxyAuthor}[1]{%\n"
+"  \\begin{DoxyDesc}{#1}%\n"
+"}{%\n"
+"  \\end{DoxyDesc}%\n"
+"}\n"
+"\n"
+"% Used by @date\n"
+"\\newenvironment{DoxyDate}[1]{%\n"
+"  \\begin{DoxyDesc}{#1}%\n"
+"}{%\n"
+"  \\end{DoxyDesc}%\n"
+"}\n"
+"\n"
+"% Used by @invariant\n"
+"\\newenvironment{DoxyInvariant}[1]{%\n"
+"  \\begin{DoxyDesc}{#1}%\n"
+"}{%\n"
+"  \\end{DoxyDesc}%\n"
+"}\n"
+"\n"
+"% Used by @note\n"
+"\\newenvironment{DoxyNote}[1]{%\n"
+"  \\begin{DoxyDesc}{#1}%\n"
+"}{%\n"
+"  \\end{DoxyDesc}%\n"
+"}\n"
+"\n"
+"% Used by @post\n"
+"\\newenvironment{DoxyPostcond}[1]{%\n"
+"  \\begin{DoxyDesc}{#1}%\n"
+"}{%\n"
+"  \\end{DoxyDesc}%\n"
+"}\n"
+"\n"
+"% Used by @pre\n"
+"\\newenvironment{DoxyPrecond}[1]{%\n"
+"  \\begin{DoxyDesc}{#1}%\n"
+"}{%\n"
+"  \\end{DoxyDesc}%\n"
+"}\n"
+"\n"
+"% Used by @copyright\n"
+"\\newenvironment{DoxyCopyright}[1]{%\n"
+"  \\begin{DoxyDesc}{#1}%\n"
+"}{%\n"
+"  \\end{DoxyDesc}%\n"
+"}\n"
+"\n"
+"% Used by @remark\n"
+"\\newenvironment{DoxyRemark}[1]{%\n"
+"  \\begin{DoxyDesc}{#1}%\n"
+"}{%\n"
+"  \\end{DoxyDesc}%\n"
+"}\n"
+"\n"
+"% Used by @return and @returns\n"
+"\\newenvironment{DoxyReturn}[1]{%\n"
+"  \\begin{DoxyDesc}{#1}%\n"
+"}{%\n"
+"  \\end{DoxyDesc}%\n"
+"}\n"
+"\n"
+"% Used by @since\n"
+"\\newenvironment{DoxySince}[1]{%\n"
+"  \\begin{DoxyDesc}{#1}%\n"
+"}{%\n"
+"  \\end{DoxyDesc}%\n"
+"}\n"
+"\n"
+"% Used by @see\n"
+"\\newenvironment{DoxySeeAlso}[1]{%\n"
+"  \\begin{DoxyDesc}{#1}%\n"
+"}{%\n"
+"  \\end{DoxyDesc}%\n"
+"}\n"
+"\n"
+"% Used by @version\n"
+"\\newenvironment{DoxyVersion}[1]{%\n"
+"  \\begin{DoxyDesc}{#1}%\n"
+"}{%\n"
+"  \\end{DoxyDesc}%\n"
+"}\n"
+"\n"
+"% Used by @warning\n"
+"\\newenvironment{DoxyWarning}[1]{%\n"
+"  \\begin{DoxyDesc}{#1}%\n"
+"}{%\n"
+"  \\end{DoxyDesc}%\n"
+"}\n"
+"\n"
+"% Used by @internal\n"
+"\\newenvironment{DoxyInternal}[1]{%\n"
+"  \\paragraph*{#1}%\n"
+"}{%\n"
+"}\n"
+"\n"
+"% Used by @par and @paragraph\n"
+"\\newenvironment{DoxyParagraph}[1]{%\n"
+"  \\begin{list}{}{%\n"
+"    \\settowidth{\\labelwidth}{40pt}%\n"
+"    \\setlength{\\leftmargin}{\\labelwidth}%\n"
+"    \\setlength{\\parsep}{0pt}%\n"
+"    \\setlength{\\itemsep}{-4pt}%\n"
+"    \\renewcommand{\\makelabel}{\\entrylabel}%\n"
+"  }%\n"
+"  \\item[#1]%\n"
+"}{%\n"
+"  \\end{list}%\n"
+"}\n"
+"\n"
+"% Used by parameter lists\n"
+"\\newenvironment{DoxyParams}[2][]{%\n"
+"    \\par%\n"
+"    \\tabletail{\\hline}%\n"
+"    \\tablelasttail{\\hline}%\n"
+"    \\tablefirsthead{}%\n"
+"    \\tablehead{}%\n"
+"    \\ifthenelse{\\equal{#1}{}}%\n"
+"    {\\tablefirsthead{\\multicolumn{2}{l}{\\hspace{-6pt}\\bfseries\\fontseries{bc}\\selectfont\\color{darkgray} #2}\\\\[1ex]}%\n"
+"     \\begin{xtabular}{|>{\\raggedleft\\hspace{0pt}}p{0.15\\textwidth}|%\n"
+"                        p{0.805\\textwidth}|}}%\n"
+"    {\\ifthenelse{\\equal{#1}{1}}%\n"
+"      {\\tablefirsthead{\\multicolumn{2}{l}{\\hspace{-6pt}\\bfseries\\fontseries{bc}\\selectfont\\color{darkgray} #2}\\\\[1ex]}%\n"
+"       \\begin{xtabular}{|>{\\centering}p{0.10\\textwidth}|%\n"
+"                         >{\\raggedleft\\hspace{0pt}}p{0.15\\textwidth}|%\n"
+"                         p{0.678\\textwidth}|}}%\n"
+"      {\\tablefirsthead{\\multicolumn{2}{l}{\\hspace{-6pt}\\bfseries\\fontseries{bc}\\selectfont\\color{darkgray} #2}\\\\[1ex]}%\n"
+"       \\begin{xtabular}{|>{\\centering}p{0.10\\textwidth}|%\n"
+"                         >{\\centering\\hspace{0pt}}p{0.15\\textwidth}|%\n"
+"                         >{\\raggedleft\\hspace{0pt}}p{0.15\\textwidth}|%\n"
+"                         p{0.501\\textwidth}|}}%\n"
+"    }\\hline%\n"
+"}{%\n"
+"    \\end{xtabular}%\n"
+"    \\tablefirsthead{}%\n"
+"    \\vspace{6pt}%\n"
+"}\n"
+"\n"
+"% Used for fields of simple structs\n"
+"\\newenvironment{DoxyFields}[1]{%\n"
+"    \\par%\n"
+"    \\tabletail{\\hline}%\n"
+"    \\tablelasttail{\\hline}%\n"
+"    \\tablehead{}%\n"
+"    \\tablefirsthead{\\multicolumn{2}{l}{\\hspace{-6pt}\\bfseries\\fontseries{bc}\\selectfont\\color{darkgray} #1}\\\\[1ex]}%\n"
+"    \\begin{xtabular}{|>{\\raggedleft\\hspace{0pt}}p{0.15\\textwidth}|%\n"
+"                         p{0.15\\textwidth}|%\n"
+"                         p{0.63\\textwidth}|}%\n"
+"    \\hline%\n"
+"}{%\n"
+"    \\end{xtabular}%\n"
+"    \\tablefirsthead{}%\n"
+"    \\vspace{6pt}%\n"
+"}\n"
+"\n"
+"% Used for parameters within a detailed function description\n"
+"\\newenvironment{DoxyParamCaption}{%\n"
+"  \\renewcommand{\\item}[2][]{##1 {\\em ##2}}%\n"
+"}{%\n"
+"}\n"
+"\n"
+"% Used by return value lists\n"
+"\\newenvironment{DoxyRetVals}[1]{%\n"
+"    \\par%\n"
+"    \\tabletail{\\hline}%\n"
+"    \\tablelasttail{\\hline}%\n"
+"    \\tablehead{}%\n"
+"    \\tablefirsthead{\\multicolumn{2}{l}{\\hspace{-6pt}\\bfseries\\fontseries{bc}\\selectfont\\color{darkgray} #1}\\\\[1ex]}%\n"
+"    \\begin{xtabular}{|>{\\raggedleft\\hspace{0pt}}p{0.25\\textwidth}|%\n"
+"                          p{0.705\\textwidth}|}%\n"
+"    \\hline%\n"
+"}{%\n"
+"    \\end{xtabular}%\n"
+"    \\tablefirsthead{}%\n"
+"    \\vspace{6pt}%\n"
+"}\n"
+"\n"
+"% Used by exception lists\n"
+"\\newenvironment{DoxyExceptions}[1]{%\n"
+"    \\par%\n"
+"    \\tabletail{\\hline}%\n"
+"    \\tablelasttail{\\hline}%\n"
+"    \\tablehead{}%\n"
+"    \\tablefirsthead{\\multicolumn{2}{l}{\\hspace{-6pt}\\bfseries\\fontseries{bc}\\selectfont\\color{darkgray} #1}\\\\[1ex]}%\n"
+"    \\begin{xtabular}{|>{\\raggedleft\\hspace{0pt}}p{0.25\\textwidth}|%\n"
+"                          p{0.705\\textwidth}|}%\n"
+"    \\hline%\n"
+"}{%\n"
+"    \\end{xtabular}%\n"
+"    \\tablefirsthead{}%\n"
+"    \\vspace{6pt}%\n"
+"}\n"
+"\n"
+"% Used by template parameter lists\n"
+"\\newenvironment{DoxyTemplParams}[1]{%\n"
+"    \\par%\n"
+"    \\tabletail{\\hline}%\n"
+"    \\tablelasttail{\\hline}%\n"
+"    \\tablehead{}%\n"
+"    \\tablefirsthead{\\multicolumn{2}{l}{\\hspace{-6pt}\\bfseries\\fontseries{bc}\\selectfont\\color{darkgray} #1}\\\\[1ex]}%\n"
+"    \\begin{xtabular}{|>{\\raggedleft\\hspace{0pt}}p{0.25\\textwidth}|%\n"
+"                          p{0.705\\textwidth}|}%\n"
+"    \\hline%\n"
+"}{%\n"
+"    \\end{xtabular}%\n"
+"    \\tablefirsthead{}%\n"
+"    \\vspace{6pt}%\n"
+"}\n"
+"\n"
+"% Used for member lists\n"
+"\\newenvironment{DoxyCompactItemize}{%\n"
+"  \\begin{itemize}%\n"
+"    \\setlength{\\itemsep}{-3pt}%\n"
+"    \\setlength{\\parsep}{0pt}%\n"
+"    \\setlength{\\topsep}{0pt}%\n"
+"    \\setlength{\\partopsep}{0pt}%\n"
+"}{%\n"
+"  \\end{itemize}%\n"
+"}\n"
+"\n"
+"% Used for member descriptions\n"
+"\\newenvironment{DoxyCompactList}{%\n"
+"  \\begin{list}{}{%\n"
+"    \\setlength{\\leftmargin}{0.5cm}%\n"
+"    \\setlength{\\itemsep}{0pt}%\n"
+"    \\setlength{\\parsep}{0pt}%\n"
+"    \\setlength{\\topsep}{0pt}%\n"
+"    \\renewcommand{\\makelabel}{\\hfill}%\n"
+"  }%\n"
+"}{%\n"
+"  \\end{list}%\n"
+"}\n"
+"\n"
+"% Used for reference lists (@bug, @deprecated, @todo, etc.)\n"
+"\\newenvironment{DoxyRefList}{%\n"
+"  \\begin{list}{}{%\n"
+"    \\setlength{\\labelwidth}{10pt}%\n"
+"    \\setlength{\\leftmargin}{\\labelwidth}%\n"
+"    \\addtolength{\\leftmargin}{\\labelsep}%\n"
+"    \\renewcommand{\\makelabel}{\\xreflabel}%\n"
+"  }%\n"
+"}{%\n"
+"  \\end{list}%\n"
+"}\n"
+"\n"
+"% Used by @bug, @deprecated, @todo, etc.\n"
+"\\newenvironment{DoxyRefDesc}[1]{%\n"
+"  \\begin{list}{}{%\n"
+"    \\renewcommand\\makelabel[1]{\\textbf{##1}}%\n"
+"    \\settowidth\\labelwidth{\\makelabel{#1}}%\n"
+"    \\setlength\\leftmargin{\\labelwidth+\\labelsep}%\n"
+"  }%\n"
+"}{%\n"
+"  \\end{list}%\n"
+"}\n"
+"\n"
+"% Used by parameter lists and simple sections\n"
+"\\newenvironment{Desc}\n"
+"{\\begin{list}{}{%\n"
+"    \\settowidth{\\labelwidth}{40pt}%\n"
+"    \\setlength{\\leftmargin}{\\labelwidth}%\n"
+"    \\setlength{\\parsep}{0pt}%\n"
+"    \\setlength{\\itemsep}{-4pt}%\n"
+"    \\renewcommand{\\makelabel}{\\entrylabel}%\n"
+"  }\n"
+"}{%\n"
+"  \\end{list}%\n"
+"}\n"
+"\n"
+"% Used by tables\n"
+"\\newcommand{\\PBS}[1]{\\let\\temp=\\\\#1\\let\\\\=\\temp}%\n"
+"\\newlength{\\tmplength}%\n"
+"\\newenvironment{TabularC}[1]%\n"
+"{%\n"
+"\\setlength{\\tmplength}%\n"
+"     {\\linewidth/(#1)-\\tabcolsep*2-\\arrayrulewidth*(#1+1)/(#1)}%\n"
+"      \\par\\begin{xtabular*}{\\linewidth}%\n"
+"             {*{#1}{|>{\\PBS\\raggedright\\hspace{0pt}}p{\\the\\tmplength}}|}%\n"
+"}%\n"
+"{\\end{xtabular*}\\par}%\n"
+"\n"
+"% Used for member group headers\n"
+"\\newenvironment{Indent}{%\n"
+"  \\begin{list}{}{%\n"
+"    \\setlength{\\leftmargin}{0.5cm}%\n"
+"  }%\n"
+"  \\item[]\\ignorespaces%\n"
+"}{%\n"
+"  \\unskip%\n"
+"  \\end{list}%\n"
+"}\n"
+"\n"
+"% Used when hyperlinks are turned off\n"
+"\\newcommand{\\doxyref}[3]{%\n"
+"  \\textbf{#1} (\\textnormal{#2}\\,\\pageref{#3})%\n"
+"}\n"
+"\n"
+"% Used for syntax highlighting\n"
+"\\definecolor{comment}{rgb}{0.5,0.0,0.0}\n"
+"\\definecolor{keyword}{rgb}{0.0,0.5,0.0}\n"
+"\\definecolor{keywordtype}{rgb}{0.38,0.25,0.125}\n"
+"\\definecolor{keywordflow}{rgb}{0.88,0.5,0.0}\n"
+"\\definecolor{preprocessor}{rgb}{0.5,0.38,0.125}\n"
+"\\definecolor{stringliteral}{rgb}{0.0,0.125,0.25}\n"
+"\\definecolor{charliteral}{rgb}{0.0,0.5,0.5}\n"
+"\\definecolor{vhdldigit}{rgb}{1.0,0.0,1.0}\n"
+"\\definecolor{vhdlkeyword}{rgb}{0.43,0.0,0.43}\n"
+"\\definecolor{vhdllogic}{rgb}{1.0,0.0,0.0}\n"
+"\\definecolor{vhdlchar}{rgb}{0.0,0.0,0.0}\n"
index df65a13..213b0fa 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 3be7fc0..c21c4ae 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index cf3634b..15263ab 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -113,6 +113,7 @@ Entry::Entry(const Entry &e)
   anchors     = new QList<SectionInfo>;
   fileName    = e.fileName;
   startLine   = e.startLine;
+  startColumn = e.startColumn;
   if (e.sli)
   {
     sli = new QList<ListItemInfo>;
@@ -132,6 +133,7 @@ Entry::Entry(const Entry &e)
   hidden      = e.hidden;
   artificial  = e.artificial;
   groupDocType = e.groupDocType;
+  id          = e.id;
 
   m_parent    = e.m_parent;
   m_sublist   = new QList<Entry>;
@@ -239,6 +241,7 @@ void Entry::reset()
   initializer.resize(0);
   initLines = -1;
   startLine = 1;
+  startColumn = 1;
   bodyLine = -1;
   endBodyLine = -1;
   mGrpId = -1;
@@ -257,6 +260,7 @@ void Entry::reset()
   subGrouping = TRUE;
   protection = Public;
   groupDocType = GROUPDOC_NORMAL;
+  id.resize(0);
   m_sublist->clear();
   extends->clear();
   groups->clear();
index 60ba372..cecd095 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -79,9 +79,11 @@ class Entry
       INTERFACEDOC_SEC = 0x00010000,
       PROTOCOLDOC_SEC  = 0x00020000,
       CATEGORYDOC_SEC  = 0x00040000,
+      SERVICEDOC_SEC   = 0x00080000,
+      SINGLETONDOC_SEC = 0x00100000,
       COMPOUNDDOC_MASK = CLASSDOC_SEC | STRUCTDOC_SEC | UNIONDOC_SEC | 
                          INTERFACEDOC_SEC | EXCEPTIONDOC_SEC | PROTOCOLDOC_SEC |
-                         CATEGORYDOC_SEC,
+                         CATEGORYDOC_SEC | SERVICEDOC_SEC | SINGLETONDOC_SEC,
 
       SOURCE_SEC       = 0x00400000,
       HEADER_SEC       = 0x00800000,
@@ -111,56 +113,69 @@ class Entry
       PACKAGEDOC_SEC   = 0x16000000,
       OBJCIMPL_SEC     = 0x17000000,
       DIRDOC_SEC       = 0x18000000
+      ,EXPORTED_INTERFACE_SEC = 0x19000000
+      ,INCLUDED_SERVICE_SEC = 0x1A000000
     };
-    enum MemberSpecifier
-    {
-      Inline      = 0x00000001,
-      Explicit    = 0x00000002,
-      Mutable     = 0x00000004,
-      Settable    = 0x00000008,
-      Gettable    = 0x00000010,
-      Readable    = 0x00000020,
-      Writable    = 0x00000040,
-      Final       = 0x00000080,
-      Abstract    = 0x00000100,
-      Addable     = 0x00000200,
-      Removable   = 0x00000400,
-      Raisable    = 0x00000800,
-      Override    = 0x00001000,
-      New         = 0x00002000,
-      Sealed      = 0x00004000,
-      Initonly    = 0x00008000,
-      Optional    = 0x00010000,
-      Required    = 0x00020000,
-      NonAtomic   = 0x00040000,
-      Copy        = 0x00080000,
-      Retain      = 0x00100000,
-      Assign      = 0x00200000,
-      Strong      = 0x00400000,
-      Weak        = 0x00800000,
-      Unretained  = 0x01000000,
-      Alias       = 0x02000000,
-      ConstExp    = 0x04000000,
-      Default     = 0x08000000,
-      Delete      = 0x10000000,
-      NoExcept    = 0x20000000
-    };
-    enum ClassSpecifier
-    {
-      Template       = 0x0001,
-      Generic        = 0x0002,
-      Ref            = 0x0004,
-      Value          = 0x0008,
-      Interface      = 0x0010,
-      Struct         = 0x0020,
-      Union          = 0x0040,
-      Exception      = 0x0080,
-      Protocol       = 0x0100,
-      Category       = 0x0200,
-      SealedClass    = 0x0400,
-      AbstractClass  = 0x0800,
-      Enum           = 0x1000  // for Java-style enums
-    };
+
+    // class specifiers (add new items to the end)
+    static const uint64 Template        = (1ULL<<0);
+    static const uint64 Generic         = (1ULL<<1);
+    static const uint64 Ref             = (1ULL<<2);
+    static const uint64 Value           = (1ULL<<3);
+    static const uint64 Interface       = (1ULL<<4);
+    static const uint64 Struct          = (1ULL<<5);
+    static const uint64 Union           = (1ULL<<6);
+    static const uint64 Exception       = (1ULL<<7);
+    static const uint64 Protocol        = (1ULL<<8);
+    static const uint64 Category        = (1ULL<<9);
+    static const uint64 SealedClass     = (1ULL<<10);
+    static const uint64 AbstractClass   = (1ULL<<11);
+    static const uint64 Enum            = (1ULL<<12); // for Java-style enums
+    static const uint64 Service         = (1ULL<<13); // UNO IDL
+    static const uint64 Singleton       = (1ULL<<14); // UNO IDL
+
+    // member specifiers (add new items to the beginning)
+    static const uint64 Inline          = (1ULL<<24);
+    static const uint64 Explicit        = (1ULL<<25);
+    static const uint64 Mutable         = (1ULL<<26);
+    static const uint64 Settable        = (1ULL<<27);
+    static const uint64 Gettable        = (1ULL<<28);
+    static const uint64 Readable        = (1ULL<<29);
+    static const uint64 Writable        = (1ULL<<30);
+    static const uint64 Final           = (1ULL<<31);
+    static const uint64 Abstract        = (1ULL<<32);
+    static const uint64 Addable         = (1ULL<<33);
+    static const uint64 Removable       = (1ULL<<34);
+    static const uint64 Raisable        = (1ULL<<35);
+    static const uint64 Override        = (1ULL<<36);
+    static const uint64 New             = (1ULL<<37);
+    static const uint64 Sealed          = (1ULL<<38);
+    static const uint64 Initonly        = (1ULL<<39);
+    static const uint64 Optional        = (1ULL<<40);
+    static const uint64 Required        = (1ULL<<41);
+    static const uint64 NonAtomic       = (1ULL<<42);
+    static const uint64 Copy            = (1ULL<<43);
+    static const uint64 Retain          = (1ULL<<44);
+    static const uint64 Assign          = (1ULL<<45);
+    static const uint64 Strong          = (1ULL<<46);
+    static const uint64 Weak            = (1ULL<<47);
+    static const uint64 Unretained      = (1ULL<<48);
+    static const uint64 Alias           = (1ULL<<49);
+    static const uint64 ConstExp        = (1ULL<<50);
+    static const uint64 Default         = (1ULL<<51);
+    static const uint64 Delete          = (1ULL<<52);
+    static const uint64 NoExcept        = (1ULL<<53);
+    static const uint64 Attribute       = (1ULL<<54); // UNO IDL attribute
+    static const uint64 Property        = (1ULL<<55); // UNO IDL property
+    static const uint64 Readonly        = (1ULL<<56); // on UNO IDL attribute or property
+    static const uint64 Bound           = (1ULL<<57); // on UNO IDL attribute or property
+    static const uint64 Constrained     = (1ULL<<58); // on UNO IDL property
+    static const uint64 Transient       = (1ULL<<59); // on UNO IDL property
+    static const uint64 MaybeVoid       = (1ULL<<60); // on UNO IDL property
+    static const uint64 MaybeDefault    = (1ULL<<61); // on UNO IDL property
+    static const uint64 MaybeAmbiguous  = (1ULL<<62); // on UNO IDL property
+    static const uint64 Published       = (1ULL<<63); // UNO IDL keyword
+
     enum GroupDocType
     {
       GROUPDOC_NORMAL,        //!< defgroup
@@ -220,7 +235,7 @@ class Entry
     // content
     Protection protection;    //!< class protection
     MethodTypes mtype;        //!< signal, slot, (dcop) method, or property?
-    int  spec;                //!< class/member specifiers
+    uint64 spec;              //!< class/member specifiers
     int  initLines;           //!< define/variable initializer lines to show 
     bool stat;                //!< static ?
     bool explicitExternal;    //!< explicitly defined as external?
@@ -261,11 +276,13 @@ class Entry
     QList<SectionInfo> *anchors; //!< list of anchors defined in this entry
     QCString   fileName;     //!< file this entry was extracted from
     int                startLine;    //!< start line of entry in the source
+    int                startColumn;  //!< start column of entry in the source
     QList<ListItemInfo> *sli; //!< special lists (test/todo/bug/deprecated/..) this entry is in
     SrcLangExt  lang;         //!< programming language in which this entry was found
     bool        hidden;       //!< does this represent an entity that is hidden from the output
     bool        artificial;   //!< Artificially introduced item
     GroupDocType groupDocType;
+    QCString    id;           //!< libclang id
 
 
     static int  num;          //!< counts the total number of entries
index 4bcaeb9..8a2b529 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -40,7 +40,7 @@ class ExampleSDict : public SDict<Example>
    ~ExampleSDict() {}
     int compareItems(QCollection::Item item1,QCollection::Item item2)
     {
-      return stricmp(((Example *)item1)->name,((Example *)item2)->name);
+      return qstricmp(((Example *)item1)->name,((Example *)item2)->name);
     }
 };
 
index 331c792..784ebff 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -41,6 +41,8 @@
 #include "membergroup.h"
 #include "dirdef.h"
 #include "config.h"
+#include "clangparser.h"
+#include "settings.h"
 
 //---------------------------------------------------------------------------
 
@@ -74,37 +76,34 @@ class DevNullCodeDocInterface : public CodeOutputInterface
 */
 FileDef::FileDef(const char *p,const char *nm,
                  const char *lref,const char *dn)
-   : Definition((QCString)p+nm,1,nm)
+   : Definition((QCString)p+nm,1,1,nm)
 {
-  path=p;
-  filepath=path+nm;
-  filename=nm;
-  diskname=dn;
-  if (diskname.isEmpty()) diskname=nm;
+  m_path=p;
+  m_filePath=m_path+nm;
+  m_fileName=nm;
+  m_diskName=dn;
+  if (m_diskName.isEmpty()) m_diskName=nm;
   setReference(lref);
-  classSDict        = 0;
-  includeList       = 0;
-  includeDict       = 0; 
-  includedByList    = 0;
-  includedByDict    = 0; 
-  namespaceSDict    = 0; 
-  srcDefDict        = 0;
-  srcMemberDict     = 0;
-  usingDirList      = 0;
-  usingDeclList     = 0;
-  package           = 0;
-  isSource          = FALSE
-  docname           = nm;
-  dir               = 0;
+  m_classSDict        = 0;
+  m_includeList       = 0;
+  m_includeDict       = 0; 
+  m_includedByList    = 0;
+  m_includedByDict    = 0; 
+  m_namespaceSDict    = 0; 
+  m_srcDefDict        = 0;
+  m_srcMemberDict     = 0;
+  m_usingDirList      = 0;
+  m_usingDeclList     = 0;
+  m_package           = 0;
+  m_isSource          = guessSection(nm)==Entry::SOURCE_SEC
+  m_docname           = nm;
+  m_dir               = 0;
   if (Config_getBool("FULL_PATH_NAMES"))
   {
-    docname.prepend(stripFromPath(path.copy()));
+    m_docname.prepend(stripFromPath(m_path.copy()));
   }
-  SrcLangExt lang = getLanguageFromFileName(name());
-  setLanguage(lang);
-  //m_isJava          = lang==SrcLangExt_Java;
-  //m_isCSharp        = lang==SrcLangExt_CSharp;
-  memberGroupSDict = 0;
+  setLanguage(getLanguageFromFileName(name()));
+  m_memberGroupSDict = 0;
   acquireFileVersion();
   m_subGrouping=Config_getBool("SUBGROUPING");
 }
@@ -112,17 +111,17 @@ FileDef::FileDef(const char *p,const char *nm,
 /*! destroy the file definition */
 FileDef::~FileDef()
 {
-  delete classSDict;
-  delete includeDict;
-  delete includeList;
-  delete includedByDict;
-  delete includedByList;
-  delete namespaceSDict;
-  delete srcDefDict;
-  delete srcMemberDict;
-  delete usingDirList;
-  delete usingDeclList;
-  delete memberGroupSDict;
+  delete m_classSDict;
+  delete m_includeDict;
+  delete m_includeList;
+  delete m_includedByDict;
+  delete m_includedByList;
+  delete m_namespaceSDict;
+  delete m_srcDefDict;
+  delete m_srcMemberDict;
+  delete m_usingDirList;
+  delete m_usingDeclList;
+  delete m_memberGroupSDict;
 }
 
 /*! Compute the HTML anchor names for all members in the class */ 
@@ -135,9 +134,9 @@ void FileDef::computeAnchors()
 void FileDef::distributeMemberGroupDocumentation()
 {
   //printf("FileDef::distributeMemberGroupDocumentation()\n");
-  if (memberGroupSDict)
+  if (m_memberGroupSDict)
   {
-    MemberGroupSDict::Iterator mgli(*memberGroupSDict);
+    MemberGroupSDict::Iterator mgli(*m_memberGroupSDict);
     MemberGroup *mg;
     for (;(mg=mgli.current());++mgli)
     {
@@ -149,9 +148,9 @@ void FileDef::distributeMemberGroupDocumentation()
 void FileDef::findSectionsInDocumentation()
 {
   docFindSections(documentation(),this,0,docFile());
-  if (memberGroupSDict)
+  if (m_memberGroupSDict)
   {
-    MemberGroupSDict::Iterator mgli(*memberGroupSDict);
+    MemberGroupSDict::Iterator mgli(*m_memberGroupSDict);
     MemberGroup *mg;
     for (;(mg=mgli.current());++mgli)
     {
@@ -192,7 +191,7 @@ void FileDef::writeDetailedDescription(OutputList &ol,const QCString &title)
     ol.startTextBlock();
     if (!briefDescription().isEmpty() && Config_getBool("REPEAT_BRIEF"))
     {
-      ol.parseDoc(briefFile(),briefLine(),this,0,briefDescription(),FALSE,FALSE);
+      ol.generateDoc(briefFile(),briefLine(),this,0,briefDescription(),FALSE,FALSE);
     }
     if (!briefDescription().isEmpty() && Config_getBool("REPEAT_BRIEF") && 
         !documentation().isEmpty())
@@ -208,7 +207,7 @@ void FileDef::writeDetailedDescription(OutputList &ol,const QCString &title)
     }
     if (!documentation().isEmpty())
     {
-      ol.parseDoc(docFile(),docLine(),this,0,documentation()+"\n",TRUE,FALSE);
+      ol.generateDoc(docFile(),docLine(),this,0,documentation()+"\n",TRUE,FALSE);
     }
     //printf("Writing source ref for file %s\n",name().data());
     if (Config_getBool("SOURCE_BROWSER")) 
@@ -234,41 +233,41 @@ void FileDef::writeBriefDescription(OutputList &ol)
 {
   if (!briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC"))
   {
-    ol.startParagraph();
-    ol.parseDoc(briefFile(),briefLine(),this,0,
-                briefDescription(),TRUE,FALSE,0,TRUE,FALSE);
-    ol.pushGeneratorState();
-    ol.disable(OutputGenerator::RTF);
-    ol.writeString(" \n");
-    ol.enable(OutputGenerator::RTF);
+    DocRoot *rootNode = validatingParseDoc(briefFile(),briefLine(),this,0,
+                       briefDescription(),TRUE,FALSE,0,TRUE,FALSE);
 
-    if (Config_getBool("REPEAT_BRIEF") ||
-        !documentation().isEmpty()
-       )
+    if (rootNode && !rootNode->isEmpty())
     {
-      ol.disableAllBut(OutputGenerator::Html);
-      ol.startTextLink(0,"details");
-      ol.parseText(theTranslator->trMore());
-      ol.endTextLink();
-    }
-    ol.popGeneratorState();
-    ol.endParagraph();
+      ol.startParagraph();
+      ol.writeDoc(rootNode,this,0);
+      ol.pushGeneratorState();
+      ol.disable(OutputGenerator::RTF);
+      ol.writeString(" \n");
+      ol.enable(OutputGenerator::RTF);
 
-    //ol.pushGeneratorState();
-    //ol.disable(OutputGenerator::RTF);
-    //ol.newParagraph();
-    //ol.popGeneratorState();
+      if (Config_getBool("REPEAT_BRIEF") ||
+          !documentation().isEmpty()
+         )
+      {
+        ol.disableAllBut(OutputGenerator::Html);
+        ol.startTextLink(0,"details");
+        ol.parseText(theTranslator->trMore());
+        ol.endTextLink();
+      }
+      ol.popGeneratorState();
+      ol.endParagraph();
+    }
+    delete rootNode;
   }
   ol.writeSynopsis();
 }
 
 void FileDef::writeIncludeFiles(OutputList &ol)
 {
-  if (/*Config_getBool("SHOW_INCLUDE_FILES") &&*/ includeList && 
-      includeList->count()>0)
+  if (m_includeList && m_includeList->count()>0)
   {
     ol.startTextBlock(TRUE);
-    QListIterator<IncludeInfo> ili(*includeList);
+    QListIterator<IncludeInfo> ili(*m_includeList);
     IncludeInfo *ii;
     for (;(ii=ili.current());++ili)
     {
@@ -353,7 +352,7 @@ void FileDef::writeIncludeGraph(OutputList &ol)
     DotInclDepGraph incDepGraph(this,FALSE);
     if (incDepGraph.isTooBig())
     {
-       err("warning: Include graph for '%s' not generated, too many nodes. Consider increasing DOT_GRAPH_MAX_NODES.\n",name().data());
+       warn_uncond("Include graph for '%s' not generated, too many nodes. Consider increasing DOT_GRAPH_MAX_NODES.\n",name().data());
     }
     else if (!incDepGraph.isTrivial())
     {
@@ -377,7 +376,7 @@ void FileDef::writeIncludedByGraph(OutputList &ol)
     DotInclDepGraph incDepGraph(this,TRUE);
     if (incDepGraph.isTooBig())
     {
-       err("warning: Included by graph for '%s' not generated, too many nodes. Consider increasing DOT_GRAPH_MAX_NODES.\n",name().data());
+       warn_uncond("Included by graph for '%s' not generated, too many nodes. Consider increasing DOT_GRAPH_MAX_NODES.\n",name().data());
     }
     if (!incDepGraph.isTrivial())
     {
@@ -409,21 +408,22 @@ void FileDef::writeSourceLink(OutputList &ol)
   }
 }
 
-void FileDef::writeNamespaceDeclarations(OutputList &ol,const QCString &title)
+void FileDef::writeNamespaceDeclarations(OutputList &ol,const QCString &title,
+            bool const isConstantGroup)
 {
   // write list of namespaces
-  if (namespaceSDict) namespaceSDict->writeDeclaration(ol,title);
+  if (m_namespaceSDict) m_namespaceSDict->writeDeclaration(ol,title,isConstantGroup);
 }
 
 void FileDef::writeClassDeclarations(OutputList &ol,const QCString &title)
 {
   // write list of classes
-  if (classSDict) classSDict->writeDeclaration(ol,0,title,FALSE);
+  if (m_classSDict) m_classSDict->writeDeclaration(ol,0,title,FALSE);
 }
 
 void FileDef::writeInlineClasses(OutputList &ol)
 {
-  if (classSDict) classSDict->writeDocumentation(ol,this);
+  if (m_classSDict) m_classSDict->writeDocumentation(ol,this);
 }
 
 void FileDef::startMemberDeclarations(OutputList &ol)
@@ -457,10 +457,10 @@ void FileDef::endMemberDocumentation(OutputList &ol)
 void FileDef::writeMemberGroups(OutputList &ol)
 {
   /* write user defined member groups */
-  if (memberGroupSDict)
+  if (m_memberGroupSDict)
   {
-    memberGroupSDict->sort();
-    MemberGroupSDict::Iterator mgli(*memberGroupSDict);
+    m_memberGroupSDict->sort();
+    MemberGroupSDict::Iterator mgli(*m_memberGroupSDict);
     MemberGroup *mg;
     for (;(mg=mgli.current());++mgli)
     {
@@ -496,8 +496,10 @@ void FileDef::writeSummaryLinks(OutputList &ol)
   SrcLangExt lang=getLanguage();
   for (eli.toFirst();(lde=eli.current());++eli)
   {
-    if ((lde->kind()==LayoutDocEntry::FileClasses && classSDict && classSDict->declVisible()) || 
-        (lde->kind()==LayoutDocEntry::FileNamespaces && namespaceSDict && namespaceSDict->declVisible())
+    if ((lde->kind()==LayoutDocEntry::FileClasses && 
+         m_classSDict && m_classSDict->declVisible()) || 
+        (lde->kind()==LayoutDocEntry::FileNamespaces && 
+         m_namespaceSDict && m_namespaceSDict->declVisible())
        )
     {
       LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
@@ -540,12 +542,12 @@ void FileDef::writeDocumentation(OutputList &ol)
   //printf("WriteDocumentation diskname=%s\n",diskname.data());
   
   QCString versionTitle;
-  if (!fileVersion.isEmpty())
+  if (!m_fileVersion.isEmpty())
   {
-    versionTitle=("("+fileVersion+")");
+    versionTitle=("("+m_fileVersion+")");
   }
-  QCString title = docname+versionTitle;
-  QCString pageTitle=theTranslator->trFileReference(docname);
+  QCString title = m_docname+versionTitle;
+  QCString pageTitle=theTranslator->trFileReference(m_docname);
 
   if (getDirDef())
   {
@@ -582,7 +584,7 @@ void FileDef::writeDocumentation(OutputList &ol)
 
   ol.startContents();
 
-  if (!fileVersion.isEmpty())
+  if (!m_fileVersion.isEmpty())
   {
     ol.disableAllBut(OutputGenerator::Html);
     ol.startProjectNumber();
@@ -644,9 +646,15 @@ void FileDef::writeDocumentation(OutputList &ol)
       case LayoutDocEntry::FileNamespaces: 
         {
           LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
-          writeNamespaceDeclarations(ol,ls->title(lang));
+          writeNamespaceDeclarations(ol,ls->title(lang),false);
         }
         break; 
+      case LayoutDocEntry::FileConstantGroups:
+        {
+          LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
+          writeNamespaceDeclarations(ol,ls->title(lang),true);
+        }
+        break;
       case LayoutDocEntry::MemberGroups: 
         writeMemberGroups(ol);
         break; 
@@ -691,6 +699,7 @@ void FileDef::writeDocumentation(OutputList &ol)
       case LayoutDocEntry::ClassUsedFiles:
       case LayoutDocEntry::ClassInlineClasses:
       case LayoutDocEntry::NamespaceNestedNamespaces:
+      case LayoutDocEntry::NamespaceNestedConstantGroups:
       case LayoutDocEntry::NamespaceClasses:
       case LayoutDocEntry::NamespaceInlineClasses:
       case LayoutDocEntry::GroupClasses: 
@@ -792,15 +801,15 @@ void FileDef::writeQuickMemberLinks(OutputList &ol,MemberDef *currentMd) const
 }
 
 /*! Write a source listing of this file to the output */
-void FileDef::writeSource(OutputList &ol)
+void FileDef::writeSource(OutputList &ol,bool sameTu,QStrList &filesInSameTu)
 {
-  static bool generateTreeView = Config_getBool("GENERATE_TREEVIEW");
+  static bool generateTreeView  = Config_getBool("GENERATE_TREEVIEW");
   static bool filterSourceFiles = Config_getBool("FILTER_SOURCE_FILES");
   static bool latexSourceCode   = Config_getBool("LATEX_SOURCE_CODE");
-  QCString title = docname;
-  if (!fileVersion.isEmpty())
+  QCString title = m_docname;
+  if (!m_fileVersion.isEmpty())
   {
-    title+=(" ("+fileVersion+")");
+    title+=(" ("+m_fileVersion+")");
   }
   QCString pageTitle = theTranslator->trSourceFile(title);
   ol.disable(OutputGenerator::Man);
@@ -843,30 +852,83 @@ void FileDef::writeSource(OutputList &ol)
     if (latexSourceCode) ol.enable(OutputGenerator::Latex);
   }
 
-  ParserInterface *pIntf = Doxygen::parserManager->getParser(getDefFileExtension());
-  pIntf->resetCodeParserState();
-  ol.startCodeFragment();
-  pIntf->parseCode(ol,0,
-            fileToString(absFilePath(),filterSourceFiles,TRUE),
-            FALSE,0,this
-           );
-  ol.endCodeFragment();
+  (void)sameTu;
+  (void)filesInSameTu;
+#if USE_LIBCLANG
+  static bool clangAssistedParsing = Config_getBool("CLANG_ASSISTED_PARSING");
+  if (clangAssistedParsing && 
+      (getLanguage()==SrcLangExt_Cpp || getLanguage()==SrcLangExt_ObjC))
+  {
+    ol.startCodeFragment();
+    if (!sameTu)
+    {
+      ClangParser::instance()->start(absFilePath(),filesInSameTu);
+    }
+    else
+    {
+      ClangParser::instance()->switchToFile(absFilePath());
+    }
+    ClangParser::instance()->writeSources(ol,this);
+    ol.endCodeFragment();
+  }
+  else
+#endif
+  {
+    ParserInterface *pIntf = Doxygen::parserManager->getParser(getDefFileExtension());
+    pIntf->resetCodeParserState();
+    ol.startCodeFragment();
+    pIntf->parseCode(ol,0,
+        fileToString(absFilePath(),filterSourceFiles,TRUE),
+        FALSE,0,this
+        );
+    ol.endCodeFragment();
+  }
   ol.endContents();
   endFileWithNavPath(this,ol);
   ol.enableAll();
 }
 
-void FileDef::parseSource()
+void FileDef::parseSource(bool sameTu,QStrList &filesInSameTu)
 {
   static bool filterSourceFiles = Config_getBool("FILTER_SOURCE_FILES");
   DevNullCodeDocInterface devNullIntf;
-  ParserInterface *pIntf = Doxygen::parserManager->getParser(getDefFileExtension());
-  pIntf->resetCodeParserState();
-  pIntf->parseCode(
+  (void)sameTu;
+  (void)filesInSameTu;
+#if USE_LIBCLANG
+  static bool clangAssistedParsing = Config_getBool("CLANG_ASSISTED_PARSING");
+  if (clangAssistedParsing && 
+      (getLanguage()==SrcLangExt_Cpp || getLanguage()==SrcLangExt_ObjC))
+  {
+    if (!sameTu)
+    {
+      ClangParser::instance()->start(absFilePath(),filesInSameTu);
+    }
+    else
+    {
+      ClangParser::instance()->switchToFile(absFilePath());
+    }
+    ClangParser::instance()->writeSources(devNullIntf,this);
+  }
+  else
+#endif
+  {
+    ParserInterface *pIntf = Doxygen::parserManager->getParser(getDefFileExtension());
+    pIntf->resetCodeParserState();
+    pIntf->parseCode(
             devNullIntf,0,
             fileToString(absFilePath(),filterSourceFiles,TRUE),
             FALSE,0,this
            );
+  }
+}
+
+void FileDef::startParsing()
+{
+}
+
+void FileDef::finishParsing()
+{
+  ClangParser::instance()->finish();
 }
 
 void FileDef::addMembersToMemberGroup()
@@ -877,14 +939,14 @@ void FileDef::addMembersToMemberGroup()
   {
     if (ml->listType()&MemberListType_declarationLists)
     {
-      ::addMembersToMemberGroup(ml,&memberGroupSDict,this);
+      ::addMembersToMemberGroup(ml,&m_memberGroupSDict,this);
     }
   }
 
   // add members inside sections to their groups
-  if (memberGroupSDict)
+  if (m_memberGroupSDict)
   {
-    MemberGroupSDict::Iterator mgli(*memberGroupSDict);
+    MemberGroupSDict::Iterator mgli(*m_memberGroupSDict);
     MemberGroup *mg;
     for (;(mg=mgli.current());++mgli)
     {
@@ -955,14 +1017,18 @@ void FileDef::insertMember(MemberDef *md)
 void FileDef::insertClass(ClassDef *cd)
 {
   if (cd->isHidden()) return;
-  if (classSDict==0)
+  if (m_classSDict==0)
   {
-    classSDict = new ClassSDict(17);
+    m_classSDict = new ClassSDict(17);
   }
   if (Config_getBool("SORT_BRIEF_DOCS"))
-    classSDict->inSort(cd->name(),cd);
+  {
+    m_classSDict->inSort(cd->name(),cd);
+  }
   else
-    classSDict->append(cd->name(),cd);
+  {
+    m_classSDict->append(cd->name(),cd);
+  }
 }
 
 /*! Adds namespace definition \a nd to the list of all compounds of this file */
@@ -970,23 +1036,27 @@ void FileDef::insertNamespace(NamespaceDef *nd)
 {
   if (nd->isHidden()) return;
   if (!nd->name().isEmpty() && 
-      (namespaceSDict==0 || namespaceSDict->find(nd->name())==0))
+      (m_namespaceSDict==0 || m_namespaceSDict->find(nd->name())==0))
   {
-    if (namespaceSDict==0)
+    if (m_namespaceSDict==0)
     {
-      namespaceSDict = new NamespaceSDict;
+      m_namespaceSDict = new NamespaceSDict;
     }
     if (Config_getBool("SORT_BRIEF_DOCS"))
-      namespaceSDict->inSort(nd->name(),nd);
+    {
+      m_namespaceSDict->inSort(nd->name(),nd);
+    }
     else
-      namespaceSDict->append(nd->name(),nd);
+    {
+      m_namespaceSDict->append(nd->name(),nd);
+    }
   }
 }
 
 QCString FileDef::name() const 
 { 
   if (Config_getBool("FULL_PATH_NAMES")) 
-    return filename; 
+    return m_fileName; 
   else 
     return Definition::name(); 
 } 
@@ -996,45 +1066,47 @@ void FileDef::addSourceRef(int line,Definition *d,MemberDef *md)
   //printf("FileDef::addSourceDef(%d,%p,%p)\n",line,d,md);
   if (d)
   {
-    if (srcDefDict==0)    srcDefDict    = new QIntDict<Definition>(257);
-    if (srcMemberDict==0) srcMemberDict = new QIntDict<MemberDef>(257);
-    srcDefDict->insert(line,d);
-    if (md) srcMemberDict->insert(line,md);
+    if (m_srcDefDict==0)    m_srcDefDict    = new QIntDict<Definition>(257);
+    if (m_srcMemberDict==0) m_srcMemberDict = new QIntDict<MemberDef>(257);
+    m_srcDefDict->insert(line,d);
+    if (md) m_srcMemberDict->insert(line,md);
     //printf("Adding member %s with anchor %s at line %d to file %s\n",
     //    md?md->name().data():"<none>",md?md->anchor().data():"<none>",line,name().data());
   }
 }
 
-Definition *FileDef::getSourceDefinition(int lineNr)
+Definition *FileDef::getSourceDefinition(int lineNr) const
 {
   Definition *result=0;
-  if (srcDefDict)
+  if (m_srcDefDict)
   {
-    result = srcDefDict->find(lineNr);
+    result = m_srcDefDict->find(lineNr);
   }
+  //printf("%s::getSourceDefinition(%d)=%s\n",name().data(),lineNr,result?result->name().data():"none");
   return result;
 }
 
-MemberDef *FileDef::getSourceMember(int lineNr)
+MemberDef *FileDef::getSourceMember(int lineNr) const
 {
   MemberDef *result=0;
-  if (srcMemberDict)
+  if (m_srcMemberDict)
   {
-    result = srcMemberDict->find(lineNr);
+    result = m_srcMemberDict->find(lineNr);
   }
+  //printf("%s::getSourceMember(%d)=%s\n",name().data(),lineNr,result?result->name().data():"none");
   return result;
 }
 
 
 void FileDef::addUsingDirective(NamespaceDef *nd)
 {
-  if (usingDirList==0)
+  if (m_usingDirList==0)
   {
-    usingDirList = new NamespaceSDict;
+    m_usingDirList = new NamespaceSDict;
   }
-  if (usingDirList->find(nd->qualifiedName())==0)
+  if (m_usingDirList->find(nd->qualifiedName())==0)
   {
-    usingDirList->append(nd->qualifiedName(),nd);
+    m_usingDirList->append(nd->qualifiedName(),nd);
   }
   //printf("%p: FileDef::addUsingDirective: %s:%d\n",this,name().data(),usingDirList->count());
 }
@@ -1042,18 +1114,18 @@ void FileDef::addUsingDirective(NamespaceDef *nd)
 NamespaceSDict *FileDef::getUsedNamespaces() const 
 { 
   //printf("%p: FileDef::getUsedNamespace: %s:%d\n",this,name().data(),usingDirList?usingDirList->count():0);
-  return usingDirList; 
+  return m_usingDirList; 
 }
 
 void FileDef::addUsingDeclaration(Definition *d)
 {
-  if (usingDeclList==0)
+  if (m_usingDeclList==0)
   {
-    usingDeclList = new SDict<Definition>(17);
+    m_usingDeclList = new SDict<Definition>(17);
   }
-  if (usingDeclList->find(d->qualifiedName())==0)
+  if (m_usingDeclList->find(d->qualifiedName())==0)
   {
-    usingDeclList->append(d->qualifiedName(),d);
+    m_usingDeclList->append(d->qualifiedName(),d);
   }
 }
 
@@ -1062,13 +1134,13 @@ void FileDef::addIncludeDependency(FileDef *fd,const char *incName,bool local,
 {
   //printf("FileDef::addIncludeDependency(%p,%s,%d)\n",fd,incName,local);
   QCString iName = fd ? fd->absFilePath().data() : incName;
-  if (!iName.isEmpty() && (!includeDict || includeDict->find(iName)==0))
+  if (!iName.isEmpty() && (!m_includeDict || m_includeDict->find(iName)==0))
   {
-    if (includeDict==0)
+    if (m_includeDict==0)
     {
-      includeDict   = new QDict<IncludeInfo>(61);
-      includeList   = new QList<IncludeInfo>;
-      includeList->setAutoDelete(TRUE);
+      m_includeDict   = new QDict<IncludeInfo>(61);
+      m_includeList   = new QList<IncludeInfo>;
+      m_includeList->setAutoDelete(TRUE);
     }
     IncludeInfo *ii = new IncludeInfo;
     ii->fileDef     = fd;
@@ -1076,8 +1148,8 @@ void FileDef::addIncludeDependency(FileDef *fd,const char *incName,bool local,
     ii->local       = local;
     ii->imported    = imported;
     ii->indirect    = indirect;
-    includeList->append(ii);
-    includeDict->insert(iName,ii);
+    m_includeList->append(ii);
+    m_includeDict->insert(iName,ii);
   }
 }
 
@@ -1088,10 +1160,10 @@ void FileDef::addIncludedUsingDirectives()
   //printf("( FileDef::addIncludedUsingDirectives for file %s\n",name().data());
 
   NamespaceList nl;
-  if (includeList) // file contains #includes
+  if (m_includeList) // file contains #includes
   {
     {
-      QListIterator<IncludeInfo> iii(*includeList);
+      QListIterator<IncludeInfo> iii(*m_includeList);
       IncludeInfo *ii;
       for (iii.toFirst();(ii=iii.current());++iii) // foreach #include...
       {
@@ -1103,7 +1175,7 @@ void FileDef::addIncludedUsingDirectives()
       }
     }
     {
-      QListIterator<IncludeInfo> iii(*includeList);
+      QListIterator<IncludeInfo> iii(*m_includeList);
       IncludeInfo *ii;
       // iterate through list from last to first
       for (iii.toLast();(ii=iii.current());--iii)
@@ -1111,7 +1183,7 @@ void FileDef::addIncludedUsingDirectives()
         if (ii->fileDef && ii->fileDef!=this)
         {
           // add using directives
-          NamespaceSDict *unl = ii->fileDef->usingDirList;
+          NamespaceSDict *unl = ii->fileDef->m_usingDirList;
           if (unl)
           {
             NamespaceSDict::Iterator nli(*unl);
@@ -1119,17 +1191,17 @@ void FileDef::addIncludedUsingDirectives()
             for (nli.toLast();(nd=nli.current());--nli)
             {
               // append each using directive found in a #include file
-              if (usingDirList==0) usingDirList = new NamespaceSDict;
+              if (m_usingDirList==0) m_usingDirList = new NamespaceSDict;
               //printf("Prepending used namespace %s to the list of file %s\n",
               //    nd->name().data(),name().data());
-              if (usingDirList->find(nd->qualifiedName())==0) // not yet added
+              if (m_usingDirList->find(nd->qualifiedName())==0) // not yet added
               {
-                usingDirList->prepend(nd->qualifiedName(),nd);
+                m_usingDirList->prepend(nd->qualifiedName(),nd);
               }
             }
           }
           // add using declarations
-          SDict<Definition> *udl = ii->fileDef->usingDeclList;
+          SDict<Definition> *udl = ii->fileDef->m_usingDeclList;
           if (udl)
           {
             SDict<Definition>::Iterator udi(*udl);
@@ -1137,13 +1209,13 @@ void FileDef::addIncludedUsingDirectives()
             for (udi.toLast();(d=udi.current());--udi)
             {
               //printf("Adding using declaration %s\n",d->name().data());
-              if (usingDeclList==0)
+              if (m_usingDeclList==0)
               {
-                usingDeclList = new SDict<Definition>(17);
+                m_usingDeclList = new SDict<Definition>(17);
               }
-              if (usingDeclList->find(d->qualifiedName())==0)
+              if (m_usingDeclList->find(d->qualifiedName())==0)
               {
-                usingDeclList->prepend(d->qualifiedName(),d);
+                m_usingDeclList->prepend(d->qualifiedName(),d);
               }
             }
           }
@@ -1160,13 +1232,13 @@ void FileDef::addIncludedByDependency(FileDef *fd,const char *incName,
 {
   //printf("FileDef::addIncludedByDependency(%p,%s,%d)\n",fd,incName,local);
   QCString iName = fd ? fd->absFilePath().data() : incName;
-  if (!iName.isEmpty() && (includedByDict==0 || includedByDict->find(iName)==0))
+  if (!iName.isEmpty() && (m_includedByDict==0 || m_includedByDict->find(iName)==0))
   {
-    if (includedByDict==0)
+    if (m_includedByDict==0)
     {
-      includedByDict = new QDict<IncludeInfo>(61);
-      includedByList = new QList<IncludeInfo>;
-      includedByList->setAutoDelete(TRUE);
+      m_includedByDict = new QDict<IncludeInfo>(61);
+      m_includedByList = new QList<IncludeInfo>;
+      m_includedByList->setAutoDelete(TRUE);
     }
     IncludeInfo *ii = new IncludeInfo;
     ii->fileDef     = fd;
@@ -1174,15 +1246,15 @@ void FileDef::addIncludedByDependency(FileDef *fd,const char *incName,
     ii->local       = local;
     ii->imported    = imported;
     ii->indirect    = FALSE;
-    includedByList->append(ii);
-    includedByDict->insert(iName,ii);
+    m_includedByList->append(ii);
+    m_includedByDict->insert(iName,ii);
   }
 }
 
 bool FileDef::isIncluded(const QCString &name) const
 {
   if (name.isEmpty()) return FALSE;
-  return includeDict!=0 && includeDict->find(name)!=0;
+  return m_includeDict!=0 && m_includeDict->find(name)!=0;
 }
 
 bool FileDef::generateSourceFile() const 
@@ -1202,17 +1274,17 @@ bool FileDef::generateSourceFile() const
 void FileDef::addListReferences()
 {
   {
-    LockingPtr< QList<ListItemInfo> > xrefItems = xrefListItems();
-    addRefItem(xrefItems.pointer(),
+    QList<ListItemInfo> *xrefItems = xrefListItems();
+    addRefItem(xrefItems,
                getOutputFileBase(),
                theTranslator->trFile(TRUE,TRUE),
                getOutputFileBase(),name(),
                0
               );
   }
-  if (memberGroupSDict)
+  if (m_memberGroupSDict)
   {
-    MemberGroupSDict::Iterator mgli(*memberGroupSDict);
+    MemberGroupSDict::Iterator mgli(*m_memberGroupSDict);
     MemberGroup *mg;
     for (;(mg=mgli.current());++mgli)
     {
@@ -1481,9 +1553,9 @@ void FileDef::combineUsingRelations()
 {
   if (visited) return; // already done
   visited=TRUE;
-  if (usingDirList)
+  if (m_usingDirList)
   {
-    NamespaceSDict::Iterator nli(*usingDirList);
+    NamespaceSDict::Iterator nli(*m_usingDirList);
     NamespaceDef *nd;
     for (nli.toFirst();(nd=nli.current());++nli)
     {
@@ -1529,24 +1601,24 @@ bool FileDef::isDocumentationFile() const
 void FileDef::acquireFileVersion()
 {
   QCString vercmd = Config_getString("FILE_VERSION_FILTER");
-  if (!vercmd.isEmpty() && !filepath.isEmpty() && filepath!="generated") 
+  if (!vercmd.isEmpty() && !m_filePath.isEmpty() && m_filePath!="generated") 
   {
-    msg("Version of %s : ",filepath.data());
-    QCString cmd = vercmd+" \""+filepath+"\"";
+    msg("Version of %s : ",m_filePath.data());
+    QCString cmd = vercmd+" \""+m_filePath+"\"";
     Debug::print(Debug::ExtCmd,0,"Executing popen(`%s`)\n",cmd.data());
     FILE *f=portable_popen(cmd,"r");
     if (!f)
     {
-      err("error: could not execute %s\n",vercmd.data());
+      err("could not execute %s\n",vercmd.data());
       return;
     }
     const int bufSize=1024;
     char buf[bufSize];
     int numRead = (int)fread(buf,1,bufSize,f);
     portable_pclose(f);
-    if (numRead>0 && !(fileVersion=QCString(buf,numRead).stripWhiteSpace()).isEmpty())
+    if (numRead>0 && !(m_fileVersion=QCString(buf,numRead).stripWhiteSpace()).isEmpty())
     {
-      msg("%s\n",fileVersion.data());
+      msg("%s\n",m_fileVersion.data());
     }
     else 
     {
@@ -1560,11 +1632,11 @@ QCString FileDef::getSourceFileBase() const
 { 
   if (Htags::useHtags)
   {
-    return Htags::path2URL(filepath);
+    return Htags::path2URL(m_filePath);
   }
   else
   {
-    return convertNameToFile(diskname)+"_source"; 
+    return convertNameToFile(m_diskName)+"_source"; 
   }
 }
 
@@ -1573,11 +1645,11 @@ QCString FileDef::includeName() const
 { 
   if (Htags::useHtags)
   {
-    return Htags::path2URL(filepath);
+    return Htags::path2URL(m_filePath);
   }
   else
   {
-    return convertNameToFile(diskname)+"_source"; 
+    return convertNameToFile(m_diskName)+"_source"; 
   }
 }
 
@@ -1659,7 +1731,7 @@ void FileDef::writeMemberDeclarations(OutputList &ol,MemberListType lt,const QCS
     }
     else
     {
-      ml->writeDeclarations(ol,0,0,this,0,title,0);
+      ml->writeDeclarations(ol,0,0,this,0,title,0,definitionType());
     }
   }
 }
@@ -1676,42 +1748,29 @@ bool FileDef::isLinkableInProject() const
   return hasDocumentation() && !isReference() && showFiles;
 }
 
-#if 0
-bool FileDef::includes(FileDef *incFile,QDict<FileDef> *includedFiles) const
+static void getAllIncludeFilesRecursively(
+    QDict<void> *filesVisited,const FileDef *fd,QStrList &incFiles)
 {
-  //printf("%s::includes(%s)\n",name().data(),incFile->name().data());
-  if (incFile==this) return TRUE;
-  includedFiles->insert(absFilePath(),this);
-  if (includeList)
+  if (fd->includeFileList())
   {
-    QListIterator<IncludeInfo> ili(*includeList);
+    QListIterator<IncludeInfo> iii(*fd->includeFileList());
     IncludeInfo *ii;
-    for (;(ii=ili.current());++ili)
+    for (iii.toFirst();(ii=iii.current());++iii)
     {
-      //printf("ii=%s\n",ii->includeName.data());
-      if ((ii->fileDef && 
-           includedFiles->find(ii->fileDef->absFilePath())==0 &&
-           ii->fileDef->includes(incFile,includedFiles)
-          ) ||
-          incFile->absFilePath()==ii->includeName
-         ) return TRUE;
+      if (ii->fileDef && !ii->fileDef->isReference() &&
+          !filesVisited->find(ii->fileDef->absFilePath()))
+      {
+        //printf("FileDef::addIncludeDependency(%s)\n",ii->fileDef->absFilePath().data());
+        incFiles.append(ii->fileDef->absFilePath());
+        filesVisited->insert(ii->fileDef->absFilePath(),(void*)0x8);
+        getAllIncludeFilesRecursively(filesVisited,ii->fileDef,incFiles);
+      }
     }
   }
-  return FALSE;
 }
 
-bool FileDef::includesByName(const QCString &fileName) const
+void FileDef::getAllIncludeFilesRecursively(QStrList &incFiles) const
 {
-  if (includeList)
-  {
-    QListIterator<IncludeInfo> ili(*includeList);
-    IncludeInfo *ii;
-    for (;(ii=ili.current());++ili)
-    {
-      //printf("ii=%s\n",ii->includeName.data());
-      if (fileName==ii->includeName) return TRUE;
-    }
-  }
-  return FALSE;
+  QDict<void> includes(257);
+  ::getAllIncludeFilesRecursively(&includes,this,incFiles);
 }
-#endif
index adf0f49..f6e5bad 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -69,20 +69,22 @@ class FileDef : public Definition
 
     FileDef(const char *p,const char *n,const char *ref=0,const char *dn=0);
    ~FileDef();
+
+    // ----------------------------------------------------------------------
+
     DefType definitionType() const { return TypeFile; }
 
     /*! Returns the unique file name (this may include part of the path). */
     QCString name() const;
     QCString displayName(bool=TRUE) const { return name(); }
-    QCString fileName() const { return filename; }
+    QCString fileName() const { return m_fileName; }
     
     QCString getOutputFileBase() const 
-    { return convertNameToFile(diskname); }
-    QCString anchor() const
-    { return QCString(); }
+    { return convertNameToFile(m_diskName); }
 
-    QCString getFileBase() const
-    { return diskname; }
+    QCString anchor() const { return QCString(); }
+
+    QCString getFileBase() const { return m_diskName; }
 
     QCString getSourceFileBase() const;
     
@@ -90,59 +92,71 @@ class FileDef : public Definition
     QCString includeName() const;
     
     /*! Returns the absolute path including the file name. */
-    QCString absFilePath() const { return filepath; }
-    
+    QCString absFilePath() const { return m_filePath; }
     
     /*! Returns the name as it is used in the documentation */
-    QCString docName() const { return docname; }
-    
-    void addSourceRef(int line,Definition *d,MemberDef *md);
-    Definition *getSourceDefinition(int lineNr);
-    MemberDef *getSourceMember(int lineNr);
+    QCString docName() const { return m_docname; }
 
-    /* Sets the name of the include file to \a n. */
-    //void setIncludeName(const char *n_) { incName=n_; }
+    /*! Returns TRUE if this file is a source file. */
+    bool isSource() const { return m_isSource; }
+
+    bool isDocumentationFile() const;
     
+    Definition *getSourceDefinition(int lineNr) const;
+    MemberDef *getSourceMember(int lineNr) const;
+
     /*! Returns the absolute path of this file. */ 
-    QCString getPath() const { return path; }
+    QCString getPath() const { return m_path; }
 
     /*! Returns version of this file. */
-    QCString getVersion() const { return fileVersion; }
+    QCString getVersion() const { return m_fileVersion; }
     
     bool isLinkableInProject() const;
 
-    bool isLinkable() const
-    {
-      return isLinkableInProject() || isReference();
-    }
+    bool isLinkable() const { return isLinkableInProject() || isReference(); }
     bool isIncluded(const QCString &name) const;
 
-    //bool isJava() const { return m_isJava; }
-    //bool isCSharp() const { return m_isCSharp; }
+    PackageDef *packageDef() const { return m_package; }
+    DirDef *getDirDef() const      { return m_dir; }
+    NamespaceSDict *getUsedNamespaces() const;
+    SDict<Definition> *getUsedClasses() const      { return m_usingDeclList; }
+    QList<IncludeInfo> *includeFileList() const    { return m_includeList; }
+    QList<IncludeInfo> *includedByFileList() const { return m_includedByList; }
+    void getAllIncludeFilesRecursively(QStrList &incFiles) const;
+
+    MemberList *getMemberList(MemberListType lt) const;
+    const QList<MemberList> &getMemberLists() const { return m_memberLists; }
+
+    /* user defined member groups */
+    MemberGroupSDict *getMemberGroupSDict() const { return m_memberGroupSDict; }
+    NamespaceSDict *getNamespaceSDict() const     { return m_namespaceSDict; }
+    ClassSDict *getClassSDict() const             { return m_classSDict; }
+    
+    //---------------------------------
+
+    void addSourceRef(int line,Definition *d,MemberDef *md);
 
     void writeDocumentation(OutputList &ol);
     void writeMemberPages(OutputList &ol);
     void writeQuickMemberLinks(OutputList &ol,MemberDef *currentMd) const;
     void writeSummaryLinks(OutputList &ol);
 
-    void writeSource(OutputList &ol);
-    void parseSource();
+    void startParsing();
+    void writeSource(OutputList &ol,bool sameTu,QStrList &filesInSameTu);
+    void parseSource(bool sameTu,QStrList &filesInSameTu);
+    void finishParsing();
+
     friend void generatedFileNames();
     void insertMember(MemberDef *md);
     void insertClass(ClassDef *cd);
     void insertNamespace(NamespaceDef *nd);
     void computeAnchors();
 
-    void setPackageDef(PackageDef *pd) { package=pd; }
-    PackageDef *packageDef() const { return package; }
-    
-    void setDirDef(DirDef *dd) { dir=dd; }
-    DirDef *getDirDef() const { return dir; }
+    void setPackageDef(PackageDef *pd) { m_package=pd; }
+    void setDirDef(DirDef *dd) { m_dir=dd; }
 
     void addUsingDirective(NamespaceDef *nd);
-    NamespaceSDict *getUsedNamespaces() const;
     void addUsingDeclaration(Definition *def);
-    SDict<Definition> *getUsedClasses() const { return usingDeclList; }
     void combineUsingRelations();
 
     bool generateSourceFile() const;
@@ -150,8 +164,6 @@ class FileDef : public Definition
 
     void addIncludeDependency(FileDef *fd,const char *incName,bool local,bool imported,bool indirect);
     void addIncludedByDependency(FileDef *fd,const char *incName,bool local,bool imported);
-    QList<IncludeInfo> *includeFileList() const { return includeList; }
-    QList<IncludeInfo> *includedByFileList() const { return includedByList; }
 
     void addMembersToMemberGroup();
     void distributeMemberGroupDocumentation();
@@ -159,18 +171,8 @@ class FileDef : public Definition
     void addIncludedUsingDirectives();
 
     void addListReferences();
-    bool isDocumentationFile() const;
     //bool includes(FileDef *incFile,QDict<FileDef> *includedFiles) const;
     //bool includesByName(const QCString &name) const;
-
-    MemberList *getMemberList(MemberListType lt) const;
-    const QList<MemberList> &getMemberLists() const { return m_memberLists; }
-
-    /* user defined member groups */
-    MemberGroupSDict *getMemberGroupSDict() const { return memberGroupSDict; }
-    NamespaceSDict *getNamespaceSDict() const     { return namespaceSDict; }
-    ClassSDict *getClassSDict() const             { return classSDict; }
-    
     bool visited;
 
   protected:
@@ -190,7 +192,8 @@ class FileDef : public Definition
     void writeMemberGroups(OutputList &ol);
     void writeAuthorSection(OutputList &ol);
     void writeSourceLink(OutputList &ol);
-    void writeNamespaceDeclarations(OutputList &ol,const QCString &title);
+    void writeNamespaceDeclarations(OutputList &ol,const QCString &title,
+            bool isConstantGroup);
     void writeClassDeclarations(OutputList &ol,const QCString &title);
     void writeInlineClasses(OutputList &ol);
     void startMemberDeclarations(OutputList &ol);
@@ -200,27 +203,27 @@ class FileDef : public Definition
     void writeDetailedDescription(OutputList &ol,const QCString &title);
     void writeBriefDescription(OutputList &ol);
 
-    QDict<IncludeInfo>   *includeDict;
-    QList<IncludeInfo>   *includeList;
-    QDict<IncludeInfo>   *includedByDict;
-    QList<IncludeInfo>   *includedByList;
-    NamespaceSDict       *usingDirList;
-    SDict<Definition>    *usingDeclList;
-    QCString              path;
-    QCString              filepath;
-    QCString              diskname;
-    QCString              filename;
-    QCString              docname;
-    QIntDict<Definition> *srcDefDict;
-    QIntDict<MemberDef>  *srcMemberDict;
-    bool                  isSource;
-    QCString              fileVersion;
-    PackageDef           *package;
-    DirDef               *dir;
+    QDict<IncludeInfo>   *m_includeDict;
+    QList<IncludeInfo>   *m_includeList;
+    QDict<IncludeInfo>   *m_includedByDict;
+    QList<IncludeInfo>   *m_includedByList;
+    NamespaceSDict       *m_usingDirList;
+    SDict<Definition>    *m_usingDeclList;
+    QCString              m_path;
+    QCString              m_filePath;
+    QCString              m_diskName;
+    QCString              m_fileName;
+    QCString              m_docname;
+    QIntDict<Definition> *m_srcDefDict;
+    QIntDict<MemberDef>  *m_srcMemberDict;
+    bool                  m_isSource;
+    QCString              m_fileVersion;
+    PackageDef           *m_package;
+    DirDef               *m_dir;
     QList<MemberList>     m_memberLists;
-    MemberGroupSDict     *memberGroupSDict;
-    NamespaceSDict       *namespaceSDict;
-    ClassSDict           *classSDict;
+    MemberGroupSDict     *m_memberGroupSDict;
+    NamespaceSDict       *m_namespaceSDict;
+    ClassSDict           *m_classSDict;
     bool                  m_subGrouping;
 };
 
@@ -236,7 +239,7 @@ class FileList : public QList<FileDef>
     {
       FileDef *md1 = (FileDef *)item1;
       FileDef *md2 = (FileDef *)item2;
-      return stricmp(md1->name(),md2->name());
+      return qstricmp(md1->name(),md2->name());
     }
   private:
     QCString m_pathName;
@@ -251,7 +254,7 @@ class OutputNameList : public QList<FileList>
     {
       FileList *fl1 = (FileList *)item1;
       FileList *fl2 = (FileList *)item2;
-      return stricmp(fl1->path(),fl2->path());
+      return qstricmp(fl1->path(),fl2->path());
     }
 };
 
index 2b0dffe..da0dccc 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -48,7 +48,7 @@ void FileName::generateDiskNames()
     while (fd && fd->isReference()) fd=next();
     // name if unique, so diskname is simply the name
     //printf("!!!!!!!! Unique disk name=%s for fd=%s\n",name.data(),fd->diskname.data());
-    fd->diskname=name.copy();
+    fd->m_diskName=name;
   }
   else if (count>1) // multiple occurrences of the same file name
   {
@@ -59,7 +59,7 @@ void FileName::generateDiskNames()
     {
       fd=first();
       while (fd && fd->isReference()) fd=next();
-      char c=fd->path.at(i);
+      char c=fd->m_path.at(i);
       if (c=='/') j=i; // remember last position of dirname
       fd=next();
       while (fd && !found)
@@ -67,13 +67,13 @@ void FileName::generateDiskNames()
         if (!fd->isReference())
         {
           //printf("i=%d j=%d fd->path=`%s' fd->name=`%s'\n",i,j,fd->path.left(i).data(),fd->name().data());
-          if (i==(int)fd->path.length())
+          if (i==(int)fd->m_path.length())
           {
-            //warning("Warning: Input file %s found multiple times!\n"
+            //warning("Input file %s found multiple times!\n"
             //        "         The generated documentation for this file may not be correct!\n",fd->absFilePath().data());
             found=TRUE;
           }
-          else if (fd->path[i]!=c)
+          else if (fd->m_path[i]!=c)
           {
             found=TRUE;  
           }
@@ -88,10 +88,10 @@ void FileName::generateDiskNames()
       //printf("fd->setName(%s)\n",(fd->path.right(fd->path.length()-j-1)+name).data());
       if (!fd->isReference())
       {
-        QCString prefix = fd->path.right(fd->path.length()-j-1);
+        QCString prefix = fd->m_path.right(fd->m_path.length()-j-1);
         fd->setName(prefix+name);
         //printf("!!!!!!!! non unique disk name=%s for fd=%s\n",(prefix+name).data(),fd->diskname.data());
-        fd->diskname=prefix+name;
+        fd->m_diskName=prefix+name;
       }
       fd=next();
     }
@@ -102,7 +102,7 @@ int FileName::compareItems(QCollection::Item item1, QCollection::Item item2)
 {
   FileName *f1=(FileName *)item1;
   FileName *f2=(FileName *)item2;
-  return stricmp(f1->fileName(),f2->fileName());
+  return qstricmp(f1->fileName(),f2->fileName());
 }
 
 FileNameIterator::FileNameIterator(const FileName &fname) :
@@ -135,8 +135,8 @@ int FileNameList::compareItems(QCollection::Item item1, QCollection::Item item2)
   //printf("FileNameList::compareItems `%s'<->`%s'\n",
   //    f1->fileName(),f2->fileName());
   return Config_getBool("FULL_PATH_NAMES") ?
-         stricmp(f1->fullName(),f2->fullName()) :
-         stricmp(f1->fileName(),f2->fileName());
+         qstricmp(f1->fullName(),f2->fullName()) :
+         qstricmp(f1->fileName(),f2->fileName());
 }
 
 FileNameListIterator::FileNameListIterator(const FileNameList &fnlist) :
index e038659..1cd160c 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index ddffeda..a6ee5b4 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 80222ad..d2aa9e6 100644 (file)
@@ -5,14 +5,14 @@
     $navpath
     <li class="footer">$generatedby
     <a href="http://www.doxygen.org/index.html">
-    <img class="footer" src="$relpath$doxygen.png" alt="doxygen"/></a> $doxygenversion </li>
+    <img class="footer" src="$relpath^doxygen.png" alt="doxygen"/></a> $doxygenversion </li>
   </ul>
 </div>
 <!--END GENERATE_TREEVIEW-->
 <!--BEGIN !GENERATE_TREEVIEW-->
 <hr class="footer"/><address class="footer"><small>
 $generatedby &#160;<a href="http://www.doxygen.org/index.html">
-<img class="footer" src="$relpath$doxygen.png" alt="doxygen"/>
+<img class="footer" src="$relpath^doxygen.png" alt="doxygen"/>
 </a> $doxygenversion
 </small></address>
 <!--END !GENERATE_TREEVIEW-->
index b193c41..2891692 100644 (file)
@@ -5,14 +5,14 @@
 "    $navpath\n"
 "    <li class=\"footer\">$generatedby\n"
 "    <a href=\"http://www.doxygen.org/index.html\">\n"
-"    <img class=\"footer\" src=\"$relpath$doxygen.png\" alt=\"doxygen\"/></a> $doxygenversion </li>\n"
+"    <img class=\"footer\" src=\"$relpath^doxygen.png\" alt=\"doxygen\"/></a> $doxygenversion </li>\n"
 "  </ul>\n"
 "</div>\n"
 "<!--END GENERATE_TREEVIEW-->\n"
 "<!--BEGIN !GENERATE_TREEVIEW-->\n"
 "<hr class=\"footer\"/><address class=\"footer\"><small>\n"
 "$generatedby &#160;<a href=\"http://www.doxygen.org/index.html\">\n"
-"<img class=\"footer\" src=\"$relpath$doxygen.png\" alt=\"doxygen\"/>\n"
+"<img class=\"footer\" src=\"$relpath^doxygen.png\" alt=\"doxygen\"/>\n"
 "</a> $doxygenversion\n"
 "</small></address>\n"
 "<!--END !GENERATE_TREEVIEW-->\n"
index a1f2328..0d3c4cd 100644 (file)
@@ -1,7 +1,7 @@
 /******************************************************************************
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -53,7 +53,7 @@ void FormulaList::generateBitmaps(const char *path)
   int x1,y1,x2,y2;
   QDir d(path);
   // store the original directory
-  if (!d.exists()) { err("error: Output dir %s does not exist!\n",path); exit(1); }
+  if (!d.exists()) { err("Output dir %s does not exist!\n",path); exit(1); }
   QCString oldDir = QDir::currentDirPath().utf8();
   // go to the html output directory (i.e. path)
   QDir::setCurrent(d.absPath());
@@ -149,7 +149,7 @@ void FormulaList::generateBitmaps(const char *path)
         }
         else
         {
-          err("error: Couldn't extract bounding box!\n");
+          err("Couldn't extract bounding box!\n");
         }
       } 
       // next we generate a postscript file which contains the eps
@@ -207,7 +207,7 @@ void FormulaList::generateBitmaps(const char *path)
         if (!t.eof())
           s=t.readLine().utf8();
         if (s.length()<2 || s.left(2)!="P6")
-          err("error: ghostscript produced an illegal image format!");
+          err("ghostscript produced an illegal image format!");
         else
         {
           // assume the size is after the first line that does not start with
index 553ee77..79821bf 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 45b3333..4b709c5 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -21,6 +21,8 @@
 class CodeOutputInterface;
 class FileDef;
 class MemberDef;
+class QCString;
+class Definition;
 
 void parseFortranCode(CodeOutputInterface &,const char *,const QCString &, 
             bool ,const char *,FileDef *fd,
index b598b73..203a2ed 100644 (file)
 #include "filedef.h"
 #include "namespacedef.h"
 
+// Toggle for some debugging info
+//#define DBG_CTX(x) fprintf x
+#define DBG_CTX(x) do { } while(0)
+
 #define YY_NEVER_INTERACTIVE 1
 #define YY_NO_TOP_STATE 1
 #define YY_NO_INPUT 1
+
+/*
+ * For fixed formatted code position 6 is of importance (continuation character).
+ * The following variables and macros keep track of the column number
+ * YY_USER_ACTION is always called for each scan action
+ * YY_FTN_REST    is used to handle end of lines and reset the column counter
+ * YY_FTN_REJECT  resets the column counters when a pattern is rejected and thus rescanned.
+ */
+int yy_old_start = 0;
+int yy_my_start  = 0;
+int yy_end       = 1;
+#define YY_USER_ACTION {yy_old_start = yy_my_start; yy_my_start = yy_end; yy_end += yyleng;}
+#define YY_FTN_RESET   {yy_old_start = 0; yy_my_start = 0; yy_end = 1;}
+#define YY_FTN_REJECT  {yy_end = yy_my_start; yy_my_start = yy_old_start; REJECT;}
    
 //--------------------------------------------------------------------------------
 
@@ -350,6 +368,16 @@ static void writeMultiLineCodeLink(CodeOutputInterface &ol,
   }
 }
 
+#if 0
+static QCString fileLocation() 
+{
+  QCString result = g_sourceFileDef?g_sourceFileDef->absFilePath():QCString("[unknown]");
+  result+=":"+QCString().setNum(g_yyLineNr);
+  result+=":"+QCString().setNum(1);
+  return result;
+}
+
+
 /**
   generates dictionay entries that are used if REFERENCED_BY_RELATION ... options are set
   (e.g. the "referenced by ..." list after the function documentation) 
@@ -362,13 +390,14 @@ static void addDocCrossReference(MemberDef *src, MemberDef *dst)
   if ((Config_getBool("REFERENCED_BY_RELATION") || Config_getBool("CALLER_GRAPH")) && 
       (src->isFunction()))
   {
-    dst->addSourceReferencedBy(src);
+    dst->addSourceReferencedBy(src,fileLocation());
   }
   if ((Config_getBool("REFERENCES_RELATION") || Config_getBool("CALL_GRAPH")) && (src->isFunction()))
   {
-    src->addSourceReferences(dst);
+    src->addSourceReferences(dst,fileLocation());
   }
 }
+#endif
 
 //-------------------------------------------------------------------------------
 /**
@@ -530,8 +559,6 @@ static bool getLink(UseSDict *usedict, // dictonary with used modules
       { 
        addDocCrossReference(g_currentMemberDef,md); 
       }     
-      ol.linkableSymbol(g_yyLineNr,md->name(),md,
-                       g_currentMemberDef ? g_currentMemberDef : g_currentDefinition);
       writeMultiLineCodeLink(ol,md->getReference(),
                                md->getOutputFileBase(),
                                md->anchor(),
@@ -560,7 +587,6 @@ static void generateLink(CodeOutputInterface &ol, char *lname)
     } 
     else 
     { // write type or interface link
-      ol.linkableSymbol(g_yyLineNr, tmp, cd, g_currentMemberDef?g_currentMemberDef:g_currentDefinition);
       writeMultiLineCodeLink(ol,cd->getReference(),cd->getOutputFileBase(),cd->anchor(),tmp);
       addToSearchIndex(tmp.data());
     }
@@ -573,7 +599,6 @@ static void generateLink(CodeOutputInterface &ol, char *lname)
   else 
   {
     // nothing found, just write out the word
-    ol.linkableSymbol(g_yyLineNr, tmp, 0, g_currentMemberDef?g_currentMemberDef:g_currentDefinition);
     //startFontClass("charliteral"); //test
     codifyLines(tmp);
     //endFontClass(); //test
@@ -605,7 +630,7 @@ static int countLines()
 /** start scope */
 static void startScope() 
 {
-  // fprintf(stderr, "===> startScope %s",yytext);
+  DBG_CTX((stderr, "===> startScope %s",yytext));
   Scope *scope = new Scope;
   scopeStack.append(scope);
 }
@@ -613,10 +638,10 @@ static void startScope()
 /** end scope */
 static void endScope() 
 {
-  // fprintf(stderr,"===> endScope %s",yytext);
+  DBG_CTX((stderr,"===> endScope %s",yytext));
   if (scopeStack.isEmpty()) 
   {
-    //fprintf(stderr,"WARNING: fortrancode.l: stack empty!\n"); 
+    DBG_CTX((stderr,"WARNING: fortrancode.l: stack empty!\n")); 
     return;
   }
 
@@ -680,8 +705,8 @@ CHAR      (CHARACTER{ARGS}?|CHARACTER{BS}"*"({BS}[0-9]+|{ARGS}))
 TYPE_SPEC (({NUM_TYPE}({BS}"*"{BS}[0-9]+)?)|({NUM_TYPE}{KIND})|DOUBLE{BS_}COMPLEX|DOUBLE{BS_}PRECISION|{CHAR})
 
 INTENT_SPEC intent{BS}"("{BS}(in|out|in{BS}out){BS}")"
-ATTR_SPEC (IMPLICIT|ALLOCATABLE|DIMENSION{ARGS}|EXTERNAL|{INTENT_SPEC}|INTRINSIC|OPTIONAL|PARAMETER|POINTER|PRIVATE|PUBLIC|SAVE|TARGET|RECURSIVE|PURE|ELEMENTAL)
-ACCESS_SPEC (PRIVATE|PUBLIC)
+ATTR_SPEC (IMPLICIT|ALLOCATABLE|DIMENSION{ARGS}|EXTERNAL|{INTENT_SPEC}|INTRINSIC|OPTIONAL|PARAMETER|POINTER|PROTECTED|PRIVATE|PUBLIC|SAVE|TARGET|RECURSIVE|PURE|ELEMENTAL)
+ACCESS_SPEC (PROTECTED|PRIVATE|PUBLIC)
 /* Assume that attribute statements are almost the same as attributes. */
 ATTR_STMT {ATTR_SPEC}|DIMENSION
 FLOW  (DO|SELECT|CASE|WHERE|IF|THEN|ELSE|WHILE|FORALL|ELSEWHERE|ELSEIF|RETURN|CONTINUE|EXIT)
@@ -729,6 +754,10 @@ PREFIX    (RECURSIVE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,2}(RECURSIVE|PURE|ELEMENTA
                                          endFontClass();
                                        }
 <Start>{FLOW}/[,( \t\n].*               {
+                                          if (g_isFixedForm)
+                                          {
+                                            if ((yy_my_start == 1) && ((yytext[0] == 'c') || (yytext[0] == 'C'))) YY_FTN_REJECT;
+                                          }
                                          /* font class is defined e.g. in doxygen.css */
                                          startFontClass("keywordflow");
                                          codifyLines(yytext);
@@ -777,7 +806,7 @@ PREFIX    (RECURSIVE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,2}(RECURSIVE|PURE|ELEMENTA
                                          BEGIN(UseOnly);     
                                         }           
 <UseOnly>{BS},{BS}                      { codifyLines(yytext); }
-<UseOnly>{BS}&{BS}"\n"                  { codifyLines(yytext); }
+<UseOnly>{BS}&{BS}"\n"                  { codifyLines(yytext); YY_FTN_RESET}
 <UseOnly>{ID}                           {
                                           g_insideBody=TRUE;
                                           generateLink(*g_code, yytext);
@@ -786,7 +815,7 @@ PREFIX    (RECURSIVE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,2}(RECURSIVE|PURE|ELEMENTA
                                         }
 <Use,UseOnly>"\n"                       {
                                           unput(*yytext);
-                                          yy_pop_state();
+                                          yy_pop_state();YY_FTN_RESET
                                         }
        
  /*-------- fortran module  -----------------------------------------*/
@@ -797,7 +826,7 @@ PREFIX    (RECURSIVE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,2}(RECURSIVE|PURE|ELEMENTA
                                          endFontClass();
                                           yy_push_state(YY_START);
                                          BEGIN(ClassName); 
-                                         if (!stricmp(yytext,"module")) currentModule="module";
+                                         if (!qstricmp(yytext,"module")) currentModule="module";
                                        }
 <ClassName>{ID}                        {
                                          if (currentModule == "module")
@@ -810,11 +839,11 @@ PREFIX    (RECURSIVE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,2}(RECURSIVE|PURE|ELEMENTA
                                        }
 <ClassName>\n                          { // interface may be without name
                                           yy_pop_state();
-                                         REJECT;
+                                         YY_FTN_REJECT;
                                        }
 <Start>"end"({BS_}"module").*          { // just reset currentModule, rest is done in following rule
                                           currentModule=0;
-                                         REJECT;
+                                         YY_FTN_REJECT;
                                         }
  /*-------- subprog definition -------------------------------------*/
 <Start>({PREFIX}{BS_})?{TYPE_SPEC}{BS_}({PREFIX}{BS_})?{BS}/{SUBPROG}{BS_}  {   // TYPE_SPEC is for old function style function result
@@ -830,7 +859,7 @@ PREFIX    (RECURSIVE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,2}(RECURSIVE|PURE|ELEMENTA
                                           BEGIN(Subprog);
                                         }
 <Subprog>{ID}                           { // subroutine/function name
-                                          // fprintf(stderr, "===> start subprogram %s\n", yytext);
+                                          DBG_CTX((stderr, "===> start subprogram %s\n", yytext));
                                          startScope();
                                          generateLink(*g_code,yytext);
                                         }
@@ -839,6 +868,7 @@ PREFIX    (RECURSIVE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,2}(RECURSIVE|PURE|ELEMENTA
                                         }
 <Subprog,Subprogend>"\n"                { codifyLines(yytext);
                                           yy_pop_state();
+                                          YY_FTN_RESET
                                         }
 <Start>^{BS}"end"{BS}("block"{BS}"data"|{SUBPROG}|"module"|"program"|"type"|"interface"){BS}     {  // Fortran subroutine or function ends
                                           //cout << "===> end function " << yytext << endl;
@@ -926,11 +956,13 @@ PREFIX    (RECURSIVE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,2}(RECURSIVE|PURE|ELEMENTA
                                           codifyLines(yytext);
                                          bracketCount = 0;
                                           yy_pop_state();
+                                          YY_FTN_RESET
                                        }
 <Declaration>"\n"                       { // end declaration line
                                          codifyLines(yytext);
                                          bracketCount = 0;
                                           yy_pop_state();
+                                          YY_FTN_RESET
                                        }
 
  /*-------- subprog calls  -----------------------------------------*/
@@ -954,6 +986,14 @@ PREFIX    (RECURSIVE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,2}(RECURSIVE|PURE|ELEMENTA
 
  /*-------- comments ---------------------------------------------------*/
 <Start>\n?{BS}"!>"|"!<"                 { // start comment line or comment block
+                                          if (yytext[0] == '\n')
+                                          {
+                                            yy_old_start = 0;
+                                            yy_my_start = 1;
+                                            yy_end = yyleng;
+                                          }
+                                          // Actually we should see if ! on position 6, can be continuation
+                                          // but the chance is very unlikely, so no effort to solve it here
                                           yy_push_state(YY_START);
                                          BEGIN(DocBlock);
                                           docBlock=yytext;
@@ -967,7 +1007,12 @@ PREFIX    (RECURSIVE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,2}(RECURSIVE|PURE|ELEMENTA
 <DocBlock>.*                           { // contents of current comment line
                                           docBlock+=yytext;
                                        }
-<DocBlock>"\n"{BS}("!>"|"!<"|"!!")     { //| comment block (next line is also comment line)
+<DocBlock>"\n"{BS}("!>"|"!<"|"!!")     { // comment block (next line is also comment line)
+                                          yy_old_start = 0;
+                                          yy_my_start = 1;
+                                          yy_end = yyleng;
+                                          // Actually we should see if ! on position 6, can be continuation
+                                          // but the chance is very unlikely, so no effort to solve it here
                                          docBlock+=yytext; 
                                        }
 <DocBlock>"\n"                         { // comment block ends at the end of this line
@@ -989,17 +1034,19 @@ PREFIX    (RECURSIVE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,2}(RECURSIVE|PURE|ELEMENTA
                                            endFontClass();
                                          }
                                          yy_pop_state();
+                                          YY_FTN_RESET
                                        }
 
 <*>"!"[^><\n].*|"!"$                   { // normal comment
-                                         if(YY_START == String) REJECT; // ignore in strings
+                                         if(YY_START == String) YY_FTN_REJECT; // ignore in strings
+                                          if (g_isFixedForm && yy_my_start == 6) YY_FTN_REJECT;
                                          startFontClass("comment");
                                          codifyLines(yytext);
                                          endFontClass();
                                        }
 
 <*>^[Cc*].*                            { // normal comment
-                                          if(! g_isFixedForm) REJECT;
+                                          if(! g_isFixedForm) YY_FTN_REJECT;
 
                                          startFontClass("comment");
                                          codifyLines(yytext);
@@ -1007,9 +1054,12 @@ PREFIX    (RECURSIVE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,2}(RECURSIVE|PURE|ELEMENTA
                                        }
 
  /*------ preprocessor  --------------------------------------------*/ 
-<Start>"#".*\n                          { startFontClass("preprocessor");
+<Start>"#".*\n                          {
+                                          if (g_isFixedForm && yy_my_start == 6) YY_FTN_REJECT;
+                                          startFontClass("preprocessor");
                                          codifyLines(yytext);
                                          endFontClass();
+                                          YY_FTN_RESET
                                         }
  /*------ variable references?  -------------------------------------*/ 
 
@@ -1031,9 +1081,10 @@ PREFIX    (RECURSIVE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,2}(RECURSIVE|PURE|ELEMENTA
                                          codifyLines(str);
                                          endFontClass();
                                           str = "";
+                                          YY_FTN_RESET
                                         }           
 <String>\"|\'                           { // string ends with next quote without previous backspace 
-                                          if(yytext[0]!=stringStartSymbol) REJECT; // single vs double quote
+                                          if(yytext[0]!=stringStartSymbol) YY_FTN_REJECT; // single vs double quote
                                           str+=yytext;
                                          startFontClass("stringliteral");
                                          codifyLines(str);
@@ -1043,7 +1094,8 @@ PREFIX    (RECURSIVE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,2}(RECURSIVE|PURE|ELEMENTA
 <String>.                               {str+=yytext;}
 
 <*>\"|\'                                { /* string starts */
-                                         /* if(YY_START == StrIgnore) REJECT; // ignore in simple comments */
+                                         /* if(YY_START == StrIgnore) YY_FTN_REJECT; // ignore in simple comments */
+                                          if (g_isFixedForm && yy_my_start == 6) YY_FTN_REJECT;
                                           yy_push_state(YY_START);
                                           stringStartSymbol=yytext[0]; // single or double quote
                                           BEGIN(String);
@@ -1053,6 +1105,7 @@ PREFIX    (RECURSIVE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,2}(RECURSIVE|PURE|ELEMENTA
 
 <*>\n                                  {
                                          codifyLines(yytext); 
+                                          YY_FTN_RESET
                                        }
 <*>.                                   { 
                                          g_code->codify(yytext);
index d904b87..c70f948 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -28,9 +28,13 @@ class FortranLanguageScanner : public ParserInterface
 {
   public:
     virtual ~FortranLanguageScanner() {}
+    void startTranslationUnit(const char *) {}
+    void finishTranslationUnit() {}
     void parseInput(const char *fileName,
                     const char *fileBuf,
-                    Entry *root);
+                    Entry *root,
+                    bool sameTranslationUnit,
+                    QStrList &filesInSameTranslationUnit);
     bool needsPreprocessing(const QCString &extension);
     void parseCode(CodeOutputInterface &codeOutIntf,
                    const char *scopeName,
index 3a7a8c1..eae6d6e 100644 (file)
 #include "pre.h"
 #include "arguments.h"
 
+// Toggle for some debugging info
+//#define DBG_CTX(x) fprintf x
+#define DBG_CTX(x) do { } while(0)
+
 #define YY_NEVER_INTERACTIVE 1
 #define YY_NO_INPUT 1
 
@@ -82,6 +86,7 @@ struct SymbolModifiers {
   Protection protection;
   Direction direction;
   bool optional;
+  bool protect;
   QCString dimension;
   bool allocatable;
   bool external;
@@ -97,7 +102,7 @@ struct SymbolModifiers {
   QCString passVar;
 
   SymbolModifiers() : type(), returnName(), protection(NONE_P), direction(NONE_D),
-    optional(FALSE), dimension(), allocatable(FALSE),
+    optional(FALSE), protect(FALSE), dimension(), allocatable(FALSE),
     external(FALSE), intrinsic(FALSE), parameter(FALSE),
     pointer(FALSE), target(FALSE), save(FALSE), deferred(FALSE), nonoverridable(FALSE),
     nopass(FALSE), pass(FALSE), passVar() {}
@@ -141,9 +146,9 @@ struct CommentInPrepass {
 };
 static QList<CommentInPrepass>  comments;
 
-#define MAX_INCLUDE_DEPTH 10
-YY_BUFFER_STATE include_stack[MAX_INCLUDE_DEPTH];
+YY_BUFFER_STATE *include_stack = NULL;
 int include_stack_ptr = 0;
+int include_stack_cnt = 0;
 
 static QFile            inputFile;
 static QCString                yyFileName;
@@ -252,7 +257,7 @@ CHAR      (CHARACTER{ARGS}?|CHARACTER{BS}"*"({BS}[0-9]+|{ARGS}))
 TYPE_SPEC (({NUM_TYPE}({BS}"*"{BS}[0-9]+)?)|({NUM_TYPE}{KIND})|DOUBLE{BS_}COMPLEX|DOUBLE{BS_}PRECISION|{CHAR}|TYPE{ARGS}|CLASS{ARGS}|PROCEDURE{ARGS}?)
 
 INTENT_SPEC intent{BS}"("{BS}(in|out|in{BS}out){BS}")"
-ATTR_SPEC (ALLOCATABLE|DIMENSION{ARGS}|EXTERNAL|{INTENT_SPEC}|INTRINSIC|OPTIONAL|PARAMETER|POINTER|PRIVATE|PUBLIC|SAVE|TARGET|NOPASS|PASS{ARGS}?|DEFERRED|NON_OVERRIDABLE)
+ATTR_SPEC (ALLOCATABLE|DIMENSION{ARGS}|EXTERNAL|{INTENT_SPEC}|INTRINSIC|OPTIONAL|PARAMETER|POINTER|PROTECTED|PRIVATE|PUBLIC|SAVE|TARGET|NOPASS|PASS{ARGS}?|DEFERRED|NON_OVERRIDABLE)
 ACCESS_SPEC (PRIVATE|PUBLIC)
 LANGUAGE_BIND_SPEC BIND{BS}"("{BS}C{BS}(,{BS}NAME{BS}"="{BS}"\""(.*)"\""{BS})?")"
 /* Assume that attribute statements are almost the same as attributes. */
@@ -309,7 +314,7 @@ PREFIX    (RECURSIVE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,2}(RECURSIVE|PURE|ELEMENTA
 <*>^.*\n                                { // prepass: look for line continuations
                                          functionLine = FALSE;
 
-                                          //fprintf(stderr, "---%s", yytext);
+                                          DBG_CTX((stderr, "---%s", yytext));
 
                                             int indexStart = getAmpersandAtTheStart(yytext, (int)yyleng);
                                             int indexEnd = getAmpOrExclAtTheEnd(yytext, (int)yyleng);
@@ -391,11 +396,11 @@ PREFIX    (RECURSIVE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,2}(RECURSIVE|PURE|ELEMENTA
                                             yy_push_state(YY_START);
                                             BEGIN(StrIgnore); 
                                             debugStr="*!";
-                                            //fprintf(stderr,"start comment %d\n",yyLineNr);
+                                            DBG_CTX((stderr,"start comment %d\n",yyLineNr));
                                            }      
                                         }
 <StrIgnore>.?/\n                        { yy_pop_state(); // comment ends with endline character
-                                          //fprintf(stderr,"end comment %d %s\n",yyLineNr,debugStr.data());
+                                          DBG_CTX((stderr,"end comment %d %s\n",yyLineNr,debugStr.data()));
                                         } // comment line ends
 <StrIgnore>.                            { debugStr+=yytext; } 
 
@@ -411,7 +416,7 @@ PREFIX    (RECURSIVE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,2}(RECURSIVE|PURE|ELEMENTA
                                           yy_push_state(Use);
                                         }
 <Use>{ID}                               { 
-                                          //fprintf(stderr,"using dir %s\n",yytext);
+                                          DBG_CTX((stderr,"using dir %s\n",yytext));
                                           current->name=yytext;
                                           current->fileName = yyFileName; 
                                          current->section=Entry::USINGDIR_SEC;
@@ -716,7 +721,7 @@ private                                 {
 {ATTR_STMT}/{BS_}{ID}                 |
 {ATTR_STMT}/{BS}"::"                   { 
                                           /* attribute statement starts */
-                                          //fprintf(stderr,"5=========> Attribute statement: %s\n", yytext); 
+                                          DBG_CTX((stderr,"5=========> Attribute statement: %s\n", yytext)); 
                                           QCString tmp = yytext;
                                           currentModifiers |= tmp.stripWhiteSpace();
                                          argType="";
@@ -882,11 +887,13 @@ private                                 {
                                           pushBuffer(inputStringSemi);
                                         }
 
+<Initialization,ArrayInitializer>"["    |
 <Initialization,ArrayInitializer>"(/"   { initializer+=yytext;
                                            initializerArrayScope++;
                                            BEGIN(ArrayInitializer); // initializer may contain comma
                                         }
-<ArrayInitializer>"/)"                   { initializer+=yytext;
+<ArrayInitializer>"]"                   |
+<ArrayInitializer>"/)"                  { initializer+=yytext;
                                            initializerArrayScope--;
                                            if(initializerArrayScope<=0)
                                            {
@@ -1106,7 +1113,7 @@ private                                 {
 <*><<EOF>>                              {
                                           if ( include_stack_ptr <= 0 ) {
                                             if (YY_START!=INITIAL && YY_START!=Start) {
-                                              //fprintf(stderr,"==== Error: EOF reached in wrong state (end missing)");
+                                              DBG_CTX((stderr,"==== Error: EOF reached in wrong state (end missing)"));
                                               scanner_abort();
                                             }
                                             yyterminate();
@@ -1393,20 +1400,20 @@ static const char* prepassFixedForm(const char* contents)
 
 static void pushBuffer(QCString& buffer)
 {
-  if ( include_stack_ptr >= MAX_INCLUDE_DEPTH )
+  if (include_stack_cnt <= include_stack_ptr)
   {
-    fprintf( stderr, "Stack buffers nested too deeply" );
-    exit( 1 );
+     include_stack_cnt++;
+     include_stack = (YY_BUFFER_STATE *)realloc(include_stack, include_stack_cnt * sizeof(YY_BUFFER_STATE));
   }
   include_stack[include_stack_ptr++] = YY_CURRENT_BUFFER;
   yy_switch_to_buffer(yy_scan_string(buffer));
 
-  //fprintf(stderr, "--PUSH--%s", (const char *)buffer);
+  DBG_CTX((stderr, "--PUSH--%s", (const char *)buffer));
   buffer = NULL;
 }
 
 static void popBuffer() {
-  //fprintf(stderr, "--POP--");
+  DBG_CTX((stderr, "--POP--"));
   include_stack_ptr --;
   yy_delete_buffer( YY_CURRENT_BUFFER );
   yy_switch_to_buffer( include_stack[include_stack_ptr] );
@@ -1488,6 +1495,7 @@ SymbolModifiers& SymbolModifiers::operator|=(const SymbolModifiers &mdfs)
   allocatable |= mdfs.allocatable;
   external |= mdfs.external;
   intrinsic |= mdfs.intrinsic;
+  protect |= mdfs.protect;
   parameter |= mdfs.parameter;
   pointer |= mdfs.pointer;
   target |= mdfs.target;
@@ -1527,6 +1535,10 @@ SymbolModifiers& SymbolModifiers::operator|=(QCString mdfString)
   {
     newMdf.protection = SymbolModifiers::PRIVATE;
   }
+  else if (mdfString=="protected") 
+  {
+    newMdf.protect = TRUE;
+  }
   else if (mdfString=="optional") 
   {
     newMdf.optional = TRUE;
@@ -1717,6 +1729,11 @@ static QCString applyModifiers(QCString typeName, SymbolModifiers& mdfs)
     if (!typeName.isEmpty()) typeName += ", ";
     typeName += "private";
   }
+  if (mdfs.protect)
+  {
+    if (!typeName.isEmpty()) typeName += ", ";
+    typeName += "protected";
+  }
 
   return typeName;
 }
@@ -1917,7 +1934,7 @@ static int max(int a, int b) {return a>b?a:b;}
 
 static void addModule(const char *name, bool isModule)
 {
-  //fprintf(stderr, "0=========> got module %s\n", name);
+  DBG_CTX((stderr, "0=========> got module %s\n", name));
 
   if (isModule)
     current->section = Entry::CLASS_SEC;
@@ -1947,7 +1964,7 @@ static void addModule(const char *name, bool isModule)
 
 static void addSubprogram(const char *text)
 {
-  //fprintf(stderr,"1=========> got subprog, type: %s\n",text); 
+  DBG_CTX((stderr,"1=========> got subprog, type: %s\n",text)); 
   subrCurrent.prepend(current);
   current->section = Entry::FUNCTION_SEC ;
   QCString subtype = text; subtype=subtype.lower().stripWhiteSpace();
@@ -2055,7 +2072,7 @@ static void handleCommentBlock(const QCString &doc,bool brief)
   static bool hideInBodyDocs = Config_getBool("HIDE_IN_BODY_DOCS");
   int position=0;
   if (docBlockInBody && hideInBodyDocs) return;
-  //fprintf(stderr,"call parseCommentBlock [%s]\n",doc.data());
+  DBG_CTX((stderr,"call parseCommentBlock [%s]\n",doc.data()));
   int lineNr = brief ? current->briefLine : current->docLine;
   while (parseCommentBlock(
        g_thisParser,
@@ -2071,10 +2088,10 @@ static void handleCommentBlock(const QCString &doc,bool brief)
         needsEntry
         )) 
   {
-          //fprintf(stderr,"parseCommentBlock position=%d [%s]  needsEntry=%d\n",position,doc.data()+position,needsEntry);
+          DBG_CTX((stderr,"parseCommentBlock position=%d [%s]  needsEntry=%d\n",position,doc.data()+position,needsEntry));
    if (needsEntry) addCurrentEntry(0);
   }
-  //fprintf(stderr,"parseCommentBlock position=%d [%s]  needsEntry=%d\n",position,doc.data()+position,needsEntry);
+  DBG_CTX((stderr,"parseCommentBlock position=%d [%s]  needsEntry=%d\n",position,doc.data()+position,needsEntry));
 
   if (needsEntry) addCurrentEntry(0);
 }
@@ -2083,6 +2100,7 @@ static void handleCommentBlock(const QCString &doc,bool brief)
 
 static void subrHandleCommentBlock(const QCString &doc,bool brief)
 {
+  QCString loc_doc;
   Entry *tmp_entry = current; 
   current = subrCurrent.first(); // temporarily switch to the entry of the subroutine / function
   if (docBlock.stripWhiteSpace().find("\\param") == 0)
@@ -2096,8 +2114,57 @@ static void subrHandleCommentBlock(const QCString &doc,bool brief)
   else 
   {
     int dir1 = modifiers[current_root][argName.lower()].direction;
-    handleCommentBlock(QCString("\n\n@param ") + directionParam[dir1] + " " + 
-                      argName + " " + doc,brief);
+    loc_doc = doc.stripWhiteSpace();
+    if (loc_doc.lower().find(directionParam[SymbolModifiers::IN]) == 0)
+    {
+      if ((directionParam[dir1] == directionParam[SymbolModifiers::NONE_D]) ||
+          (directionParam[dir1] == directionParam[SymbolModifiers::IN]))
+      {
+        handleCommentBlock(QCString("\n\n@param ") + directionParam[SymbolModifiers::IN] + " " + 
+                          argName + " " + loc_doc.right(loc_doc.length()-strlen(directionParam[SymbolModifiers::IN])),brief);
+      }
+      else
+      {
+        warn(yyFileName,yyLineNr, "inconsistency between intent attribute and documenation for variable: "+argName);
+        handleCommentBlock(QCString("\n\n@param ") + directionParam[dir1] + " " + 
+                          argName + " " + doc,brief);
+      }
+    }
+    else if (loc_doc.lower().find(directionParam[SymbolModifiers::OUT]) == 0)
+    {
+      if ((directionParam[dir1] == directionParam[SymbolModifiers::NONE_D]) ||
+          (directionParam[dir1] == directionParam[SymbolModifiers::OUT]))
+      {
+        handleCommentBlock(QCString("\n\n@param ") + directionParam[SymbolModifiers::OUT] + " " + 
+                          argName + " " + loc_doc.right(loc_doc.length()-strlen(directionParam[SymbolModifiers::OUT])),brief);
+      }
+      else
+      {
+        warn(yyFileName,yyLineNr, "inconsistency between intent attribute and documenation for variable: "+argName);
+        handleCommentBlock(QCString("\n\n@param ") + directionParam[dir1] + " " + 
+                          argName + " " + doc,brief);
+      }
+    }
+    else if (loc_doc.lower().find(directionParam[SymbolModifiers::INOUT]) == 0)
+    {
+      if ((directionParam[dir1] == directionParam[SymbolModifiers::NONE_D]) ||
+          (directionParam[dir1] == directionParam[SymbolModifiers::INOUT]))
+      {
+        handleCommentBlock(QCString("\n\n@param ") + directionParam[SymbolModifiers::INOUT] + " " + 
+                          argName + " " + loc_doc.right(loc_doc.length()-strlen(directionParam[SymbolModifiers::INOUT])),brief);
+      }
+      else
+      {
+        warn(yyFileName,yyLineNr, "inconsistency between intent attribute and documenation for variable: "+argName);
+        handleCommentBlock(QCString("\n\n@param ") + directionParam[dir1] + " " + 
+                          argName + " " + doc,brief);
+      }
+    }
+    else
+    {
+      handleCommentBlock(QCString("\n\n@param ") + directionParam[dir1] + " " + 
+                        argName + " " + doc,brief);
+    }
   }
   current=tmp_entry;
 }
@@ -2197,7 +2264,11 @@ static void parseMain(const char *fileName,const char *fileBuf,Entry *rt)
 
 //----------------------------------------------------------------------------
 
-void FortranLanguageScanner::parseInput(const char *fileName,const char *fileBuf,Entry *root)
+void FortranLanguageScanner::parseInput(const char *fileName,
+                                        const char *fileBuf,
+                                        Entry *root,
+                                        bool /*sameTranslationUnit*/,
+                                        QStrList & /*filesInSameTranslationUnit*/)
 {
   g_thisParser = this;
   ::parseMain(fileName,fileBuf,root);
@@ -2233,7 +2304,7 @@ void FortranLanguageScanner::resetCodeParserState()
 
 void FortranLanguageScanner::parsePrototype(const char *text)
 {
-  (void)text;
+  current->name = QCString(text).lower();
 }
 
 static void scanner_abort() 
index 5727647..dd3c3d1 100644 (file)
@@ -1,7 +1,7 @@
 /******************************************************************************
  * ftvhelp.cpp,v 1.0 2000/09/06 16:09:00
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index d3ba3b9..9794d8b 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index a72a19b..2b41594 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -44,7 +44,7 @@
 //---------------------------------------------------------------------------
 
 GroupDef::GroupDef(const char *df,int dl,const char *na,const char *t,
-                   const char *refFileName) : Definition(df,dl,na)
+                   const char *refFileName) : Definition(df,dl,1,na)
 {
   fileList = new FileList;
   classSDict = new ClassSDict(17);
@@ -89,7 +89,7 @@ GroupDef::~GroupDef()
 
 void GroupDef::setGroupTitle( const char *t )
 {
-  if ( t && strlen(t) )
+  if ( t && qstrlen(t) )
   {
     title = t;
     titleSet = TRUE;
@@ -273,19 +273,19 @@ bool GroupDef::insertMember(MemberDef *md,bool docOnly)
       bool sameScope = srcMd->getOuterScope()==md->getOuterScope() || // same class or namespace
           // both inside a file => definition and declaration do not have to be in the same file
            (srcMd->getOuterScope()->definitionType()==Definition::TypeFile &&
-            md->getOuterScope()->definitionType()==Definition::TypeFile); 
+               md->getOuterScope()->definitionType()==Definition::TypeFile); 
 
-      LockingPtr<ArgumentList> srcMdAl  = srcMd->argumentList();
-      LockingPtr<ArgumentList> mdAl     = md->argumentList();
-      LockingPtr<ArgumentList> tSrcMdAl = srcMd->templateArguments();
-      LockingPtr<ArgumentList> tMdAl    = md->templateArguments();
+      ArgumentList *srcMdAl  = srcMd->argumentList();
+      ArgumentList *mdAl     = md->argumentList();
+      ArgumentList *tSrcMdAl = srcMd->templateArguments();
+      ArgumentList *tMdAl    = md->templateArguments();
       
       if (srcMd->isFunction() && md->isFunction() && // both are a function
-          ((tSrcMdAl.pointer()==0 && tMdAl.pointer()==0) || 
-           (tSrcMdAl.pointer()!=0 && tMdAl.pointer()!=0 && tSrcMdAl->count()==tMdAl->count())
+          ((tSrcMdAl==0 && tMdAl==0) || 
+           (tSrcMdAl!=0 && tMdAl!=0 && tSrcMdAl->count()==tMdAl->count())
           ) &&       // same number of template arguments
-          matchArguments2(srcMd->getOuterScope(),srcMd->getFileDef(),srcMdAl.pointer(),
-                          md->getOuterScope(),md->getFileDef(),mdAl.pointer(),
+          matchArguments2(srcMd->getOuterScope(),srcMd->getFileDef(),srcMdAl,
+                          md->getOuterScope(),md->getFileDef(),mdAl,
                           TRUE
                          ) && // matching parameters
           sameScope // both are found in the same scope
@@ -295,7 +295,7 @@ bool GroupDef::insertMember(MemberDef *md,bool docOnly)
         {
           md->setGroupAlias(srcMd); 
         }
-        else
+        else if (md!=srcMd->getGroupAlias())
         {
           md->setGroupAlias(srcMd->getGroupAlias()); 
         }
@@ -439,7 +439,6 @@ void GroupDef::removeMember(MemberDef *md)
     if( mni->isEmpty() )
     {
       allMemberNameInfoSDict->remove(md->name());
-      delete mni;
     }
 
     removeMemberFromList(MemberListType_allMembersList,md);
@@ -524,7 +523,7 @@ void GroupDef::addGroup(const GroupDef *def)
 
 bool GroupDef::isASubGroup() const
 {
-  LockingPtr<GroupList> groups = partOfGroups();
+  GroupList *groups = partOfGroups();
   return groups!=0 && groups->count()!=0;
 }
 
@@ -570,7 +569,7 @@ void GroupDef::writeDetailedDescription(OutputList &ol,const QCString &title)
     // repeat brief description
     if (!briefDescription().isEmpty() && Config_getBool("REPEAT_BRIEF"))
     {
-      ol.parseDoc(briefFile(),briefLine(),this,0,briefDescription(),FALSE,FALSE);
+      ol.generateDoc(briefFile(),briefLine(),this,0,briefDescription(),FALSE,FALSE);
     }
     // write separator between brief and details
     if (!briefDescription().isEmpty() && Config_getBool("REPEAT_BRIEF") &&
@@ -589,13 +588,13 @@ void GroupDef::writeDetailedDescription(OutputList &ol,const QCString &title)
     // write detailed documentation
     if (!documentation().isEmpty())
     {
-      ol.parseDoc(docFile(),docLine(),this,0,documentation()+"\n",TRUE,FALSE);
+      ol.generateDoc(docFile(),docLine(),this,0,documentation()+"\n",TRUE,FALSE);
     }
 
     // write inbody documentation
     if (!inbodyDocumentation().isEmpty())
     {
-      ol.parseDoc(inbodyFile(),inbodyLine(),this,0,inbodyDocumentation()+"\n",TRUE,FALSE);
+      ol.generateDoc(inbodyFile(),inbodyLine(),this,0,inbodyDocumentation()+"\n",TRUE,FALSE);
     }
   }
 }
@@ -604,25 +603,30 @@ void GroupDef::writeBriefDescription(OutputList &ol)
 {
   if (!briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC"))
   {
-    ol.startParagraph();
-    ol.parseDoc(briefFile(),briefLine(),this,0,
-                briefDescription(),TRUE,FALSE,0,TRUE,FALSE);
-    ol.pushGeneratorState();
-    ol.disable(OutputGenerator::RTF);
-    ol.writeString(" \n");
-    ol.enable(OutputGenerator::RTF);
-
-    if (Config_getBool("REPEAT_BRIEF") ||
-        !documentation().isEmpty()
-       )
+    DocRoot *rootNode = validatingParseDoc(briefFile(),briefLine(),this,0,
+                                briefDescription(),TRUE,FALSE,0,TRUE,FALSE);
+    if (rootNode && !rootNode->isEmpty())
     {
-      ol.disableAllBut(OutputGenerator::Html);
-      ol.startTextLink(0,"details");
-      ol.parseText(theTranslator->trMore());
-      ol.endTextLink();
+      ol.startParagraph();
+      ol.writeDoc(rootNode,this,0);
+      ol.pushGeneratorState();
+      ol.disable(OutputGenerator::RTF);
+      ol.writeString(" \n");
+      ol.enable(OutputGenerator::RTF);
+
+      if (Config_getBool("REPEAT_BRIEF") ||
+          !documentation().isEmpty()
+         )
+      {
+        ol.disableAllBut(OutputGenerator::Html);
+        ol.startTextLink(0,"details");
+        ol.parseText(theTranslator->trMore());
+        ol.endTextLink();
+      }
+      ol.popGeneratorState();
+      ol.endParagraph();
     }
-    ol.popGeneratorState();
-    ol.endParagraph();
+    delete rootNode;
   }
 }
 
@@ -671,7 +675,7 @@ void GroupDef::writeFiles(OutputList &ol,const QCString &title)
       if (!fd->briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC"))
       {
         ol.startMemberDescription(fd->getOutputFileBase());
-        ol.parseDoc(briefFile(),briefLine(),fd,0,fd->briefDescription(),FALSE,FALSE,0,TRUE,FALSE);
+        ol.generateDoc(briefFile(),briefLine(),fd,0,fd->briefDescription(),FALSE,FALSE,0,TRUE,FALSE);
         ol.endMemberDescription();
       }
       ol.endMemberDeclaration(0,0);
@@ -729,7 +733,7 @@ void GroupDef::writeNestedGroups(OutputList &ol,const QCString &title)
         if (!gd->briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC"))
         {
           ol.startMemberDescription(gd->getOutputFileBase());
-          ol.parseDoc(briefFile(),briefLine(),gd,0,gd->briefDescription(),FALSE,FALSE,0,TRUE,FALSE);
+          ol.generateDoc(briefFile(),briefLine(),gd,0,gd->briefDescription(),FALSE,FALSE,0,TRUE,FALSE);
           ol.endMemberDescription();
         }
         ol.endMemberDeclaration(0,0);
@@ -765,7 +769,7 @@ void GroupDef::writeDirs(OutputList &ol,const QCString &title)
       if (!dd->briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC"))
       {
         ol.startMemberDescription(dd->getOutputFileBase());
-        ol.parseDoc(briefFile(),briefLine(),dd,0,dd->briefDescription(),FALSE,FALSE,0,TRUE,FALSE);
+        ol.generateDoc(briefFile(),briefLine(),dd,0,dd->briefDescription(),FALSE,FALSE,0,TRUE,FALSE);
         ol.endMemberDescription();
       }
       ol.endMemberDeclaration(0,0);
@@ -811,7 +815,7 @@ void GroupDef::writePageDocumentation(OutputList &ol)
         ol.endSection(si->label,SectionInfo::Subsection);
       }
       ol.startTextBlock();
-      ol.parseDoc(pd->docFile(),pd->docLine(),pd,0,pd->documentation()+pd->inbodyDocumentation(),TRUE,FALSE,0,TRUE,FALSE);
+      ol.generateDoc(pd->docFile(),pd->docLine(),pd,0,pd->documentation()+pd->inbodyDocumentation(),TRUE,FALSE,0,TRUE,FALSE);
       ol.endTextBlock();
     }
   }
@@ -1060,10 +1064,12 @@ void GroupDef::writeDocumentation(OutputList &ol)
       case LayoutDocEntry::ClassUsedFiles:
       case LayoutDocEntry::ClassInlineClasses:
       case LayoutDocEntry::NamespaceNestedNamespaces:
+      case LayoutDocEntry::NamespaceNestedConstantGroups:
       case LayoutDocEntry::NamespaceClasses:
       case LayoutDocEntry::NamespaceInlineClasses:
       case LayoutDocEntry::FileClasses:
       case LayoutDocEntry::FileNamespaces:
+      case LayoutDocEntry::FileConstantGroups:
       case LayoutDocEntry::FileIncludes:
       case LayoutDocEntry::FileIncludeGraph:
       case LayoutDocEntry::FileIncludedByGraph: 
@@ -1256,7 +1262,7 @@ void addMemberToGroups(Entry *root,MemberDef *md)
       if (fgd && gd!=fgd && g->pri==pri) 
       {
         warn(root->fileName.data(), root->startLine,
-            "warning: Member %s found in multiple %s groups! "
+            "Member %s found in multiple %s groups! "
             "The member will be put in group %s, and not in group %s",
             md->name().data(), Grouping::getGroupPriName( pri ),
             gd->name().data(), fgd->name().data()
@@ -1301,7 +1307,7 @@ void addMemberToGroups(Entry *root,MemberDef *md)
           else if (!root->doc.isEmpty() && md->getGroupHasDocs())
           {
             warn(md->getGroupFileName(),md->getGroupStartLine(),
-                "warning: Member documentation for %s found several times in %s groups!\n"
+                "Member documentation for %s found several times in %s groups!\n"
                 "%s:%d: The member will remain in group %s, and won't be put into group %s",
                 md->name().data(), Grouping::getGroupPriName( pri ),
                 root->fileName.data(), root->startLine,
@@ -1373,8 +1379,8 @@ QCString GroupDef::getOutputFileBase() const
 void GroupDef::addListReferences()
 {
   {
-    LockingPtr< QList<ListItemInfo> > xrefItems = xrefListItems();
-    addRefItem(xrefItems.pointer(),
+    QList<ListItemInfo> *xrefItems = xrefListItems();
+    addRefItem(xrefItems,
              getOutputFileBase(),
              theTranslator->trGroup(TRUE,TRUE),
              getOutputFileBase(),name(),
@@ -1466,7 +1472,7 @@ void GroupDef::writeMemberDeclarations(OutputList &ol,MemberListType lt,const QC
   }
   if (ml) 
   {
-    ml->writeDeclarations(ol,0,0,0,this,title,0);
+    ml->writeDeclarations(ol,0,0,0,this,title,0,definitionType());
   }
 }
 
index 3978397..bd53ff5 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -161,7 +161,7 @@ class GroupSDict : public SDict<GroupDef>
     virtual ~GroupSDict() {}
     int compareItems(QCollection::Item item1,QCollection::Item item2)
     {
-      return strcmp(((GroupDef*)item1)->groupTitle(),((GroupDef*)item2)->groupTitle());
+      return qstrcmp(((GroupDef*)item1)->groupTitle(),((GroupDef*)item2)->groupTitle());
     }
 };
 
@@ -171,7 +171,7 @@ class GroupList : public QList<GroupDef>
   public:
     int compareItems(QCollection::Item item1,QCollection::Item item2)
     {
-      return strcmp(((GroupDef*)item1)->groupTitle(),((GroupDef*)item2)->groupTitle());
+      return qstrcmp(((GroupDef*)item1)->groupTitle(),((GroupDef*)item2)->groupTitle());
     }
 };
 
index f1bf315..bc8e4b5 100644 (file)
@@ -4,6 +4,8 @@
 #include <stdlib.h>
 #include <string.h>
 
+#define GROW_AMOUNT 1024
+
 /** Class representing a string buffer optimised for growing. */
 class GrowBuf
 {
@@ -11,21 +13,27 @@ class GrowBuf
     GrowBuf() : str(0), pos(0), len(0) {}
    ~GrowBuf()         { free(str); str=0; pos=0; len=0; }
     void clear()      { pos=0; }
-    void addChar(char c)  { if (pos>=len) { len+=1024; str = (char*)realloc(str,len); } 
+    void addChar(char c)  { if (pos>=len) { len+=GROW_AMOUNT; str = (char*)realloc(str,len); } 
                         str[pos++]=c; 
                       }
     void addStr(const char *s) {
-                        int l=strlen(s);
-                        if (pos+l>=len) { len+=l+1024; str = (char*)realloc(str,len); }
-                        strcpy(&str[pos],s);
-                        pos+=l;
+                        if (s)
+                        {
+                          int l=strlen(s);
+                          if (pos+l>=len) { len+=l+GROW_AMOUNT; str = (char*)realloc(str,len); }
+                          strcpy(&str[pos],s);
+                          pos+=l;
+                        }
                       }
     void addStr(const char *s,int n) {
-                        int l=strlen(s);
-                        if (n<l) l=n;
-                        if (pos+l>=len) { len+=l+1024; str = (char*)realloc(str,len); }
-                        strncpy(&str[pos],s,n);
-                        pos+=l;
+                        if (s)
+                        {
+                          int l=strlen(s);
+                          if (n<l) l=n;
+                          if (pos+l>=len) { len+=l+GROW_AMOUNT; str = (char*)realloc(str,len); }
+                          strncpy(&str[pos],s,n);
+                          pos+=l;
+                        }
                       }
     const char *get()     { return str; }
     int getPos() const    { return pos; }
index 0a0194b..70305df 100644 (file)
@@ -6,13 +6,13 @@
 <meta name="generator" content="Doxygen $doxygenversion"/>
 <!--BEGIN PROJECT_NAME--><title>$projectname: $title</title><!--END PROJECT_NAME-->
 <!--BEGIN !PROJECT_NAME--><title>$title</title><!--END !PROJECT_NAME-->
-<link href="$relpath$tabs.css" rel="stylesheet" type="text/css"/>
-<script type="text/javascript" src="$relpath$jquery.js"></script>
-<script type="text/javascript" src="$relpath$dynsections.js"></script>
+<link href="$relpath^tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="$relpath^jquery.js"></script>
+<script type="text/javascript" src="$relpath^dynsections.js"></script>
 $treeview
 $search
 $mathjax
-<link href="$relpath$$stylesheet" rel="stylesheet" type="text/css" />
+<link href="$relpath^$stylesheet" rel="stylesheet" type="text/css" />
 $extrastylesheet
 </head>
 <body>
@@ -24,7 +24,7 @@ $extrastylesheet
  <tbody>
  <tr style="height: 56px;">
   <!--BEGIN PROJECT_LOGO-->
-  <td id="projectlogo"><img alt="Logo" src="$relpath$$projectlogo"/></td>
+  <td id="projectlogo"><img alt="Logo" src="$relpath^$projectlogo"/></td>
   <!--END PROJECT_LOGO-->
   <!--BEGIN PROJECT_NAME-->
   <td style="padding-left: 0.5em;">
index 505960a..62960d6 100644 (file)
@@ -6,13 +6,13 @@
 "<meta name=\"generator\" content=\"Doxygen $doxygenversion\"/>\n"
 "<!--BEGIN PROJECT_NAME--><title>$projectname: $title</title><!--END PROJECT_NAME-->\n"
 "<!--BEGIN !PROJECT_NAME--><title>$title</title><!--END !PROJECT_NAME-->\n"
-"<link href=\"$relpath$tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n"
-"<script type=\"text/javascript\" src=\"$relpath$jquery.js\"></script>\n"
-"<script type=\"text/javascript\" src=\"$relpath$dynsections.js\"></script>\n"
+"<link href=\"$relpath^tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n"
+"<script type=\"text/javascript\" src=\"$relpath^jquery.js\"></script>\n"
+"<script type=\"text/javascript\" src=\"$relpath^dynsections.js\"></script>\n"
 "$treeview\n"
 "$search\n"
 "$mathjax\n"
-"<link href=\"$relpath$$stylesheet\" rel=\"stylesheet\" type=\"text/css\" />\n"
+"<link href=\"$relpath^$stylesheet\" rel=\"stylesheet\" type=\"text/css\" />\n"
 "$extrastylesheet\n"
 "</head>\n"
 "<body>\n"
@@ -24,7 +24,7 @@
 " <tbody>\n"
 " <tr style=\"height: 56px;\">\n"
 "  <!--BEGIN PROJECT_LOGO-->\n"
-"  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"$relpath$$projectlogo\"/></td>\n"
+"  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"$relpath^$projectlogo\"/></td>\n"
 "  <!--END PROJECT_LOGO-->\n"
 "  <!--BEGIN PROJECT_NAME-->\n"
 "  <td style=\"padding-left: 0.5em;\">\n"
index 2acceb8..5f0c71a 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -32,7 +32,7 @@ static QDict<QCString> g_symbolDict(10007);
 
 /*! constructs command line of htags(1) and executes it.
  *  \retval TRUE success
- *  \retval FALSE an error has occured.
+ *  \retval FALSE an error has occurred.
  */
 bool Htags::execute(const QCString &htmldir)
 {
@@ -52,14 +52,14 @@ bool Htags::execute(const QCString &htmldir)
   {
     g_inputDir.setPath(inputSource.first());
     if (!g_inputDir.exists())
-      err("error: Cannot find directory %s. "
+      err("Cannot find directory %s. "
           "Check the value of the INPUT tag in the configuration file.\n",
           inputSource.first()
          );
   }
   else
   {
-    err("error: If you use USE_HTAGS then INPUT should specific a single directory. \n");
+    err("If you use USE_HTAGS then INPUT should specific a single directory. \n");
     return FALSE;
   }
 
@@ -145,7 +145,7 @@ bool Htags::loadFilemap(const QCString &htmlDir)
     }
     else
     {
-      err("error: file %s cannot be opened\n",fileMapName.data()); 
+      err("file %s cannot be opened\n",fileMapName.data()); 
     }
   }
   return FALSE;
index 4a164a6..474b098 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index b391861..203fb48 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -15,6 +15,9 @@
 #ifndef _HTMLATTRIB_H
 #define _HTMLATTRIB_H
 
+#include <qcstring.h>
+#include <qlist.h>
+
 /*! A Html option. A name, value pair */
 struct HtmlAttrib
 {
index 3c06837..767fa5b 100644 (file)
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -39,26 +39,30 @@ static const char types[][NUM_HTML_LIST_TYPES] = {"1", "a", "i", "A"};
 static QCString convertIndexWordToAnchor(const QString &word)
 {
   static char hex[] = "0123456789abcdef";
-  uint i;
   QCString result;
-  for (i=0;i<word.length();i++)
-  {
-    int c = word.at(i);
-    if (isId(c))
+  const char *str = word.data();
+  unsigned char c;
+  while ((c = *str++)) 
+  {
+    if ((c >= 'a' && c <= 'z') || // ALPHA
+        (c >= 'A' && c <= 'A') || // ALPHA
+        (c >= '0' && c <= '9') || // DIGIT
+        c == '-' || 
+        c == '.' || 
+        c == '_' || 
+        c == '~'
+       )
     {
-      result+=c;
+      result += c;
     }
-    else if (isspace(c))
+    else 
     {
-      result+="_";
-    }
-    else
-    {
-      char cs[3];
-      cs[0]=hex[c>>4];
-      cs[1]=hex[c&0xf];
-      cs[2]=0;
-      result+=cs;
+      char enc[4];
+      enc[0] = '%';
+      enc[1] = hex[(c & 0xf0) >> 4];
+      enc[2] = hex[c & 0xf];
+      enc[3] = 0;
+      result += enc;
     }
   }
   return result;
@@ -153,6 +157,7 @@ void HtmlDocVisitor::visit(DocWord *w)
 void HtmlDocVisitor::visit(DocLinkedWord *w)
 {
   if (m_hide) return;
+  //printf("linked word: %s\n",w->word().data());
   startLink(w->ref(),w->file(),w->relPath(),w->anchor(),w->tooltip());
   filter(w->word());
   endLink();
@@ -277,7 +282,7 @@ void HtmlDocVisitor::visit(DocSymbol *s)
     case DocSymbol::LeftFloor:     m_t << "&lfloor;"; break;
     case DocSymbol::RightFloor:    m_t << "&rfloor;"; break;
     default:
-       err("error: unknown symbol found\n");
+       err("unknown symbol found\n");
   }
 }
 
@@ -447,7 +452,8 @@ void HtmlDocVisitor::visit(DocVerbatim *s)
     case DocVerbatim::ManOnly: 
     case DocVerbatim::LatexOnly: 
     case DocVerbatim::XmlOnly: 
-    case DocVerbatim::RtfOnly: 
+    case DocVerbatim::RtfOnly:
+    case DocVerbatim::DocbookOnly:
       /* nothing */ 
       break;
 
@@ -478,31 +484,7 @@ void HtmlDocVisitor::visit(DocVerbatim *s)
         if (Config_getBool("DOT_CLEANUP")) file.remove();
       }
       break;
-#if 0
-      case DocVerbatim::Vhdf:  
-          if (VhdlDocGen::getFlowMember()) // use VHDL flow chart creator
-          {
-            QCString fname=FlowNode::convertNameToFileName(); 
-     //       fprintf(stderr,"\n create flow mem %s \n",fname.data());
-            //m_t << "<div align=\"left\">" << endl; // TODO: use CSS
-            m_t << "<p>";
-            m_t << "flowchart: " ; // TODO: translate me
-            m_t << "<a href=\"";
-            m_t << fname.data(); 
-            m_t << ".svg\">";
-            m_t << VhdlDocGen::getFlowMember()->name().data(); 
-            m_t << "</a>";
-            if (!s->text().isEmpty())
-            {
-              m_t << "<br/>";
-              m_t << s->text().data();
-            }
-            m_t << "</p>";
-            VhdlDocGen::setFlowMember(NULL);
-          }
-      break;
-#endif
-      case DocVerbatim::Msc:
+    case DocVerbatim::Msc:
       {
         forceEndParagraph(s);
 
@@ -560,7 +542,7 @@ void HtmlDocVisitor::visit(DocInclude *inc)
                                         -1,    // endLine
                                         TRUE,  // inlineFragment
                                         0,     // memberDef
-                                        TRUE,  // show line numbers
+                                        FALSE, // show line numbers
                                         m_ctx  // search context 
                                        );
       m_t << PREFRAG_END;
@@ -1796,7 +1778,7 @@ void HtmlDocVisitor::visitPre(DocVhdlFlow *vf)
   if (VhdlDocGen::getFlowMember()) // use VHDL flow chart creator
   {
     forceEndParagraph(vf);
-    QCString fname=FlowNode::convertNameToFileName(); 
+    QCString fname=FlowChart::convertNameToFileName(); 
     m_t << "<p>";
     m_t << "flowchart: " ; // TODO: translate me
     m_t << "<a href=\"";
@@ -1857,11 +1839,11 @@ void HtmlDocVisitor::filterQuotedCdataAttr(const char* str)
        // it's enough to replace these two, provided that the declaration
        // for the HTML version we generate (and as supported by the browser)
        // specifies that all the other symbols used in rawVal are
-       // within the right charachter class (i.e., they're not
-       // some multinational weird charachters not in the BASESET).
+       // within the right character class (i.e., they're not
+       // some multinational weird characters not in the BASESET).
        // We assume that 1) the browser will support whatever is remaining
        // in the formula and 2) the TeX formulae are generally governed
-       // by even stricter charachter restrictions so it should be enough.
+       // by even stricter character restrictions so it should be enough.
        //
        // On some incompliant browsers, additional translation of
        // '>' and '<' into "&gt;" and "&lt;", respectively, might be needed;
@@ -1880,6 +1862,7 @@ void HtmlDocVisitor::startLink(const QCString &ref,const QCString &file,
                                const QCString &relPath,const QCString &anchor,
                                const QCString &tooltip)
 {
+  //printf("HtmlDocVisitor: file=%s anchor=%s\n",file.data(),anchor.data());
   if (!ref.isEmpty()) // link to entity imported via tag file
   {
     m_t << "<a class=\"elRef\" ";
index 150493b..3624224 100644 (file)
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 90d9f84..1644f23 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -104,6 +104,7 @@ static const char extsearch_script[]=
 
 static QCString g_header;
 static QCString g_footer;
+static QCString g_mathjax_code;
 
 //------------------------- Pictures for the Tabs ------------------------
 
@@ -804,7 +805,7 @@ static void writeImgData(const char *dir,img_data_item *data)
     if (f.open(IO_WriteOnly))
     {
       f.writeBlock((char*)data->content,
-                    data->len>0 ? data->len : strlen((char*)data->content));
+                    data->len>0 ? data->len : qstrlen((char*)data->content));
     }
     else
     {
@@ -912,18 +913,18 @@ QCString substitute(const char *s,const char *src,const char *dst)
 {
   if (s==0 || src==0) return s;
   const char *p, *q;
-  int srcLen = strlen(src);
-  int dstLen = dst ? strlen(dst) : 0;
+  int srcLen = qstrlen(src);
+  int dstLen = dst ? qstrlen(dst) : 0;
   int resLen;
   if (srcLen!=dstLen)
   {
     int count;
     for (count=0, p=s; (q=strstr(p,src))!=0; p=q+srcLen) count++;
-    resLen = (int)(p-s)+strlen(p)+count*(dstLen-srcLen);
+    resLen = (int)(p-s)+qstrlen(p)+count*(dstLen-srcLen);
   }
   else // result has same size as s
   {
-    resLen = strlen(s);
+    resLen = qstrlen(s);
   }
   QCString result(resLen+1);
   char *r;
@@ -935,7 +936,7 @@ QCString substitute(const char *s,const char *src,const char *dst)
     if (dst) memcpy(r,dst,dstLen);
     r+=dstLen;
   }
-  strcpy(r,p);
+  qstrcpy(r,p);
   //printf("substitute(%s,%s,%s)->%s\n",s,src,dst,result.data());
   return result;
 }
@@ -946,8 +947,8 @@ QCString clearBlock(const char *s,const char *begin,const char *end)
 {
   if (s==0 || begin==0 || end==0) return s;
   const char *p, *q;
-  int beginLen = strlen(begin);
-  int endLen = strlen(end);
+  int beginLen = qstrlen(begin);
+  int endLen = qstrlen(end);
   int resLen = 0;
   for (p=s; (q=strstr(p,begin))!=0; p=q+endLen)
   {
@@ -959,7 +960,7 @@ QCString clearBlock(const char *s,const char *begin,const char *end)
       break;
     }
   }
-  resLen+=strlen(p);
+  resLen+=qstrlen(p);
   // resLen is the length of the string without the marked block
 
   QCString result(resLen+1);
@@ -977,7 +978,7 @@ QCString clearBlock(const char *s,const char *begin,const char *end)
       break;
     }
   }
-  strcpy(r,p);
+  qstrcpy(r,p);
   return result;
 }
 //----------------------------------------------------------------------
@@ -1098,7 +1099,7 @@ static QCString substituteHtmlKeywords(const QCString &s,
   extraCssFile = Config_getString("HTML_EXTRA_STYLESHEET");
   if (!extraCssFile.isEmpty())
   {
-    extraCssText = "<link href=\"$relpath$"+stripPath(extraCssFile)+"\" rel=\"stylesheet\" type=\"text/css\"/>\n";
+    extraCssText = "<link href=\"$relpath^"+stripPath(extraCssFile)+"\" rel=\"stylesheet\" type=\"text/css\"/>\n";
   }
 
   if (timeStamp) {
@@ -1110,9 +1111,9 @@ static QCString substituteHtmlKeywords(const QCString &s,
 
   if (treeView)
   {
-    treeViewCssJs = "<link href=\"$relpath$navtree.css\" rel=\"stylesheet\" type=\"text/css\"/>\n"
-                    "<script type=\"text/javascript\" src=\"$relpath$resize.js\"></script>\n"
-                    "<script type=\"text/javascript\" src=\"$relpath$navtree.js\"></script>\n"
+    treeViewCssJs = "<link href=\"$relpath^navtree.css\" rel=\"stylesheet\" type=\"text/css\"/>\n"
+                    "<script type=\"text/javascript\" src=\"$relpath^resize.js\"></script>\n"
+                    "<script type=\"text/javascript\" src=\"$relpath^navtree.js\"></script>\n"
                     "<script type=\"text/javascript\">\n"
                     "  $(document).ready(initResizable);\n"
                     "  $(window).load(resizeHeight);\n"
@@ -1121,8 +1122,8 @@ static QCString substituteHtmlKeywords(const QCString &s,
 
   if (searchEngine)
   {
-    searchCssJs = "<link href=\"$relpath$search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n";
-    searchCssJs += "<script type=\"text/javascript\" src=\"$relpath$search/search.js\"></script>\n";
+    searchCssJs = "<link href=\"$relpath^search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n";
+    searchCssJs += "<script type=\"text/javascript\" src=\"$relpath^search/search.js\"></script>\n";
 
     if (!serverBasedSearch) 
     {
@@ -1176,8 +1177,13 @@ static QCString substituteHtmlKeywords(const QCString &s,
     }
     mathJaxJs += "],\n"
                  "    jax: [\"input/TeX\",\"output/"+mathJaxFormat+"\"],\n"
-                 "});\n"
-                 "</script>";
+                 "});\n";
+    if (!g_mathjax_code.isEmpty())
+    {
+      mathJaxJs += g_mathjax_code;
+      mathJaxJs += "\n";
+    }
+    mathJaxJs += "</script>";
     mathJaxJs += "<script src=\"" + path + "MathJax.js\"></script>\n";
   }
 
@@ -1196,7 +1202,8 @@ static QCString substituteHtmlKeywords(const QCString &s,
   result = substitute(result,"$mathjax",mathJaxJs);
   result = substitute(result,"$generatedby",generatedBy);
   result = substitute(result,"$extrastylesheet",extraCssText);
-  result = substitute(result,"$relpath$",relPath); //<-- must be last
+  result = substitute(result,"$relpath$",relPath); //<-- obsolete: for backwards compatibility only
+  result = substitute(result,"$relpath^",relPath); //<-- must be last
   
   // additional HTML only conditional blocks
   result = selectBlock(result,"DISABLE_INDEX",disableIndex);
@@ -1277,7 +1284,7 @@ void HtmlCodeGenerator::codify(const char *str)
                      m_t << "\\";
                    m_col++;
                    break;
-        default:   m_t << c;    
+        default:   p=writeUtf8Char(m_t,p-1);    
                    m_col++;                    
                    break;
       }
@@ -1361,7 +1368,7 @@ void HtmlCodeGenerator::writeCodeLink(const char *ref,const char *f,
   m_t << ">";
   docify(name);
   m_t << "</a>";
-  m_col+=strlen(name);
+  m_col+=qstrlen(name);
 }
 
 void HtmlCodeGenerator::startCodeLine(bool hasLineNumbers) 
@@ -1402,11 +1409,6 @@ void HtmlCodeGenerator::writeCodeAnchor(const char *anchor)
   if (m_streamSet) m_t << "<a name=\"" << anchor << "\"></a>"; 
 }
 
-void HtmlCodeGenerator::linkableSymbol(int,const char *,Definition *,Definition *) 
-{
-}
-
-
 //--------------------------------------------------------------------------
 
 HtmlGenerator::HtmlGenerator() : OutputGenerator()
@@ -1449,6 +1451,15 @@ void HtmlGenerator::init()
   {
     g_footer = defaultHtmlFooter;
   }
+
+  if (Config_getBool("USE_MATHJAX"))
+  {
+    if (!Config_getString("MATHJAX_CODEFILE").isEmpty()) 
+    {
+      g_mathjax_code=fileToString(Config_getString("MATHJAX_CODEFILE"));
+      //printf("g_mathjax_code='%s'\n",g_mathjax_code.data());
+    }
+  }
   createSubDirs(d);
 
   QCString fileName=dname+"/tabs.css";
@@ -1699,7 +1710,7 @@ void HtmlGenerator::writeStyleInfo(int part)
       QFileInfo cssfi(cssname);
       if (!cssfi.exists() || !cssfi.isFile() || !cssfi.isReadable())
       {
-        err("error: style sheet %s does not exist or is not readable!", Config_getString("HTML_STYLESHEET").data());
+        err("style sheet %s does not exist or is not readable!", Config_getString("HTML_STYLESHEET").data());
       }
       else
       {
@@ -2387,7 +2398,7 @@ void HtmlGenerator::endParameterName(bool last,bool emptyList,bool closeBracket)
   {
     if (emptyList)
     {
-      if (closeBracket) t << "</td><td>)";
+      if (closeBracket) t << ")</td><td>";
       t << "</td>" << endl;
       t << "          <td>";
     }
@@ -2417,6 +2428,22 @@ void HtmlGenerator::endParameterList()
   t << "        </tr>" << endl;
 }
 
+void HtmlGenerator::exceptionEntry(const char* prefix,bool closeBracket)
+{
+  DBG_HTML(t << "<!-- exceptionEntry -->" << endl;)
+  t << "</td>" << endl;
+  t << "        </tr>" << endl;
+  t << "        <tr>" << endl;
+  t << "          <td align=\"right\">";
+  // colspan 2 so it gets both parameter type and parameter name columns
+  if (prefix)
+    t << prefix << "</td><td>(</td><td colspan=\"2\">";
+  else if (closeBracket)
+    t << "</td><td>)</td><td></td><td>";
+  else
+    t << "</td><td></td><td colspan=\"2\">";
+}
+
 void HtmlGenerator::endMemberDoc(bool hasArgs)     
 { 
   DBG_HTML(t << "<!-- endMemberDoc -->" << endl;)
@@ -2926,7 +2953,7 @@ void HtmlGenerator::writeSplitBar(const char *name)
 
 void HtmlGenerator::writeNavigationPath(const char *s)
 {
-  t << substitute(s,"$relpath$",relPath);
+  t << substitute(s,"$relpath^",relPath);
 }
 
 void HtmlGenerator::startContents()
@@ -3108,17 +3135,8 @@ void HtmlGenerator::writeExternalSearchPage()
       << "\"" << theTranslator->trSearchResults(2) << "\"];" << endl;
     t << "var serverUrl=\"" << Config_getString("SEARCHENGINE_URL") << "\";" << endl;
     t << "var tagMap = {" << endl;
-    // add standard tag file mappings
-    QDictIterator<QCString> it(Doxygen::tagDestinationDict);
-    QCString *dest;
     bool first=TRUE;
-    for (it.toFirst();(dest=it.current());++it)
-    {
-      if (!first) t << "," << endl;
-      t << "  \"" << it.currentKey() << "\": \"" << *dest << "\"";
-      first=FALSE;
-    }
-    // add additional user specified mappings
+    // add search mappings
     QStrList &extraSearchMappings = Config_getList("EXTRA_SEARCH_MAPPINGS");
     char *ml=extraSearchMappings.first();
     while (ml)
@@ -3129,7 +3147,7 @@ void HtmlGenerator::writeExternalSearchPage()
       {
         QCString tagName = mapLine.left(eqPos).stripWhiteSpace();
         QCString destName = mapLine.right(mapLine.length()-eqPos-1).stripWhiteSpace();
-        if (!tagName.isEmpty() && Doxygen::tagDestinationDict.find(tagName)==0)
+        if (!tagName.isEmpty())
         {
           if (!first) t << "," << endl;
           t << "  \"" << tagName << "\": \"" << destName << "\"";
index 17f12fb..34eb1e5 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -47,7 +47,6 @@ class HtmlCodeGenerator : public CodeOutputInterface
     void startFontClass(const char *s);
     void endFontClass();
     void writeCodeAnchor(const char *anchor);
-    void linkableSymbol(int,const char *,Definition *,Definition *);
     void setCurrentDoc(Definition *,const char *,bool) {}
     void addWord(const char *,bool) {}
 
@@ -109,9 +108,6 @@ class HtmlGenerator : public OutputGenerator
     { m_codeGen.endFontClass(); }
     void writeCodeAnchor(const char *anchor) 
     { m_codeGen.writeCodeAnchor(anchor); }
-    void linkableSymbol(int line,const char *symName,
-                        Definition *symDef,Definition *context) 
-    { m_codeGen.linkableSymbol(line,symName,symDef,context); }
     // ---------------------------
 
     void setCurrentDoc(Definition *context,const char *anchor,bool isSourceFile);
@@ -312,6 +308,7 @@ class HtmlGenerator : public OutputGenerator
     void endParameterName(bool last,bool emptyList,bool closeBracket);
     void startParameterList(bool);
     void endParameterList();
+    virtual void exceptionEntry(const char*,bool);
 
     void startConstraintList(const char *);
     void startConstraintParam();
index 945a7c5..6b1f98b 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -56,7 +56,7 @@ class IndexFieldSDict : public SDict<IndexField>
    ~IndexFieldSDict() {}
     int compareItems(QCollection::Item item1, QCollection::Item item2)
     {
-      return stricmp(((IndexField *)item1)->name,((IndexField *)item2)->name);
+      return qstricmp(((IndexField *)item1)->name,((IndexField *)item2)->name);
     }
 };
 
@@ -304,7 +304,7 @@ void HtmlHelp::initialize()
   m_fromUtf8 = portable_iconv_open(str,"UTF-8"); 
   if (m_fromUtf8==(void *)(-1))
   {
-    err("Error: unsupported character conversion for CHM_INDEX_ENCODING: '%s'->'UTF-8'\n", str);
+    err("unsupported character conversion for CHM_INDEX_ENCODING: '%s'->'UTF-8'\n", str);
     exit(1);
   }
 
@@ -383,6 +383,7 @@ void HtmlHelp::initialize()
         0x422 Ukrainian
         0x81A Serbian (Serbia, Latin)
         0x403 Catalan
+        0x426 Latvian
         0x427 Lithuanian
         0x436 Afrikaans
         0x42A Vietnamese
@@ -431,6 +432,7 @@ void HtmlHelp::initialize()
   s_languageDict.insert("vietnamese",  new QCString("0x42A Vietnamese"));
   s_languageDict.insert("persian",     new QCString("0x429 Persian (Iran)"));
   s_languageDict.insert("arabic",      new QCString("0xC01 Arabic (Egypt)"));
+  s_languageDict.insert("latvian",     new QCString("0x426 Latvian"));
 }
 
 
index 4b8064d..85e46e0 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -22,6 +22,7 @@
 #define HTMLHELP_H
 
 #include <qstrlist.h>
+#include <qdict.h>
 #include "index.h"
 #include "ftextstream.h"
 
index 2293d1f..49485af 100644 (file)
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 5fb98e6..d2311a1 100644 (file)
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 2f9b06a..944d5db 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -125,7 +125,7 @@ class MemberIndexList : public QList<MemberDef>
     {
       MemberDef *md1=(MemberDef *)item1;
       MemberDef *md2=(MemberDef *)item2;
-      return stricmp(md1->name(),md2->name());
+      return qstricmp(md1->name(),md2->name());
     }
 };
 
@@ -332,7 +332,7 @@ void addMembersToIndex(T *def,LayoutDocManager::LayoutPart part,
           MemberDef *md;
           for (mi.toFirst();(md=mi.current());++mi)
           {
-            LockingPtr<MemberList> enumList = md->enumFieldList();
+            MemberList *enumList = md->enumFieldList();
             bool isDir = enumList!=0 && md->isEnumerate();
             bool isAnonymous = md->name().find('@')!=-1;
             static bool hideUndocMembers = Config_getBool("HIDE_UNDOC_MEMBERS");
@@ -602,7 +602,7 @@ static void writeDirTreeNode(OutputList &ol, DirDef *dd, int level, FTVHelp* ftv
   if (level>20)
   {
     warn(dd->getDefFileName(),dd->getDefLine(),
-        "warning: maximum nesting level exceeded for directory %s: "
+        "maximum nesting level exceeded for directory %s: "
         "check for possible recursive directory relation!\n",dd->name().data()
         );
     return;
@@ -1265,7 +1265,7 @@ static void writeFileIndex(OutputList &ol)
         if (hasBrief)
         {
           //ol.docify(" (");
-          ol.parseDoc(
+          ol.generateDoc(
               fd->briefFile(),fd->briefLine(),
               fd,0,
               fd->briefDescription(TRUE),
@@ -1384,13 +1384,13 @@ void writeClassTree(ClassSDict *clDict,FTVHelp *ftv,bool addToIndex,bool globalO
           ftv->addContentsItem(count>0,cd->displayName(FALSE),cd->getReference(),
               cd->getOutputFileBase(),cd->anchor(),FALSE,TRUE,cd); 
           if (addToIndex && 
-              cd->partOfGroups()==0 &&
+              /*cd->partOfGroups()==0 &&*/
               (cd->getOuterScope()==0 || 
                cd->getOuterScope()->definitionType()!=Definition::TypeClass
               )
              )
           {
-            addMembersToIndex(cd,LayoutDocManager::Class,cd->displayName(FALSE),cd->anchor());
+            addMembersToIndex(cd,LayoutDocManager::Class,cd->displayName(FALSE),cd->anchor(),cd->partOfGroups()==0);
           }
           if (count>0)
           {
@@ -1461,7 +1461,7 @@ static void writeNamespaceTree(NamespaceSDict *nsDict,FTVHelp *ftv,
           file = nd->getOutputFileBase();
           if (nd->getLanguage()==SrcLangExt_VHDL) // UGLY HACK
           {
-            file=file.replace(0,strlen("namespace"),"class");
+            file=file.replace(0,qstrlen("namespace"),"class");
           }
         }
 
@@ -1537,7 +1537,7 @@ static void writeNamespaceIndex(OutputList &ol)
       ol.startIndexKey();
       if (nd->getLanguage()==SrcLangExt_VHDL)
       {
-        ol.writeObjectLink(0, nd->getOutputFileBase().replace(0,strlen("namespace"),"class"),0,nd->displayName());
+        ol.writeObjectLink(0, nd->getOutputFileBase().replace(0,qstrlen("namespace"),"class"),0,nd->displayName());
       }
       else
       {
@@ -1550,7 +1550,7 @@ static void writeNamespaceIndex(OutputList &ol)
       if (hasBrief)
       {
         //ol.docify(" (");
-        ol.parseDoc(
+        ol.generateDoc(
                  nd->briefFile(),nd->briefLine(),
                  nd,0,
                  nd->briefDescription(TRUE),
@@ -1667,7 +1667,7 @@ static void writeAnnotatedClassList(OutputList &ol)
       ol.startIndexValue(hasBrief);
       if (hasBrief)
       {
-        ol.parseDoc(
+        ol.generateDoc(
                  cd->briefFile(),cd->briefLine(),
                  cd,0,
                  cd->briefDescription(TRUE),
@@ -1722,7 +1722,7 @@ public:
 
     QCString n1 = c1->className();
     QCString n2 = c2->className();
-    return stricmp (n1.data()+getPrefixIndex(n1), n2.data()+getPrefixIndex(n2));
+    return qstricmp (n1.data()+getPrefixIndex(n1), n2.data()+getPrefixIndex(n2));
   }
 };
 
@@ -3458,7 +3458,7 @@ void writeGraphInfo(OutputList &ol)
     //printf("legendDocs=%s\n",legendDocs.data());
   }
   FileDef fd("","graph_legend");
-  ol.parseDoc("graph_legend",1,&fd,0,legendDocs,FALSE,FALSE);
+  ol.generateDoc("graph_legend",1,&fd,0,legendDocs,FALSE,FALSE);
   stripCommentsStateRef = oldStripCommentsState;
   endFile(ol);
   ol.popGeneratorState();
@@ -3477,7 +3477,7 @@ static void writeGroupTreeNode(OutputList &ol, GroupDef *gd, int level, FTVHelp*
   if (level>20)
   {
     warn(gd->getDefFileName(),gd->getDefLine(),
-        "warning: maximum nesting level exceeded for group %s: check for possible recursive group relation!\n",gd->name().data()
+        "maximum nesting level exceeded for group %s: check for possible recursive group relation!\n",gd->name().data()
         );
     return;
   }
@@ -3558,7 +3558,7 @@ static void writeGroupTreeNode(OutputList &ol, GroupDef *gd, int level, FTVHelp*
           MemberDef *md;
           for (mi.toFirst();(md=mi.current());++mi)
           {
-            LockingPtr<MemberList> enumList = md->enumFieldList();
+            MemberList *enumList = md->enumFieldList();
             bool isDir = enumList!=0 && md->isEnumerate();
             if (md->isVisible() && md->name().find('@')==-1)
             {
@@ -3907,35 +3907,38 @@ static void writeDirIndex(OutputList &ol)
 
 static void writeUserGroupStubPage(OutputList &ol,LayoutNavEntry *lne)
 {
-  ol.pushGeneratorState();
-  ol.disableAllBut(OutputGenerator::Html);
-  startFile(ol,lne->baseFile(),0,lne->title(),HLI_UserGroup);
-  startTitle(ol,0);
-  ol.parseText(lne->title());
-  endTitle(ol,0,0);
-  ol.startContents();
-  QListIterator<LayoutNavEntry> li(lne->children());
-  LayoutNavEntry *entry;
-  int count=0;
-  for (li.toFirst();(entry=li.current());++li)
-  {
-    if (entry->visible()) count++;
-  }
-  if (count>0)
+  if (lne->baseFile().left(9)=="usergroup")
   {
-    ol.writeString("<ul>\n");
+    ol.pushGeneratorState();
+    ol.disableAllBut(OutputGenerator::Html);
+    startFile(ol,lne->baseFile(),0,lne->title(),HLI_UserGroup);
+    startTitle(ol,0);
+    ol.parseText(lne->title());
+    endTitle(ol,0,0);
+    ol.startContents();
+    QListIterator<LayoutNavEntry> li(lne->children());
+    LayoutNavEntry *entry;
+    int count=0;
     for (li.toFirst();(entry=li.current());++li)
     {
-      if (entry->visible())
+      if (entry->visible()) count++;
+    }
+    if (count>0)
+    {
+      ol.writeString("<ul>\n");
+      for (li.toFirst();(entry=li.current());++li)
       {
-        ol.writeString("<li><a href=\""+entry->url()+"\"><span>"+
-            fixSpaces(entry->title())+"</span></a></li>\n");
+        if (entry->visible())
+        {
+          ol.writeString("<li><a href=\""+entry->url()+"\"><span>"+
+              fixSpaces(entry->title())+"</span></a></li>\n");
+        }
       }
+      ol.writeString("</ul>\n");
     }
-    ol.writeString("</ul>\n");
+    endFile(ol);
+    ol.popGeneratorState();
   }
-  endFile(ol);
-  ol.popGeneratorState();
 }
 
 //----------------------------------------------------------------------------
@@ -3945,13 +3948,14 @@ static void writeIndex(OutputList &ol)
 {
   static bool fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN");
   static bool vhdlOpt    = Config_getBool("OPTIMIZE_OUTPUT_VHDL");
+  static QCString projectName = Config_getString("PROJECT_NAME");
   // save old generator state
   ol.pushGeneratorState();
 
   QCString projPrefix;
-  if (!Config_getString("PROJECT_NAME").isEmpty())
+  if (!projectName.isEmpty())
   {
-    projPrefix=Config_getString("PROJECT_NAME")+" ";
+    projPrefix=projectName+" ";
   }
 
   //--------------------------------------------------------------------
@@ -3979,8 +3983,8 @@ static void writeIndex(OutputList &ol)
   
   if (Doxygen::mainPage)
   {
-    if (/*Doxygen::mainPage->hasSubPages() || */
-        (!Config_getString("PROJECT_NAME").isEmpty() && mainPageHasTitle())
+    if (
+        (!projectName.isEmpty() && mainPageHasTitle() && qstricmp(title,projectName)!=0)
        ) // to avoid duplicate entries in the treeview
     {
       Doxygen::indexList->addContentsItem(Doxygen::mainPage->hasSubPages(),title,0,indexName,0,Doxygen::mainPage->hasSubPages(),TRUE); 
@@ -4006,7 +4010,7 @@ static void writeIndex(OutputList &ol)
     {
       ol.startHeaderSection();
       ol.startTitleHead(0);
-      ol.parseDoc(Doxygen::mainPage->docFile(),Doxygen::mainPage->docLine(),
+      ol.generateDoc(Doxygen::mainPage->docFile(),Doxygen::mainPage->docLine(),
                   Doxygen::mainPage,0,Doxygen::mainPage->title(),
                   TRUE,FALSE,0,TRUE,FALSE);
       headerWritten = TRUE;
@@ -4014,7 +4018,7 @@ static void writeIndex(OutputList &ol)
   }
   else
   {
-    if (!Config_getString("PROJECT_NAME").isEmpty())
+    if (!projectName.isEmpty())
     {
       ol.startHeaderSection();
       ol.startTitleHead(0);
@@ -4043,7 +4047,7 @@ static void writeIndex(OutputList &ol)
     }
 
     ol.startTextBlock();
-    ol.parseDoc(defFileName,defLine,Doxygen::mainPage,0,
+    ol.generateDoc(defFileName,defLine,Doxygen::mainPage,0,
                 Doxygen::mainPage->documentation(),TRUE,FALSE
                 /*,Doxygen::mainPage->sectionDict*/);
     ol.endTextBlock();
@@ -4079,7 +4083,7 @@ static void writeIndex(OutputList &ol)
   if (!Config_getString("PROJECT_NUMBER").isEmpty())
   {
     ol.startProjectNumber(); 
-    ol.parseDoc(defFileName,defLine,Doxygen::mainPage,0,Config_getString("PROJECT_NUMBER"),FALSE,FALSE);
+    ol.generateDoc(defFileName,defLine,Doxygen::mainPage,0,Config_getString("PROJECT_NUMBER"),FALSE,FALSE);
     ol.endProjectNumber();
   }
   ol.endIndexSection(isTitlePageStart);
@@ -4234,7 +4238,7 @@ static void writeIndex(OutputList &ol)
     startFile(ol,Doxygen::mainPage->name(),0,Doxygen::mainPage->title());
     ol.startContents();
     ol.startTextBlock();
-    ol.parseDoc(defFileName,defLine,Doxygen::mainPage,0,
+    ol.generateDoc(defFileName,defLine,Doxygen::mainPage,0,
                 Doxygen::mainPage->documentation(),FALSE,FALSE
                );
     ol.endTextBlock();
@@ -4391,18 +4395,40 @@ static void writeIndexHierarchyEntries(OutputList &ol,const QList<LayoutNavEntry
           {
             // prepend a ! or ^ marker to the URL to avoid tampering with it
             QCString url = correctURL(lne->url(),"!"); // add ! to relative URL
-            if (!url.isEmpty() && url.at(0)!='!') // absolute URL
+            bool isRelative=url.at(0)=='!';
+            if (!url.isEmpty() && !isRelative) // absolute URL
             {
               url.prepend("^"); // prepend ^ to absolute URL
             }
             bool isRef = lne->baseFile().left(4)=="@ref" || lne->baseFile().left(4)=="\\ref";
-            Doxygen::indexList->addContentsItem(TRUE,lne->title(),0,url,0,FALSE,isRef); 
+            Doxygen::indexList->addContentsItem(TRUE,lne->title(),0,url,0,FALSE,isRef || isRelative); 
           }
           break;
         case LayoutNavEntry::UserGroup:
           if (addToIndex)
           {
-            Doxygen::indexList->addContentsItem(TRUE,lne->title(),0,lne->baseFile(),0,TRUE,TRUE); 
+            QCString url = correctURL(lne->url(),"!"); // add ! to relative URL
+            if (!url.isEmpty())
+            {
+              if (url=="![none]")
+              {
+                Doxygen::indexList->addContentsItem(TRUE,lne->title(),0,0,0,FALSE,FALSE); 
+              }
+              else
+              {
+                bool isRelative=url.at(0)=='!';
+                if (!isRelative) // absolute URL
+                {
+                  url.prepend("^"); // prepend ^ to absolute URL
+                }
+                bool isRef = lne->baseFile().left(4)=="@ref" || lne->baseFile().left(4)=="\\ref";
+                Doxygen::indexList->addContentsItem(TRUE,lne->title(),0,url,0,FALSE,isRef || isRelative); 
+              }
+            }
+            else 
+            {
+              Doxygen::indexList->addContentsItem(TRUE,lne->title(),0,lne->baseFile(),0,TRUE,TRUE); 
+            }
             Doxygen::indexList->incContentsDepth();
             needsClosing=TRUE;
           }
index fa3c8fe..ae15f16 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index f242cb9..97e5843 100644 (file)
@@ -1,11 +1 @@
-/**
- * jQuery.ScrollTo - Easy element scrolling using jQuery.
- * Copyright (c) 2007-2009 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com
- * Dual licensed under MIT and GPL.
- * Date: 5/25/2009
- * @author Ariel Flesler
- * @version 1.4.2
- *
- * http://flesler.blogspot.com/2007/10/jqueryscrollto.html
- */
-;(function(d){var k=d.scrollTo=function(a,i,e){d(window).scrollTo(a,i,e)};k.defaults={axis:'xy',duration:parseFloat(d.fn.jquery)>=1.3?0:1};k.window=function(a){return d(window)._scrollable()};d.fn._scrollable=function(){return this.map(function(){var a=this,i=!a.nodeName||d.inArray(a.nodeName.toLowerCase(),['iframe','#document','html','body'])!=-1;if(!i)return a;var e=(a.contentWindow||a).document||a.ownerDocument||a;return d.browser.safari||e.compatMode=='BackCompat'?e.body:e.documentElement})};d.fn.scrollTo=function(n,j,b){if(typeof j=='object'){b=j;j=0}if(typeof b=='function')b={onAfter:b};if(n=='max')n=9e9;b=d.extend({},k.defaults,b);j=j||b.speed||b.duration;b.queue=b.queue&&b.axis.length>1;if(b.queue)j/=2;b.offset=p(b.offset);b.over=p(b.over);return this._scrollable().each(function(){var q=this,r=d(q),f=n,s,g={},u=r.is('html,body');switch(typeof f){case'number':case'string':if(/^([+-]=)?\d+(\.\d+)?(px|%)?$/.test(f)){f=p(f);break}f=d(f,this);case'object':if(f.is||f.style)s=(f=d(f)).offset()}d.each(b.axis.split(''),function(a,i){var e=i=='x'?'Left':'Top',h=e.toLowerCase(),c='scroll'+e,l=q[c],m=k.max(q,i);if(s){g[c]=s[h]+(u?0:l-r.offset()[h]);if(b.margin){g[c]-=parseInt(f.css('margin'+e))||0;g[c]-=parseInt(f.css('border'+e+'Width'))||0}g[c]+=b.offset[h]||0;if(b.over[h])g[c]+=f[i=='x'?'width':'height']()*b.over[h]}else{var o=f[h];g[c]=o.slice&&o.slice(-1)=='%'?parseFloat(o)/100*m:o}if(/^\d+$/.test(g[c]))g[c]=g[c]<=0?0:Math.min(g[c],m);if(!a&&b.queue){if(l!=g[c])t(b.onAfterFirst);delete g[c]}});t(b.onAfter);function t(a){r.animate(g,j,b.easing,a&&function(){a.call(this,n,b)})}}).end()};k.max=function(a,i){var e=i=='x'?'Width':'Height',h='scroll'+e;if(!d(a).is('html,body'))return a[h]-d(a)[e.toLowerCase()]();var c='client'+e,l=a.ownerDocument.documentElement,m=a.ownerDocument.body;return Math.max(l[h],m[h])-Math.min(l[c],m[c])};function p(a){return typeof a=='object'?a:{top:a,left:a}}})(jQuery);
+(function(c){var a=c.scrollTo=function(f,e,d){c(window).scrollTo(f,e,d)};a.defaults={axis:"xy",duration:parseFloat(c.fn.jquery)>=1.3?0:1};a.window=function(d){return c(window)._scrollable()};c.fn._scrollable=function(){return this.map(function(){var e=this,d=!e.nodeName||c.inArray(e.nodeName.toLowerCase(),["iframe","#document","html","body"])!=-1;if(!d){return e}var f=(e.contentWindow||e).document||e.ownerDocument||e;return c.browser.safari||f.compatMode=="BackCompat"?f.body:f.documentElement})};c.fn.scrollTo=function(f,e,d){if(typeof e=="object"){d=e;e=0}if(typeof d=="function"){d={onAfter:d}}if(f=="max"){f=9000000000}d=c.extend({},a.defaults,d);e=e||d.speed||d.duration;d.queue=d.queue&&d.axis.length>1;if(d.queue){e/=2}d.offset=b(d.offset);d.over=b(d.over);return this._scrollable().each(function(){var l=this,j=c(l),k=f,i,g={},m=j.is("html,body");switch(typeof k){case"number":case"string":if(/^([+-]=)?\d+(\.\d+)?(px|%)?$/.test(k)){k=b(k);break}k=c(k,this);case"object":if(k.is||k.style){i=(k=c(k)).offset()}}c.each(d.axis.split(""),function(q,r){var s=r=="x"?"Left":"Top",u=s.toLowerCase(),p="scroll"+s,o=l[p],n=a.max(l,r);if(i){g[p]=i[u]+(m?0:o-j.offset()[u]);if(d.margin){g[p]-=parseInt(k.css("margin"+s))||0;g[p]-=parseInt(k.css("border"+s+"Width"))||0}g[p]+=d.offset[u]||0;if(d.over[u]){g[p]+=k[r=="x"?"width":"height"]()*d.over[u]}}else{var t=k[u];g[p]=t.slice&&t.slice(-1)=="%"?parseFloat(t)/100*n:t}if(/^\d+$/.test(g[p])){g[p]=g[p]<=0?0:Math.min(g[p],n)}if(!q&&d.queue){if(o!=g[p]){h(d.onAfterFirst)}delete g[p]}});h(d.onAfter);function h(n){j.animate(g,e,d.easing,n&&function(){n.call(this,f,d)})}}).end()};a.max=function(j,i){var h=i=="x"?"Width":"Height",e="scroll"+h;if(!c(j).is("html,body")){return j[e]-c(j)[h.toLowerCase()]()}var g="client"+h,f=j.ownerDocument.documentElement,d=j.ownerDocument.body;return Math.max(f[e],d[e])-Math.min(f[g],d[g])};function b(d){return typeof d=="object"?d:{top:d,left:d}}})(jQuery);
\ No newline at end of file
index f5b0da2..7fd7f2e 100644 (file)
@@ -1,11 +1 @@
-"/**\n"
-" * jQuery.ScrollTo - Easy element scrolling using jQuery.\n"
-" * Copyright (c) 2007-2009 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com\n"
-" * Dual licensed under MIT and GPL.\n"
-" * Date: 5/25/2009\n"
-" * @author Ariel Flesler\n"
-" * @version 1.4.2\n"
-" *\n"
-" * http://flesler.blogspot.com/2007/10/jqueryscrollto.html\n"
-" */\n"
-";(function(d){var k=d.scrollTo=function(a,i,e){d(window).scrollTo(a,i,e)};k.defaults={axis:'xy',duration:parseFloat(d.fn.jquery)>=1.3?0:1};k.window=function(a){return d(window)._scrollable()};d.fn._scrollable=function(){return this.map(function(){var a=this,i=!a.nodeName||d.inArray(a.nodeName.toLowerCase(),['iframe','#document','html','body'])!=-1;if(!i)return a;var e=(a.contentWindow||a).document||a.ownerDocument||a;return d.browser.safari||e.compatMode=='BackCompat'?e.body:e.documentElement})};d.fn.scrollTo=function(n,j,b){if(typeof j=='object'){b=j;j=0}if(typeof b=='function')b={onAfter:b};if(n=='max')n=9e9;b=d.extend({},k.defaults,b);j=j||b.speed||b.duration;b.queue=b.queue&&b.axis.length>1;if(b.queue)j/=2;b.offset=p(b.offset);b.over=p(b.over);return this._scrollable().each(function(){var q=this,r=d(q),f=n,s,g={},u=r.is('html,body');switch(typeof f){case'number':case'string':if(/^([+-]=)?\\d+(\\.\\d+)?(px|%)?$/.test(f)){f=p(f);break}f=d(f,this);case'object':if(f.is||f.style)s=(f=d(f)).offset()}d.each(b.axis.split(''),function(a,i){var e=i=='x'?'Left':'Top',h=e.toLowerCase(),c='scroll'+e,l=q[c],m=k.max(q,i);if(s){g[c]=s[h]+(u?0:l-r.offset()[h]);if(b.margin){g[c]-=parseInt(f.css('margin'+e))||0;g[c]-=parseInt(f.css('border'+e+'Width'))||0}g[c]+=b.offset[h]||0;if(b.over[h])g[c]+=f[i=='x'?'width':'height']()*b.over[h]}else{var o=f[h];g[c]=o.slice&&o.slice(-1)=='%'?parseFloat(o)/100*m:o}if(/^\\d+$/.test(g[c]))g[c]=g[c]<=0?0:Math.min(g[c],m);if(!a&&b.queue){if(l!=g[c])t(b.onAfterFirst);delete g[c]}});t(b.onAfter);function t(a){r.animate(g,j,b.easing,a&&function(){a.call(this,n,b)})}}).end()};k.max=function(a,i){var e=i=='x'?'Width':'Height',h='scroll'+e;if(!d(a).is('html,body'))return a[h]-d(a)[e.toLowerCase()]();var c='client'+e,l=a.ownerDocument.documentElement,m=a.ownerDocument.body;return Math.max(l[h],m[h])-Math.min(l[c],m[c])};function p(a){return typeof a=='object'?a:{top:a,left:a}}})(jQuery);\n"
+"(function(c){var a=c.scrollTo=function(f,e,d){c(window).scrollTo(f,e,d)};a.defaults={axis:\"xy\",duration:parseFloat(c.fn.jquery)>=1.3?0:1};a.window=function(d){return c(window)._scrollable()};c.fn._scrollable=function(){return this.map(function(){var e=this,d=!e.nodeName||c.inArray(e.nodeName.toLowerCase(),[\"iframe\",\"#document\",\"html\",\"body\"])!=-1;if(!d){return e}var f=(e.contentWindow||e).document||e.ownerDocument||e;return c.browser.safari||f.compatMode==\"BackCompat\"?f.body:f.documentElement})};c.fn.scrollTo=function(f,e,d){if(typeof e==\"object\"){d=e;e=0}if(typeof d==\"function\"){d={onAfter:d}}if(f==\"max\"){f=9000000000}d=c.extend({},a.defaults,d);e=e||d.speed||d.duration;d.queue=d.queue&&d.axis.length>1;if(d.queue){e/=2}d.offset=b(d.offset);d.over=b(d.over);return this._scrollable().each(function(){var l=this,j=c(l),k=f,i,g={},m=j.is(\"html,body\");switch(typeof k){case\"number\":case\"string\":if(/^([+-]=)?\\d+(\\.\\d+)?(px|%)?$/.test(k)){k=b(k);break}k=c(k,this);case\"object\":if(k.is||k.style){i=(k=c(k)).offset()}}c.each(d.axis.split(\"\"),function(q,r){var s=r==\"x\"?\"Left\":\"Top\",u=s.toLowerCase(),p=\"scroll\"+s,o=l[p],n=a.max(l,r);if(i){g[p]=i[u]+(m?0:o-j.offset()[u]);if(d.margin){g[p]-=parseInt(k.css(\"margin\"+s))||0;g[p]-=parseInt(k.css(\"border\"+s+\"Width\"))||0}g[p]+=d.offset[u]||0;if(d.over[u]){g[p]+=k[r==\"x\"?\"width\":\"height\"]()*d.over[u]}}else{var t=k[u];g[p]=t.slice&&t.slice(-1)==\"%\"?parseFloat(t)/100*n:t}if(/^\\d+$/.test(g[p])){g[p]=g[p]<=0?0:Math.min(g[p],n)}if(!q&&d.queue){if(o!=g[p]){h(d.onAfterFirst)}delete g[p]}});h(d.onAfter);function h(n){j.animate(g,e,d.easing,n&&function(){n.call(this,f,d)})}}).end()};a.max=function(j,i){var h=i==\"x\"?\"Width\":\"Height\",e=\"scroll\"+h;if(!c(j).is(\"html,body\")){return j[e]-c(j)[h.toLowerCase()]()}var g=\"client\"+h,f=j.ownerDocument.documentElement,d=j.ownerDocument.body;return Math.max(f[e],d[e])-Math.min(f[g],d[g])};function b(d){return typeof d==\"object\"?d:{top:d,left:d}}})(jQuery);\n"
index 1f06e57..06eb7e6 100644 (file)
@@ -1,3 +1,18 @@
-/*! jQuery v1.7.1 jquery.com | jquery.org/license */
-(function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cv(a){if(!ck[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){cl||(cl=c.createElement("iframe"),cl.frameBorder=cl.width=cl.height=0),b.appendChild(cl);if(!cm||!cl.createElement)cm=(cl.contentWindow||cl.contentDocument).document,cm.write((c.compatMode==="CSS1Compat"?"<!doctype html>":"")+"<html><body>"),cm.close();d=cm.createElement(a),cm.body.appendChild(d),e=f.css(d,"display"),b.removeChild(cl)}ck[a]=e}return ck[a]}function cu(a,b){var c={};f.each(cq.concat.apply([],cq.slice(0,b)),function(){c[this]=a});return c}function ct(){cr=b}function cs(){setTimeout(ct,0);return cr=f.now()}function cj(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ci(){try{return new a.XMLHttpRequest}catch(b){}}function cc(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g<i;g++){if(g===1)for(h in a.converters)typeof h=="string"&&(e[h.toLowerCase()]=a.converters[h]);l=k,k=d[g];if(k==="*")k=l;else if(l!=="*"&&l!==k){m=l+" "+k,n=e[m]||e["* "+k];if(!n){p=b;for(o in e){j=o.split(" ");if(j[0]===l||j[0]==="*"){p=e[j[1]+" "+k];if(p){o=e[o],o===!0?n=p:p===!0&&(n=o);break}}}}!n&&!p&&f.error("No conversion from "+m.replace(" "," to ")),n!==!0&&(c=n?n(c):p(o(c)))}}return c}function cb(a,c,d){var e=a.contents,f=a.dataTypes,g=a.responseFields,h,i,j,k;for(i in g)i in d&&(c[g[i]]=d[i]);while(f[0]==="*")f.shift(),h===b&&(h=a.mimeType||c.getResponseHeader("content-type"));if(h)for(i in e)if(e[i]&&e[i].test(h)){f.unshift(i);break}if(f[0]in d)j=f[0];else{for(i in d){if(!f[0]||a.converters[i+" "+f[0]]){j=i;break}k||(k=i)}j=j||k}if(j){j!==f[0]&&f.unshift(j);return d[j]}}function ca(a,b,c,d){if(f.isArray(b))f.each(b,function(b,e){c||bE.test(a)?d(a,e):ca(a+"["+(typeof e=="object"||f.isArray(e)?b:"")+"]",e,c,d)});else if(!c&&b!=null&&typeof b=="object")for(var e in b)ca(a+"["+e+"]",b[e],c,d);else d(a,b)}function b_(a,c){var d,e,g=f.ajaxSettings.flatOptions||{};for(d in c)c[d]!==b&&((g[d]?a:e||(e={}))[d]=c[d]);e&&f.extend(!0,a,e)}function b$(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h=a[f],i=0,j=h?h.length:0,k=a===bT,l;for(;i<j&&(k||!l);i++)l=h[i](c,d,e),typeof l=="string"&&(!k||g[l]?l=b:(c.dataTypes.unshift(l),l=b$(a,c,d,e,l,g)));(k||!l)&&!g["*"]&&(l=b$(a,c,d,e,"*",g));return l}function bZ(a){return function(b,c){typeof b!="string"&&(c=b,b="*");if(f.isFunction(c)){var d=b.toLowerCase().split(bP),e=0,g=d.length,h,i,j;for(;e<g;e++)h=d[e],j=/^\+/.test(h),j&&(h=h.substr(1)||"*"),i=a[h]=a[h]||[],i[j?"unshift":"push"](c)}}}function bC(a,b,c){var d=b==="width"?a.offsetWidth:a.offsetHeight,e=b==="width"?bx:by,g=0,h=e.length;if(d>0){if(c!=="border")for(;g<h;g++)c||(d-=parseFloat(f.css(a,"padding"+e[g]))||0),c==="margin"?d+=parseFloat(f.css(a,c+e[g]))||0:d-=parseFloat(f.css(a,"border"+e[g]+"Width"))||0;return d+"px"}d=bz(a,b,b);if(d<0||d==null)d=a.style[b]||0;d=parseFloat(d)||0;if(c)for(;g<h;g++)d+=parseFloat(f.css(a,"padding"+e[g]))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+e[g]+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+e[g]))||0);return d+"px"}function bp(a,b){b.src?f.ajax({url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(bf,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)}function bo(a){var b=c.createElement("div");bh.appendChild(b),b.innerHTML=a.outerHTML;return b.firstChild}function bn(a){var b=(a.nodeName||"").toLowerCase();b==="input"?bm(a):b!=="script"&&typeof a.getElementsByTagName!="undefined"&&f.grep(a.getElementsByTagName("input"),bm)}function bm(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bl(a){return typeof a.getElementsByTagName!="undefined"?a.getElementsByTagName("*"):typeof a.querySelectorAll!="undefined"?a.querySelectorAll("*"):[]}function bk(a,b){var c;if(b.nodeType===1){b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase();if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(f.expando)}}function bj(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c,d,e,g=f._data(a),h=f._data(b,g),i=g.events;if(i){delete h.handle,h.events={};for(c in i)for(d=0,e=i[c].length;d<e;d++)f.event.add(b,c+(i[c][d].namespace?".":"")+i[c][d].namespace,i[c][d],i[c][d].data)}h.data&&(h.data=f.extend({},h.data))}}function bi(a,b){return f.nodeName(a,"table")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function U(a){var b=V.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}function T(a,b,c){b=b||0;if(f.isFunction(b))return f.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return f.grep(a,function(a,d){return a===b===c});if(typeof b=="string"){var d=f.grep(a,function(a){return a.nodeType===1});if(O.test(b))return f.filter(b,d,!c);b=f.filter(b,d)}return f.grep(a,function(a,d){return f.inArray(a,b)>=0===c})}function S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?parseFloat(d):j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c<d;c++)b[a[c]]=!0;return b}var c=a.document,d=a.navigator,e=a.location,f=function(){function J(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(J,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+"").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7.1",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+a;return a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j<k;j++)if((a=arguments[j])!=null)for(c in a){d=i[c],f=a[c];if(i===f)continue;l&&f&&(e.isPlainObject(f)||(g=e.isArray(f)))?(g?(g=!1,h=d&&e.isArray(d)?d:[]):h=d&&e.isPlainObject(d)?d:{},i[c]=e.extend(l,h,f)):f!==b&&(i[c]=f)}return i},e.extend({noConflict:function(b){a.$===e&&(a.$=g),b&&a.jQuery===e&&(a.jQuery=f);return e},isReady:!1,readyWait:1,holdReady:function(a){a?e.readyWait++:e.ready(!0)},ready:function(a){if(a===!0&&!--e.readyWait||a!==!0&&!e.isReady){if(!c.body)return setTimeout(e.ready,1);e.isReady=!0;if(a!==!0&&--e.readyWait>0)return;A.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").off("ready")}},bindReady:function(){if(!A){A=e.Callbacks("once memory");if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw new Error(a)},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,"ms-").replace(v,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g<h;)if(c.apply(a[g++],d)===!1)break}else if(i){for(f in a)if(c.call(a[f],f,a[f])===!1)break}else for(;g<h;)if(c.call(a[g],g,a[g++])===!1)break;return a},trim:G?function(a){return a==null?"":G.call(a)}:function(a){return a==null?"":(a+"").replace(k,"").replace(l,"")},makeArray:function(a,b){var c=b||[];if(a!=null){var d=e.type(a);a.length==null||d==="string"||d==="function"||d==="regexp"||e.isWindow(a)?E.call(c,a):e.merge(c,a)}return c},inArray:function(a,b,c){var d;if(b){if(H)return H.call(b,a,c);d=b.length,c=c?c<0?Math.max(0,d+c):c:0;for(;c<d;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,c){var d=a.length,e=0;if(typeof c.length=="number")for(var f=c.length;e<f;e++)a[d++]=c[e];else while(c[e]!==b)a[d++]=c[e++];a.length=d;return a},grep:function(a,b,c){var d=[],e;c=!!c;for(var f=0,g=a.length;f<g;f++)e=!!b(a[f],f),c!==e&&d.push(a[f]);return d},map:function(a,c,d){var f,g,h=[],i=0,j=a.length,k=a instanceof e||j!==b&&typeof j=="number"&&(j>0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i<j;i++)f=c(a[i],i,d),f!=null&&(h[h.length]=f);else for(g in a)f=c(a[g],g,d),f!=null&&(h[h.length]=f);return h.concat.apply([],h)},guid:1,proxy:function(a,c){if(typeof c=="string"){var d=a[c];c=a,a=d}if(!e.isFunction(a))return b;var f=F.call(arguments,2),g=function(){return a.apply(c,f.concat(F.call(arguments)))};g.guid=a.guid=a.guid||g.guid||e.guid++;return g},access:function(a,c,d,f,g,h){var i=a.length;if(typeof c=="object"){for(var j in c)e.access(a,j,c[j],f,g,d);return a}if(d!==b){f=!h&&f&&e.isFunction(d);for(var k=0;k<i;k++)g(a[k],c,f?d.call(a[k],k,g(a[k],c)):d,h);return a}return i?g(a[0],c):b},now:function(){return(new Date).getTime()},uaMatch:function(a){a=a.toLowerCase();var b=r.exec(a)||s.exec(a)||t.exec(a)||a.indexOf("compatible")<0&&u.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},sub:function(){function a(b,c){return new a.fn.init(b,c)}e.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.sub=this.sub,a.fn.init=function(d,f){f&&f instanceof e&&!(f instanceof a)&&(f=a(f));return e.fn.init.call(this,d,f,b)},a.fn.init.prototype=a.fn;var b=a(c);return a},browser:{}}),e.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(a,b){I["[object "+b+"]"]=b.toLowerCase()}),z=e.uaMatch(y),z.browser&&(e.browser[z.browser]=!0,e.browser.version=z.version),e.browser.webkit&&(e.browser.safari=!0),j.test(" ")&&(k=/^[\s\xA0]+/,l=/[\s\xA0]+$/),h=e(c),c.addEventListener?B=function(){c.removeEventListener("DOMContentLoaded",B,!1),e.ready()}:c.attachEvent&&(B=function(){c.readyState==="complete"&&(c.detachEvent("onreadystatechange",B),e.ready())});return e}(),g={};f.Callbacks=function(a){a=a?g[a]||h(a):{};var c=[],d=[],e,i,j,k,l,m=function(b){var d,e,g,h,i;for(d=0,e=b.length;d<e;d++)g=b[d],h=f.type(g),h==="array"?m(g):h==="function"&&(!a.unique||!o.has(g))&&c.push(g)},n=function(b,f){f=f||[],e=!a.memory||[b,f],i=!0,l=j||0,j=0,k=c.length;for(;c&&l<k;l++)if(c[l].apply(b,f)===!1&&a.stopOnFalse){e=!0;break}i=!1,c&&(a.once?e===!0?o.disable():c=[]:d&&d.length&&(e=d.shift(),o.fireWith(e[0],e[1])))},o={add:function(){if(c){var a=c.length;m(arguments),i?k=c.length:e&&e!==!0&&(j=a,n(e[0],e[1]))}return this},remove:function(){if(c){var b=arguments,d=0,e=b.length;for(;d<e;d++)for(var f=0;f<c.length;f++)if(b[d]===c[f]){i&&f<=k&&(k--,f<=l&&l--),c.splice(f--,1);if(a.unique)break}}return this},has:function(a){if(c){var b=0,d=c.length;for(;b<d;b++)if(a===c[b])return!0}return!1},empty:function(){c=[];return this},disable:function(){c=d=e=b;return this},disabled:function(){return!c},lock:function(){d=b,(!e||e===!0)&&o.disable();return this},locked:function(){return!d},fireWith:function(b,c){d&&(i?a.once||d.push([b,c]):(!a.once||!e)&&n(b,c));return this},fire:function(){o.fireWith(this,arguments);return this},fired:function(){return!!e}};return o};var i=[].slice;f.extend({Deferred:function(a){var b=f.Callbacks("once memory"),c=f.Callbacks("once memory"),d=f.Callbacks("memory"),e="pending",g={resolve:b,reject:c,notify:d},h={done:b.add,fail:c.add,progress:d.add,state:function(){return e},isResolved:b.fired,isRejected:c.fired,then:function(a,b,c){i.done(a).fail(b).progress(c);return this},always:function(){i.done.apply(i,arguments).fail.apply(i,arguments);return this},pipe:function(a,b,c){return f.Deferred(function(d){f.each({done:[a,"resolve"],fail:[b,"reject"],progress:[c,"notify"]},function(a,b){var c=b[0],e=b[1],g;f.isFunction(c)?i[a](function()
-{g=c.apply(this,arguments),g&&f.isFunction(g.promise)?g.promise().then(d.resolve,d.reject,d.notify):d[e+"With"](this===i?d:this,[g])}):i[a](d[e])})}).promise()},promise:function(a){if(a==null)a=h;else for(var b in h)a[b]=h[b];return a}},i=h.promise({}),j;for(j in g)i[j]=g[j].fire,i[j+"With"]=g[j].fireWith;i.done(function(){e="resolved"},c.disable,d.lock).fail(function(){e="rejected"},b.disable,d.lock),a&&a.call(i,i);return i},when:function(a){function m(a){return function(b){e[a]=arguments.length>1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c<d;c++)b[c]&&b[c].promise&&f.isFunction(b[c].promise)?b[c].promise().then(l(c),j.reject,m(c)):--g;g||j.resolveWith(j,b)}else j!==a&&j.resolveWith(j,d?[a]:[]);return k}}),f.support=function(){var b,d,e,g,h,i,j,k,l,m,n,o,p,q=c.createElement("div"),r=c.documentElement;q.setAttribute("className","t"),q.innerHTML="   <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>",d=q.getElementsByTagName("*"),e=q.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=q.getElementsByTagName("input")[0],b={leadingWhitespace:q.firstChild.nodeType===3,tbody:!q.getElementsByTagName("tbody").length,htmlSerialize:!!q.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:q.className!=="t",enctype:!!c.createElement("form").enctype,html5Clone:c.createElement("nav").cloneNode(!0).outerHTML!=="<:nav></:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete q.test}catch(s){b.deleteExpando=!1}!q.addEventListener&&q.attachEvent&&q.fireEvent&&(q.attachEvent("onclick",function(){b.noCloneEvent=!1}),q.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),b.radioValue=i.value==="t",i.setAttribute("checked","checked"),q.appendChild(i),k=c.createDocumentFragment(),k.appendChild(q.lastChild),b.checkClone=k.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,k.removeChild(i),k.appendChild(q),q.innerHTML="",a.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",q.style.width="2px",q.appendChild(j),b.reliableMarginRight=(parseInt((a.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0);if(q.attachEvent)for(o in{submit:1,change:1,focusin:1})n="on"+o,p=n in q,p||(q.setAttribute(n,"return;"),p=typeof q[n]=="function"),b[o+"Bubbles"]=p;k.removeChild(q),k=g=h=j=q=i=null,f(function(){var a,d,e,g,h,i,j,k,m,n,o,r=c.getElementsByTagName("body")[0];!r||(j=1,k="position:absolute;top:0;left:0;width:1px;height:1px;margin:0;",m="visibility:hidden;border:0;",n="style='"+k+"border:5px solid #000;padding:0;'",o="<div "+n+"><div></div></div>"+"<table "+n+" cellpadding='0' cellspacing='0'>"+"<tr><td></td></tr></table>",a=c.createElement("div"),a.style.cssText=m+"width:0;height:0;position:static;top:0;margin-top:"+j+"px",r.insertBefore(a,r.firstChild),q=c.createElement("div"),a.appendChild(q),q.innerHTML="<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>",l=q.getElementsByTagName("td"),p=l[0].offsetHeight===0,l[0].style.display="",l[1].style.display="none",b.reliableHiddenOffsets=p&&l[0].offsetHeight===0,q.innerHTML="",q.style.width=q.style.paddingLeft="1px",f.boxModel=b.boxModel=q.offsetWidth===2,typeof q.style.zoom!="undefined"&&(q.style.display="inline",q.style.zoom=1,b.inlineBlockNeedsLayout=q.offsetWidth===2,q.style.display="",q.innerHTML="<div style='width:4px;'></div>",b.shrinkWrapBlocks=q.offsetWidth!==2),q.style.cssText=k+m,q.innerHTML=o,d=q.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,i={doesNotAddBorder:e.offsetTop!==5,doesAddBorderForTableAndCells:h.offsetTop===5},e.style.position="fixed",e.style.top="20px",i.fixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",i.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,i.doesNotIncludeMarginInBodyOffset=r.offsetTop!==j,r.removeChild(a),q=a=null,f.extend(b,i))});return b}();var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,g=b.length;e<g;e++)delete d[b[e]];if(!(c?m:f.isEmptyObject)(d))return}}if(!c){delete j[k].data;if(!m(j[k]))return}f.support.deleteExpando||!j.setInterval?delete j[k]:j[k]=null,i&&(f.support.deleteExpando?delete a[h]:a.removeAttribute?a.removeAttribute(h):a[h]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),f.fn.extend({data:function(a,c){var d,e,g,h=null;if(typeof a=="undefined"){if(this.length){h=f.data(this[0]);if(this[0].nodeType===1&&!f._data(this[0],"parsedAttrs")){e=this[0].attributes;for(var i=0,j=e.length;i<j;i++)g=e[i].name,g.indexOf("data-")===0&&(g=f.camelCase(g.substring(5)),l(this[0],g,h[g]));f._data(this[0],"parsedAttrs",!0)}}return h}if(typeof a=="object")return this.each(function(){f.data(this,a)});d=a.split("."),d[1]=d[1]?"."+d[1]:"";if(c===b){h=this.triggerHandler("getData"+d[1]+"!",[d[0]]),h===b&&this.length&&(h=f.data(this[0],a),h=l(this[0],a,h));return h===b&&d[1]?this.data(d[0]):h}return this.each(function(){var b=f(this),e=[d[0],c];b.triggerHandler("setData"+d[1]+"!",e),f.data(this,a,c),b.triggerHandler("changeData"+d[1]+"!",e)})},removeData:function(a){return this.each(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,b){a&&(b=(b||"fx")+"mark",f._data(a,b,(f._data(a,b)||0)+1))},_unmark:function(a,b,c){a!==!0&&(c=b,b=a,a=!1);if(b){c=c||"fx";var d=c+"mark",e=a?0:(f._data(b,d)||1)-1;e?f._data(b,d,e):(f.removeData(b,d,!0),n(b,c,"mark"))}},queue:function(a,b,c){var d;if(a){b=(b||"fx")+"queue",d=f._data(a,b),c&&(!d||f.isArray(c)?d=f._data(a,b,f.makeArray(c)):d.push(c));return d||[]}},dequeue:function(a,b){b=b||"fx";var c=f.queue(a,b),d=c.shift(),e={};d==="inprogress"&&(d=c.shift()),d&&(b==="fx"&&c.unshift("inprogress"),f._data(a,b+".run",e),d.call(a,function(){f.dequeue(a,b)},e)),c.length||(f.removeData(a,b+"queue "+b+".run",!0),n(a,b,"queue"))}}),f.fn.extend({queue:function(a,c){typeof a!="string"&&(c=a,a="fx");if(c===b)return f.queue(this[0],a);return this.each(function(){var b=f.queue(this,a,c);a==="fx"&&b[0]!=="inprogress"&&f.dequeue(this,a)})},dequeue:function(a){return this.each(function(){f.dequeue(this,a)})},delay:function(a,b){a=f.fx?f.fx.speeds[a]||a:a,b=b||"fx";return this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,c){function m(){--h||d.resolveWith(e,[e])}typeof a!="string"&&(c=a,a=b),a=a||"fx";var d=f.Deferred(),e=this,g=e.length,h=1,i=a+"defer",j=a+"queue",k=a+"mark",l;while(g--)if(l=f.data(e[g],i,b,!0)||(f.data(e[g],j,b,!0)||f.data(e[g],k,b,!0))&&f.data(e[g],i,f.Callbacks("once memory"),!0))h++,l.add(m);m();return d.promise()}});var o=/[\n\t\r]/g,p=/\s+/,q=/\r/g,r=/^(?:button|input)$/i,s=/^(?:button|input|object|select|textarea)$/i,t=/^a(?:rea)?$/i,u=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,v=f.support.getSetAttribute,w,x,y;f.fn.extend({attr:function(a,b){return f.access(this,a,b,!0,f.attr)},removeAttr:function(a){return this.each(function(){f.removeAttr(this,a)})},prop:function(a,b){return f.access(this,a,b,!0,f.prop)},removeProp:function(a){a=f.propFix[a]||a;return this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,g,h,i;if(f.isFunction(a))return this.each(function(b){f(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(p);for(c=0,d=this.length;c<d;c++){e=this[c];if(e.nodeType===1)if(!e.className&&b.length===1)e.className=a;else{g=" "+e.className+" ";for(h=0,i=b.length;h<i;h++)~g.indexOf(" "+b[h]+" ")||(g+=b[h]+" ");e.className=f.trim(g)}}}return this},removeClass:function(a){var c,d,e,g,h,i,j;if(f.isFunction(a))return this.each(function(b){f(this).removeClass(a.call(this,b,this.className))});if(a&&typeof a=="string"||a===b){c=(a||"").split(p);for(d=0,e=this.length;d<e;d++){g=this[d];if(g.nodeType===1&&g.className)if(a){h=(" "+g.className+" ").replace(o," ");for(i=0,j=c.length;i<j;i++)h=h.replace(" "+c[i]+" "," ");g.className=f.trim(h)}else g.className=""}}return this},toggleClass:function(a,b){var c=typeof a,d=typeof b=="boolean";if(f.isFunction(a))return this.each(function(c){f(this).toggleClass(a.call(this,c,this.className,b),b)});return this.each(function(){if(c==="string"){var e,g=0,h=f(this),i=b,j=a.split(p);while(e=j[g++])i=d?i:!h.hasClass(e),h[i?"addClass":"removeClass"](e)}else if(c==="undefined"||c==="boolean")this.className&&f._data(this,"__className__",this.className),this.className=this.className||a===!1?"":f._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ",c=0,d=this.length;for(;c<d;c++)if(this[c].nodeType===1&&(" "+this[c].className+" ").replace(o," ").indexOf(b)>-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}if(g){c=f.valHooks[g.nodeName.toLowerCase()]||f.valHooks[g.type];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}}}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c<d;c++){e=i[c];if(e.selected&&(f.support.optDisabled?!e.disabled:e.getAttribute("disabled")===null)&&(!e.parentNode.disabled||!f.nodeName(e.parentNode,"optgroup"))){b=f(e).val();if(j)return b;h.push(b)}}if(j&&!h.length&&i.length)return f(i[g]).val();return h},set:function(a,b){var c=f.makeArray(b);f(a).find("option").each(function(){this.selected=f.inArray(f(this).val(),c)>=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a)[c](d);if(typeof a.getAttribute=="undefined")return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;h<g;h++)e=d[h],e&&(c=f.propFix[e]||e,f.attr(a,e,""),a.removeAttribute(v?e:c),u.test(e)&&c in a&&(a[c]=!1))}},attrHooks:{type:{set:function(a,b){if(r.test(a.nodeName)&&a.parentNode)f.error("type property can't be changed");else if(!f.support.radioValue&&b==="radio"&&f.nodeName(a,"input")){var c=a.value;a.setAttribute("type",b),c&&(a.value=c);return b}}},value:{get:function(a,b){if(w&&f.nodeName(a,"button"))return w.get(a,b);return b in a?a.value:null},set:function(a,b,c){if(w&&f.nodeName(a,"button"))return w.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e,g,h,i=a.nodeType;if(!!a&&i!==3&&i!==8&&i!==2){h=i!==1||!f.isXMLDoc(a),h&&(c=f.propFix[c]||c,g=f.propHooks[c]);return d!==b?g&&"set"in g&&(e=g.set(a,d,c))!==b?e:a[c]=d:g&&"get"in g&&(e=g.get(a,c))!==null?e:a[c]}},propHooks:{tabIndex:{get:function(a){var c=a.getAttributeNode("tabindex");return c&&c.specified?parseInt(c.value,10):s.test(a.nodeName)||t.test(a.nodeName)&&a.href?0:b}}}}),f.attrHooks.tabindex=f.propHooks.tabIndex,x={get:function(a,c){var d,e=f.prop(a,c);return e===!0||typeof e!="boolean"&&(d=a.getAttributeNode(c))&&d.nodeValue!==!1?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase()));return c}},v||(y={name:!0,id:!0},w=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&(y[c]?d.nodeValue!=="":d.specified)?d.nodeValue:b},set:function(a,b,d){var e=a.getAttributeNode(d);e||(e=c.createAttribute(d),a.setAttributeNode(e));return e.nodeValue=b+""}},f.attrHooks.tabindex.set=w.set,f.each(["width","height"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===""){a.setAttribute(b,"auto");return c}}})}),f.attrHooks.contenteditable={get:w.get,set:function(a,b,c){b===""&&(b="false"),w.set(a,b,c)}}),f.support.hrefNormalized||f.each(["href","src","width","height"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex);return null}})),f.support.enctype||(f.propFix.enctype="encoding"),f.support.checkOn||f.each(["radio","checkbox"],function(){f.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),f.each(["radio","checkbox"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\.]*)?(?:\.(.+))?$/,B=/\bhover(\.\S+)?\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,G=function(a){var b=F.exec(a);b&&(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c["class"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,"mouseenter$1 mouseleave$1")};
+/*!
+ * jQuery JavaScript Library v1.7.1
+ * http://jquery.com/
+ *
+ * Copyright 2011, John Resig
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ * Copyright 2011, The Dojo Foundation
+ * Released under the MIT, BSD, and GPL Licenses.
+ *
+ * Date: Mon Nov 21 21:11:03 2011 -0500
+ */
+(function(bb,L){var av=bb.document,bu=bb.navigator,bl=bb.location;var b=(function(){var bF=function(b0,b1){return new bF.fn.init(b0,b1,bD)},bU=bb.jQuery,bH=bb.$,bD,bY=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,bM=/\S/,bI=/^\s+/,bE=/\s+$/,bA=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,bN=/^[\],:{}\s]*$/,bW=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,bP=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,bJ=/(?:^|:|,)(?:\s*\[)+/g,by=/(webkit)[ \/]([\w.]+)/,bR=/(opera)(?:.*version)?[ \/]([\w.]+)/,bQ=/(msie) ([\w.]+)/,bS=/(mozilla)(?:.*? rv:([\w.]+))?/,bB=/-([a-z]|[0-9])/ig,bZ=/^-ms-/,bT=function(b0,b1){return(b1+"").toUpperCase()},bX=bu.userAgent,bV,bC,e,bL=Object.prototype.toString,bG=Object.prototype.hasOwnProperty,bz=Array.prototype.push,bK=Array.prototype.slice,bO=String.prototype.trim,bv=Array.prototype.indexOf,bx={};bF.fn=bF.prototype={constructor:bF,init:function(b0,b4,b3){var b2,b5,b1,b6;if(!b0){return this}if(b0.nodeType){this.context=this[0]=b0;this.length=1;return this}if(b0==="body"&&!b4&&av.body){this.context=av;this[0]=av.body;this.selector=b0;this.length=1;return this}if(typeof b0==="string"){if(b0.charAt(0)==="<"&&b0.charAt(b0.length-1)===">"&&b0.length>=3){b2=[null,b0,null]}else{b2=bY.exec(b0)}if(b2&&(b2[1]||!b4)){if(b2[1]){b4=b4 instanceof bF?b4[0]:b4;b6=(b4?b4.ownerDocument||b4:av);b1=bA.exec(b0);if(b1){if(bF.isPlainObject(b4)){b0=[av.createElement(b1[1])];bF.fn.attr.call(b0,b4,true)}else{b0=[b6.createElement(b1[1])]}}else{b1=bF.buildFragment([b2[1]],[b6]);b0=(b1.cacheable?bF.clone(b1.fragment):b1.fragment).childNodes}return bF.merge(this,b0)}else{b5=av.getElementById(b2[2]);if(b5&&b5.parentNode){if(b5.id!==b2[2]){return b3.find(b0)}this.length=1;this[0]=b5}this.context=av;this.selector=b0;return this}}else{if(!b4||b4.jquery){return(b4||b3).find(b0)}else{return this.constructor(b4).find(b0)}}}else{if(bF.isFunction(b0)){return b3.ready(b0)}}if(b0.selector!==L){this.selector=b0.selector;this.context=b0.context}return bF.makeArray(b0,this)},selector:"",jquery:"1.7.1",length:0,size:function(){return this.length},toArray:function(){return bK.call(this,0)},get:function(b0){return b0==null?this.toArray():(b0<0?this[this.length+b0]:this[b0])},pushStack:function(b1,b3,b0){var b2=this.constructor();if(bF.isArray(b1)){bz.apply(b2,b1)}else{bF.merge(b2,b1)}b2.prevObject=this;b2.context=this.context;if(b3==="find"){b2.selector=this.selector+(this.selector?" ":"")+b0}else{if(b3){b2.selector=this.selector+"."+b3+"("+b0+")"}}return b2},each:function(b1,b0){return bF.each(this,b1,b0)},ready:function(b0){bF.bindReady();bC.add(b0);return this},eq:function(b0){b0=+b0;return b0===-1?this.slice(b0):this.slice(b0,b0+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(bK.apply(this,arguments),"slice",bK.call(arguments).join(","))},map:function(b0){return this.pushStack(bF.map(this,function(b2,b1){return b0.call(b2,b1,b2)}))},end:function(){return this.prevObject||this.constructor(null)},push:bz,sort:[].sort,splice:[].splice};bF.fn.init.prototype=bF.fn;bF.extend=bF.fn.extend=function(){var b9,b2,b0,b1,b6,b7,b5=arguments[0]||{},b4=1,b3=arguments.length,b8=false;if(typeof b5==="boolean"){b8=b5;b5=arguments[1]||{};b4=2}if(typeof b5!=="object"&&!bF.isFunction(b5)){b5={}}if(b3===b4){b5=this;--b4}for(;b4<b3;b4++){if((b9=arguments[b4])!=null){for(b2 in b9){b0=b5[b2];b1=b9[b2];if(b5===b1){continue}if(b8&&b1&&(bF.isPlainObject(b1)||(b6=bF.isArray(b1)))){if(b6){b6=false;b7=b0&&bF.isArray(b0)?b0:[]}else{b7=b0&&bF.isPlainObject(b0)?b0:{}}b5[b2]=bF.extend(b8,b7,b1)}else{if(b1!==L){b5[b2]=b1}}}}}return b5};bF.extend({noConflict:function(b0){if(bb.$===bF){bb.$=bH}if(b0&&bb.jQuery===bF){bb.jQuery=bU}return bF},isReady:false,readyWait:1,holdReady:function(b0){if(b0){bF.readyWait++}else{bF.ready(true)}},ready:function(b0){if((b0===true&&!--bF.readyWait)||(b0!==true&&!bF.isReady)){if(!av.body){return setTimeout(bF.ready,1)}bF.isReady=true;if(b0!==true&&--bF.readyWait>0){return}bC.fireWith(av,[bF]);if(bF.fn.trigger){bF(av).trigger("ready").off("ready")}}},bindReady:function(){if(bC){return}bC=bF.Callbacks("once memory");if(av.readyState==="complete"){return setTimeout(bF.ready,1)}if(av.addEventListener){av.addEventListener("DOMContentLoaded",e,false);bb.addEventListener("load",bF.ready,false)}else{if(av.attachEvent){av.attachEvent("onreadystatechange",e);bb.attachEvent("onload",bF.ready);var b0=false;try{b0=bb.frameElement==null}catch(b1){}if(av.documentElement.doScroll&&b0){bw()}}}},isFunction:function(b0){return bF.type(b0)==="function"},isArray:Array.isArray||function(b0){return bF.type(b0)==="array"},isWindow:function(b0){return b0&&typeof b0==="object"&&"setInterval" in b0},isNumeric:function(b0){return !isNaN(parseFloat(b0))&&isFinite(b0)},type:function(b0){return b0==null?String(b0):bx[bL.call(b0)]||"object"},isPlainObject:function(b2){if(!b2||bF.type(b2)!=="object"||b2.nodeType||bF.isWindow(b2)){return false}try{if(b2.constructor&&!bG.call(b2,"constructor")&&!bG.call(b2.constructor.prototype,"isPrototypeOf")){return false}}catch(b1){return false}var b0;for(b0 in b2){}return b0===L||bG.call(b2,b0)},isEmptyObject:function(b1){for(var b0 in b1){return false}return true},error:function(b0){throw new Error(b0)},parseJSON:function(b0){if(typeof b0!=="string"||!b0){return null}b0=bF.trim(b0);if(bb.JSON&&bb.JSON.parse){return bb.JSON.parse(b0)}if(bN.test(b0.replace(bW,"@").replace(bP,"]").replace(bJ,""))){return(new Function("return "+b0))()}bF.error("Invalid JSON: "+b0)},parseXML:function(b2){var b0,b1;try{if(bb.DOMParser){b1=new DOMParser();b0=b1.parseFromString(b2,"text/xml")}else{b0=new ActiveXObject("Microsoft.XMLDOM");b0.async="false";b0.loadXML(b2)}}catch(b3){b0=L}if(!b0||!b0.documentElement||b0.getElementsByTagName("parsererror").length){bF.error("Invalid XML: "+b2)}return b0},noop:function(){},globalEval:function(b0){if(b0&&bM.test(b0)){(bb.execScript||function(b1){bb["eval"].call(bb,b1)})(b0)}},camelCase:function(b0){return b0.replace(bZ,"ms-").replace(bB,bT)},nodeName:function(b1,b0){return b1.nodeName&&b1.nodeName.toUpperCase()===b0.toUpperCase()},each:function(b3,b6,b2){var b1,b4=0,b5=b3.length,b0=b5===L||bF.isFunction(b3);if(b2){if(b0){for(b1 in b3){if(b6.apply(b3[b1],b2)===false){break}}}else{for(;b4<b5;){if(b6.apply(b3[b4++],b2)===false){break}}}}else{if(b0){for(b1 in b3){if(b6.call(b3[b1],b1,b3[b1])===false){break}}}else{for(;b4<b5;){if(b6.call(b3[b4],b4,b3[b4++])===false){break}}}}return b3},trim:bO?function(b0){return b0==null?"":bO.call(b0)}:function(b0){return b0==null?"":b0.toString().replace(bI,"").replace(bE,"")},makeArray:function(b3,b1){var b0=b1||[];if(b3!=null){var b2=bF.type(b3);if(b3.length==null||b2==="string"||b2==="function"||b2==="regexp"||bF.isWindow(b3)){bz.call(b0,b3)}else{bF.merge(b0,b3)}}return b0},inArray:function(b2,b3,b1){var b0;if(b3){if(bv){return bv.call(b3,b2,b1)}b0=b3.length;b1=b1?b1<0?Math.max(0,b0+b1):b1:0;for(;b1<b0;b1++){if(b1 in b3&&b3[b1]===b2){return b1}}}return -1},merge:function(b4,b2){var b3=b4.length,b1=0;if(typeof b2.length==="number"){for(var b0=b2.length;b1<b0;b1++){b4[b3++]=b2[b1]}}else{while(b2[b1]!==L){b4[b3++]=b2[b1++]}}b4.length=b3;return b4},grep:function(b1,b6,b0){var b2=[],b5;b0=!!b0;for(var b3=0,b4=b1.length;b3<b4;b3++){b5=!!b6(b1[b3],b3);if(b0!==b5){b2.push(b1[b3])}}return b2},map:function(b0,b7,b8){var b5,b6,b4=[],b2=0,b1=b0.length,b3=b0 instanceof bF||b1!==L&&typeof b1==="number"&&((b1>0&&b0[0]&&b0[b1-1])||b1===0||bF.isArray(b0));if(b3){for(;b2<b1;b2++){b5=b7(b0[b2],b2,b8);if(b5!=null){b4[b4.length]=b5}}}else{for(b6 in b0){b5=b7(b0[b6],b6,b8);if(b5!=null){b4[b4.length]=b5}}}return b4.concat.apply([],b4)},guid:1,proxy:function(b4,b3){if(typeof b3==="string"){var b2=b4[b3];b3=b4;b4=b2}if(!bF.isFunction(b4)){return L}var b0=bK.call(arguments,2),b1=function(){return b4.apply(b3,b0.concat(bK.call(arguments)))};b1.guid=b4.guid=b4.guid||b1.guid||bF.guid++;return b1},access:function(b0,b8,b6,b2,b5,b7){var b1=b0.length;if(typeof b8==="object"){for(var b3 in b8){bF.access(b0,b3,b8[b3],b2,b5,b6)}return b0}if(b6!==L){b2=!b7&&b2&&bF.isFunction(b6);for(var b4=0;b4<b1;b4++){b5(b0[b4],b8,b2?b6.call(b0[b4],b4,b5(b0[b4],b8)):b6,b7)}return b0}return b1?b5(b0[0],b8):L},now:function(){return(new Date()).getTime()},uaMatch:function(b1){b1=b1.toLowerCase();var b0=by.exec(b1)||bR.exec(b1)||bQ.exec(b1)||b1.indexOf("compatible")<0&&bS.exec(b1)||[];return{browser:b0[1]||"",version:b0[2]||"0"}},sub:function(){function b0(b3,b4){return new b0.fn.init(b3,b4)}bF.extend(true,b0,this);b0.superclass=this;b0.fn=b0.prototype=this();b0.fn.constructor=b0;b0.sub=this.sub;b0.fn.init=function b2(b3,b4){if(b4&&b4 instanceof bF&&!(b4 instanceof b0)){b4=b0(b4)}return bF.fn.init.call(this,b3,b4,b1)};b0.fn.init.prototype=b0.fn;var b1=b0(av);return b0},browser:{}});bF.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(b1,b0){bx["[object "+b0+"]"]=b0.toLowerCase()});bV=bF.uaMatch(bX);if(bV.browser){bF.browser[bV.browser]=true;bF.browser.version=bV.version}if(bF.browser.webkit){bF.browser.safari=true}if(bM.test("\xA0")){bI=/^[\s\xA0]+/;bE=/[\s\xA0]+$/}bD=bF(av);if(av.addEventListener){e=function(){av.removeEventListener("DOMContentLoaded",e,false);bF.ready()}}else{if(av.attachEvent){e=function(){if(av.readyState==="complete"){av.detachEvent("onreadystatechange",e);bF.ready()}}}}function bw(){if(bF.isReady){return}try{av.documentElement.doScroll("left")}catch(b0){setTimeout(bw,1);return}bF.ready()}return bF})();var a2={};function X(e){var bv=a2[e]={},bw,bx;e=e.split(/\s+/);for(bw=0,bx=e.length;bw<bx;bw++){bv[e[bw]]=true}return bv}b.Callbacks=function(bw){bw=bw?(a2[bw]||X(bw)):{};var bB=[],bC=[],bx,by,bv,bz,bA,bE=function(bF){var bG,bJ,bI,bH,bK;for(bG=0,bJ=bF.length;bG<bJ;bG++){bI=bF[bG];bH=b.type(bI);if(bH==="array"){bE(bI)}else{if(bH==="function"){if(!bw.unique||!bD.has(bI)){bB.push(bI)}}}}},e=function(bG,bF){bF=bF||[];bx=!bw.memory||[bG,bF];by=true;bA=bv||0;bv=0;bz=bB.length;for(;bB&&bA<bz;bA++){if(bB[bA].apply(bG,bF)===false&&bw.stopOnFalse){bx=true;break}}by=false;if(bB){if(!bw.once){if(bC&&bC.length){bx=bC.shift();bD.fireWith(bx[0],bx[1])}}else{if(bx===true){bD.disable()}else{bB=[]}}}},bD={add:function(){if(bB){var bF=bB.length;bE(arguments);if(by){bz=bB.length}else{if(bx&&bx!==true){bv=bF;e(bx[0],bx[1])}}}return this},remove:function(){if(bB){var bF=arguments,bH=0,bI=bF.length;for(;bH<bI;bH++){for(var bG=0;bG<bB.length;bG++){if(bF[bH]===bB[bG]){if(by){if(bG<=bz){bz--;if(bG<=bA){bA--}}}bB.splice(bG--,1);if(bw.unique){break}}}}}return this},has:function(bG){if(bB){var bF=0,bH=bB.length;for(;bF<bH;bF++){if(bG===bB[bF]){return true}}}return false},empty:function(){bB=[];return this},disable:function(){bB=bC=bx=L;return this},disabled:function(){return !bB},lock:function(){bC=L;if(!bx||bx===true){bD.disable()}return this},locked:function(){return !bC},fireWith:function(bG,bF){if(bC){if(by){if(!bw.once){bC.push([bG,bF])}}else{if(!(bw.once&&bx)){e(bG,bF)}}}return this},fire:function(){bD.fireWith(this,arguments);return this},fired:function(){return !!bx}};return bD};var aJ=[].slice;b.extend({Deferred:function(by){var bx=b.Callbacks("once memory"),bw=b.Callbacks("once memory"),bv=b.Callbacks("memory"),e="pending",bA={resolve:bx,reject:bw,notify:bv},bC={done:bx.add,fail:bw.add,progress:bv.add,state:function(){return e},isResolved:bx.fired,isRejected:bw.fired,then:function(bE,bD,bF){bB.done(bE).fail(bD).progress(bF);return this},always:function(){bB.done.apply(bB,arguments).fail.apply(bB,arguments);return this},pipe:function(bF,bE,bD){return b.Deferred(function(bG){b.each({done:[bF,"resolve"],fail:[bE,"reject"],progress:[bD,"notify"]},function(bI,bL){var bH=bL[0],bK=bL[1],bJ;if(b.isFunction(bH)){bB[bI](function(){bJ=bH.apply(this,arguments);if(bJ&&b.isFunction(bJ.promise)){bJ.promise().then(bG.resolve,bG.reject,bG.notify)}else{bG[bK+"With"](this===bB?bG:this,[bJ])}})}else{bB[bI](bG[bK])}})}).promise()},promise:function(bE){if(bE==null){bE=bC}else{for(var bD in bC){bE[bD]=bC[bD]}}return bE}},bB=bC.promise({}),bz;for(bz in bA){bB[bz]=bA[bz].fire;bB[bz+"With"]=bA[bz].fireWith}bB.done(function(){e="resolved"},bw.disable,bv.lock).fail(function(){e="rejected"},bx.disable,bv.lock);if(by){by.call(bB,bB)}return bB},when:function(bA){var bx=aJ.call(arguments,0),bv=0,e=bx.length,bB=new Array(e),bw=e,by=e,bC=e<=1&&bA&&b.isFunction(bA.promise)?bA:b.Deferred(),bE=bC.promise();function bD(bF){return function(bG){bx[bF]=arguments.length>1?aJ.call(arguments,0):bG;if(!(--bw)){bC.resolveWith(bC,bx)}}}function bz(bF){return function(bG){bB[bF]=arguments.length>1?aJ.call(arguments,0):bG;bC.notifyWith(bE,bB)}}if(e>1){for(;bv<e;bv++){if(bx[bv]&&bx[bv].promise&&b.isFunction(bx[bv].promise)){bx[bv].promise().then(bD(bv),bC.reject,bz(bv))
+}else{--bw}}if(!bw){bC.resolveWith(bC,bx)}}else{if(bC!==bA){bC.resolveWith(bC,e?[bA]:[])}}return bE}});b.support=(function(){var bJ,bI,bF,bG,bx,bE,bA,bD,bz,bK,bB,by,bw,bv=av.createElement("div"),bH=av.documentElement;bv.setAttribute("className","t");bv.innerHTML="   <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>";bI=bv.getElementsByTagName("*");bF=bv.getElementsByTagName("a")[0];if(!bI||!bI.length||!bF){return{}}bG=av.createElement("select");bx=bG.appendChild(av.createElement("option"));bE=bv.getElementsByTagName("input")[0];bJ={leadingWhitespace:(bv.firstChild.nodeType===3),tbody:!bv.getElementsByTagName("tbody").length,htmlSerialize:!!bv.getElementsByTagName("link").length,style:/top/.test(bF.getAttribute("style")),hrefNormalized:(bF.getAttribute("href")==="/a"),opacity:/^0.55/.test(bF.style.opacity),cssFloat:!!bF.style.cssFloat,checkOn:(bE.value==="on"),optSelected:bx.selected,getSetAttribute:bv.className!=="t",enctype:!!av.createElement("form").enctype,html5Clone:av.createElement("nav").cloneNode(true).outerHTML!=="<:nav></:nav>",submitBubbles:true,changeBubbles:true,focusinBubbles:false,deleteExpando:true,noCloneEvent:true,inlineBlockNeedsLayout:false,shrinkWrapBlocks:false,reliableMarginRight:true};bE.checked=true;bJ.noCloneChecked=bE.cloneNode(true).checked;bG.disabled=true;bJ.optDisabled=!bx.disabled;try{delete bv.test}catch(bC){bJ.deleteExpando=false}if(!bv.addEventListener&&bv.attachEvent&&bv.fireEvent){bv.attachEvent("onclick",function(){bJ.noCloneEvent=false});bv.cloneNode(true).fireEvent("onclick")}bE=av.createElement("input");bE.value="t";bE.setAttribute("type","radio");bJ.radioValue=bE.value==="t";bE.setAttribute("checked","checked");bv.appendChild(bE);bD=av.createDocumentFragment();bD.appendChild(bv.lastChild);bJ.checkClone=bD.cloneNode(true).cloneNode(true).lastChild.checked;bJ.appendChecked=bE.checked;bD.removeChild(bE);bD.appendChild(bv);bv.innerHTML="";if(bb.getComputedStyle){bA=av.createElement("div");bA.style.width="0";bA.style.marginRight="0";bv.style.width="2px";bv.appendChild(bA);bJ.reliableMarginRight=(parseInt((bb.getComputedStyle(bA,null)||{marginRight:0}).marginRight,10)||0)===0}if(bv.attachEvent){for(by in {submit:1,change:1,focusin:1}){bB="on"+by;bw=(bB in bv);if(!bw){bv.setAttribute(bB,"return;");bw=(typeof bv[bB]==="function")}bJ[by+"Bubbles"]=bw}}bD.removeChild(bv);bD=bG=bx=bA=bv=bE=null;b(function(){var bM,bU,bV,bT,bN,bO,bL,bS,bR,e,bP,bQ=av.getElementsByTagName("body")[0];if(!bQ){return}bL=1;bS="position:absolute;top:0;left:0;width:1px;height:1px;margin:0;";bR="visibility:hidden;border:0;";e="style='"+bS+"border:5px solid #000;padding:0;'";bP="<div "+e+"><div></div></div><table "+e+" cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";bM=av.createElement("div");bM.style.cssText=bR+"width:0;height:0;position:static;top:0;margin-top:"+bL+"px";bQ.insertBefore(bM,bQ.firstChild);bv=av.createElement("div");bM.appendChild(bv);bv.innerHTML="<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>";bz=bv.getElementsByTagName("td");bw=(bz[0].offsetHeight===0);bz[0].style.display="";bz[1].style.display="none";bJ.reliableHiddenOffsets=bw&&(bz[0].offsetHeight===0);bv.innerHTML="";bv.style.width=bv.style.paddingLeft="1px";b.boxModel=bJ.boxModel=bv.offsetWidth===2;if(typeof bv.style.zoom!=="undefined"){bv.style.display="inline";bv.style.zoom=1;bJ.inlineBlockNeedsLayout=(bv.offsetWidth===2);bv.style.display="";bv.innerHTML="<div style='width:4px;'></div>";bJ.shrinkWrapBlocks=(bv.offsetWidth!==2)}bv.style.cssText=bS+bR;bv.innerHTML=bP;bU=bv.firstChild;bV=bU.firstChild;bN=bU.nextSibling.firstChild.firstChild;bO={doesNotAddBorder:(bV.offsetTop!==5),doesAddBorderForTableAndCells:(bN.offsetTop===5)};bV.style.position="fixed";bV.style.top="20px";bO.fixedPosition=(bV.offsetTop===20||bV.offsetTop===15);bV.style.position=bV.style.top="";bU.style.overflow="hidden";bU.style.position="relative";bO.subtractsBorderForOverflowNotVisible=(bV.offsetTop===-5);bO.doesNotIncludeMarginInBodyOffset=(bQ.offsetTop!==bL);bQ.removeChild(bM);bv=bM=null;b.extend(bJ,bO)});return bJ})();var aS=/^(?:\{.*\}|\[.*\])$/,aA=/([A-Z])/g;b.extend({cache:{},uuid:0,expando:"jQuery"+(b.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:true,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:true},hasData:function(e){e=e.nodeType?b.cache[e[b.expando]]:e[b.expando];return !!e&&!S(e)},data:function(bx,bv,bz,by){if(!b.acceptData(bx)){return}var bG,bA,bD,bE=b.expando,bC=typeof bv==="string",bF=bx.nodeType,e=bF?b.cache:bx,bw=bF?bx[bE]:bx[bE]&&bE,bB=bv==="events";if((!bw||!e[bw]||(!bB&&!by&&!e[bw].data))&&bC&&bz===L){return}if(!bw){if(bF){bx[bE]=bw=++b.uuid}else{bw=bE}}if(!e[bw]){e[bw]={};if(!bF){e[bw].toJSON=b.noop}}if(typeof bv==="object"||typeof bv==="function"){if(by){e[bw]=b.extend(e[bw],bv)}else{e[bw].data=b.extend(e[bw].data,bv)}}bG=bA=e[bw];if(!by){if(!bA.data){bA.data={}}bA=bA.data}if(bz!==L){bA[b.camelCase(bv)]=bz}if(bB&&!bA[bv]){return bG.events}if(bC){bD=bA[bv];if(bD==null){bD=bA[b.camelCase(bv)]}}else{bD=bA}return bD},removeData:function(bx,bv,by){if(!b.acceptData(bx)){return}var bB,bA,bz,bC=b.expando,bD=bx.nodeType,e=bD?b.cache:bx,bw=bD?bx[bC]:bC;if(!e[bw]){return}if(bv){bB=by?e[bw]:e[bw].data;if(bB){if(!b.isArray(bv)){if(bv in bB){bv=[bv]}else{bv=b.camelCase(bv);if(bv in bB){bv=[bv]}else{bv=bv.split(" ")}}}for(bA=0,bz=bv.length;bA<bz;bA++){delete bB[bv[bA]]}if(!(by?S:b.isEmptyObject)(bB)){return}}}if(!by){delete e[bw].data;if(!S(e[bw])){return}}if(b.support.deleteExpando||!e.setInterval){delete e[bw]}else{e[bw]=null}if(bD){if(b.support.deleteExpando){delete bx[bC]}else{if(bx.removeAttribute){bx.removeAttribute(bC)}else{bx[bC]=null}}}},_data:function(bv,e,bw){return b.data(bv,e,bw,true)},acceptData:function(bv){if(bv.nodeName){var e=b.noData[bv.nodeName.toLowerCase()];if(e){return !(e===true||bv.getAttribute("classid")!==e)}}return true}});b.fn.extend({data:function(by,bA){var bB,e,bw,bz=null;if(typeof by==="undefined"){if(this.length){bz=b.data(this[0]);if(this[0].nodeType===1&&!b._data(this[0],"parsedAttrs")){e=this[0].attributes;for(var bx=0,bv=e.length;bx<bv;bx++){bw=e[bx].name;if(bw.indexOf("data-")===0){bw=b.camelCase(bw.substring(5));a5(this[0],bw,bz[bw])}}b._data(this[0],"parsedAttrs",true)}}return bz}else{if(typeof by==="object"){return this.each(function(){b.data(this,by)})}}bB=by.split(".");bB[1]=bB[1]?"."+bB[1]:"";if(bA===L){bz=this.triggerHandler("getData"+bB[1]+"!",[bB[0]]);if(bz===L&&this.length){bz=b.data(this[0],by);bz=a5(this[0],by,bz)}return bz===L&&bB[1]?this.data(bB[0]):bz}else{return this.each(function(){var bC=b(this),bD=[bB[0],bA];bC.triggerHandler("setData"+bB[1]+"!",bD);b.data(this,by,bA);bC.triggerHandler("changeData"+bB[1]+"!",bD)})}},removeData:function(e){return this.each(function(){b.removeData(this,e)})}});function a5(bx,bw,by){if(by===L&&bx.nodeType===1){var bv="data-"+bw.replace(aA,"-$1").toLowerCase();by=bx.getAttribute(bv);if(typeof by==="string"){try{by=by==="true"?true:by==="false"?false:by==="null"?null:b.isNumeric(by)?parseFloat(by):aS.test(by)?b.parseJSON(by):by}catch(bz){}b.data(bx,bw,by)}else{by=L}}return by}function S(bv){for(var e in bv){if(e==="data"&&b.isEmptyObject(bv[e])){continue}if(e!=="toJSON"){return false}}return true}function bi(by,bx,bA){var bw=bx+"defer",bv=bx+"queue",e=bx+"mark",bz=b._data(by,bw);if(bz&&(bA==="queue"||!b._data(by,bv))&&(bA==="mark"||!b._data(by,e))){setTimeout(function(){if(!b._data(by,bv)&&!b._data(by,e)){b.removeData(by,bw,true);bz.fire()}},0)}}b.extend({_mark:function(bv,e){if(bv){e=(e||"fx")+"mark";b._data(bv,e,(b._data(bv,e)||0)+1)}},_unmark:function(by,bx,bv){if(by!==true){bv=bx;bx=by;by=false}if(bx){bv=bv||"fx";var e=bv+"mark",bw=by?0:((b._data(bx,e)||1)-1);if(bw){b._data(bx,e,bw)}else{b.removeData(bx,e,true);bi(bx,bv,"mark")}}},queue:function(bv,e,bx){var bw;if(bv){e=(e||"fx")+"queue";bw=b._data(bv,e);if(bx){if(!bw||b.isArray(bx)){bw=b._data(bv,e,b.makeArray(bx))}else{bw.push(bx)}}return bw||[]}},dequeue:function(by,bx){bx=bx||"fx";var bv=b.queue(by,bx),bw=bv.shift(),e={};if(bw==="inprogress"){bw=bv.shift()}if(bw){if(bx==="fx"){bv.unshift("inprogress")}b._data(by,bx+".run",e);bw.call(by,function(){b.dequeue(by,bx)},e)}if(!bv.length){b.removeData(by,bx+"queue "+bx+".run",true);bi(by,bx,"queue")}}});b.fn.extend({queue:function(e,bv){if(typeof e!=="string"){bv=e;e="fx"}if(bv===L){return b.queue(this[0],e)}return this.each(function(){var bw=b.queue(this,e,bv);if(e==="fx"&&bw[0]!=="inprogress"){b.dequeue(this,e)}})},dequeue:function(e){return this.each(function(){b.dequeue(this,e)})},delay:function(bv,e){bv=b.fx?b.fx.speeds[bv]||bv:bv;e=e||"fx";return this.queue(e,function(bx,bw){var by=setTimeout(bx,bv);bw.stop=function(){clearTimeout(by)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(bD,bw){if(typeof bD!=="string"){bw=bD;bD=L}bD=bD||"fx";var e=b.Deferred(),bv=this,by=bv.length,bB=1,bz=bD+"defer",bA=bD+"queue",bC=bD+"mark",bx;function bE(){if(!(--bB)){e.resolveWith(bv,[bv])}}while(by--){if((bx=b.data(bv[by],bz,L,true)||(b.data(bv[by],bA,L,true)||b.data(bv[by],bC,L,true))&&b.data(bv[by],bz,b.Callbacks("once memory"),true))){bB++;bx.add(bE)}}bE();return e.promise()}});var aP=/[\n\t\r]/g,af=/\s+/,aU=/\r/g,g=/^(?:button|input)$/i,D=/^(?:button|input|object|select|textarea)$/i,l=/^a(?:rea)?$/i,ao=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,F=b.support.getSetAttribute,be,aY,aF;b.fn.extend({attr:function(e,bv){return b.access(this,e,bv,true,b.attr)},removeAttr:function(e){return this.each(function(){b.removeAttr(this,e)})},prop:function(e,bv){return b.access(this,e,bv,true,b.prop)},removeProp:function(e){e=b.propFix[e]||e;return this.each(function(){try{this[e]=L;delete this[e]}catch(bv){}})},addClass:function(by){var bA,bw,bv,bx,bz,bB,e;if(b.isFunction(by)){return this.each(function(bC){b(this).addClass(by.call(this,bC,this.className))})}if(by&&typeof by==="string"){bA=by.split(af);for(bw=0,bv=this.length;bw<bv;bw++){bx=this[bw];if(bx.nodeType===1){if(!bx.className&&bA.length===1){bx.className=by}else{bz=" "+bx.className+" ";for(bB=0,e=bA.length;bB<e;bB++){if(!~bz.indexOf(" "+bA[bB]+" ")){bz+=bA[bB]+" "}}bx.className=b.trim(bz)}}}}return this},removeClass:function(bz){var bA,bw,bv,by,bx,bB,e;if(b.isFunction(bz)){return this.each(function(bC){b(this).removeClass(bz.call(this,bC,this.className))})}if((bz&&typeof bz==="string")||bz===L){bA=(bz||"").split(af);for(bw=0,bv=this.length;bw<bv;bw++){by=this[bw];if(by.nodeType===1&&by.className){if(bz){bx=(" "+by.className+" ").replace(aP," ");for(bB=0,e=bA.length;bB<e;bB++){bx=bx.replace(" "+bA[bB]+" "," ")}by.className=b.trim(bx)}else{by.className=""}}}}return this},toggleClass:function(bx,bv){var bw=typeof bx,e=typeof bv==="boolean";if(b.isFunction(bx)){return this.each(function(by){b(this).toggleClass(bx.call(this,by,this.className,bv),bv)})}return this.each(function(){if(bw==="string"){var bA,bz=0,by=b(this),bB=bv,bC=bx.split(af);while((bA=bC[bz++])){bB=e?bB:!by.hasClass(bA);by[bB?"addClass":"removeClass"](bA)}}else{if(bw==="undefined"||bw==="boolean"){if(this.className){b._data(this,"__className__",this.className)}this.className=this.className||bx===false?"":b._data(this,"__className__")||""}}})},hasClass:function(e){var bx=" "+e+" ",bw=0,bv=this.length;for(;bw<bv;bw++){if(this[bw].nodeType===1&&(" "+this[bw].className+" ").replace(aP," ").indexOf(bx)>-1){return true}}return false},val:function(bx){var e,bv,by,bw=this[0];if(!arguments.length){if(bw){e=b.valHooks[bw.nodeName.toLowerCase()]||b.valHooks[bw.type];if(e&&"get" in e&&(bv=e.get(bw,"value"))!==L){return bv}bv=bw.value;return typeof bv==="string"?bv.replace(aU,""):bv==null?"":bv}return}by=b.isFunction(bx);return this.each(function(bA){var bz=b(this),bB;if(this.nodeType!==1){return}if(by){bB=bx.call(this,bA,bz.val())}else{bB=bx}if(bB==null){bB=""}else{if(typeof bB==="number"){bB+=""}else{if(b.isArray(bB)){bB=b.map(bB,function(bC){return bC==null?"":bC+""})}}}e=b.valHooks[this.nodeName.toLowerCase()]||b.valHooks[this.type];if(!e||!("set" in e)||e.set(this,bB,"value")===L){this.value=bB}})}});b.extend({valHooks:{option:{get:function(e){var bv=e.attributes.value;return !bv||bv.specified?e.value:e.text}},select:{get:function(e){var bA,bv,bz,bx,by=e.selectedIndex,bB=[],bC=e.options,bw=e.type==="select-one";if(by<0){return null}bv=bw?by:0;bz=bw?by+1:bC.length;for(;bv<bz;bv++){bx=bC[bv];if(bx.selected&&(b.support.optDisabled?!bx.disabled:bx.getAttribute("disabled")===null)&&(!bx.parentNode.disabled||!b.nodeName(bx.parentNode,"optgroup"))){bA=b(bx).val();if(bw){return bA}bB.push(bA)}}if(bw&&!bB.length&&bC.length){return b(bC[by]).val()}return bB},set:function(bv,bw){var e=b.makeArray(bw);b(bv).find("option").each(function(){this.selected=b.inArray(b(this).val(),e)>=0});if(!e.length){bv.selectedIndex=-1}return e}}},attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(bA,bx,bB,bz){var bw,e,by,bv=bA.nodeType;
+if(!bA||bv===3||bv===8||bv===2){return}if(bz&&bx in b.attrFn){return b(bA)[bx](bB)}if(typeof bA.getAttribute==="undefined"){return b.prop(bA,bx,bB)}by=bv!==1||!b.isXMLDoc(bA);if(by){bx=bx.toLowerCase();e=b.attrHooks[bx]||(ao.test(bx)?aY:be)}if(bB!==L){if(bB===null){b.removeAttr(bA,bx);return}else{if(e&&"set" in e&&by&&(bw=e.set(bA,bB,bx))!==L){return bw}else{bA.setAttribute(bx,""+bB);return bB}}}else{if(e&&"get" in e&&by&&(bw=e.get(bA,bx))!==null){return bw}else{bw=bA.getAttribute(bx);return bw===null?L:bw}}},removeAttr:function(bx,bz){var by,bA,bv,e,bw=0;if(bz&&bx.nodeType===1){bA=bz.toLowerCase().split(af);e=bA.length;for(;bw<e;bw++){bv=bA[bw];if(bv){by=b.propFix[bv]||bv;b.attr(bx,bv,"");bx.removeAttribute(F?bv:by);if(ao.test(bv)&&by in bx){bx[by]=false}}}}},attrHooks:{type:{set:function(e,bv){if(g.test(e.nodeName)&&e.parentNode){b.error("type property can't be changed")}else{if(!b.support.radioValue&&bv==="radio"&&b.nodeName(e,"input")){var bw=e.value;e.setAttribute("type",bv);if(bw){e.value=bw}return bv}}}},value:{get:function(bv,e){if(be&&b.nodeName(bv,"button")){return be.get(bv,e)}return e in bv?bv.value:null},set:function(bv,bw,e){if(be&&b.nodeName(bv,"button")){return be.set(bv,bw,e)}bv.value=bw}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(bz,bx,bA){var bw,e,by,bv=bz.nodeType;if(!bz||bv===3||bv===8||bv===2){return}by=bv!==1||!b.isXMLDoc(bz);if(by){bx=b.propFix[bx]||bx;e=b.propHooks[bx]}if(bA!==L){if(e&&"set" in e&&(bw=e.set(bz,bA,bx))!==L){return bw}else{return(bz[bx]=bA)}}else{if(e&&"get" in e&&(bw=e.get(bz,bx))!==null){return bw}else{return bz[bx]}}},propHooks:{tabIndex:{get:function(bv){var e=bv.getAttributeNode("tabindex");return e&&e.specified?parseInt(e.value,10):D.test(bv.nodeName)||l.test(bv.nodeName)&&bv.href?0:L}}}});b.attrHooks.tabindex=b.propHooks.tabIndex;aY={get:function(bv,e){var bx,bw=b.prop(bv,e);return bw===true||typeof bw!=="boolean"&&(bx=bv.getAttributeNode(e))&&bx.nodeValue!==false?e.toLowerCase():L},set:function(bv,bx,e){var bw;if(bx===false){b.removeAttr(bv,e)}else{bw=b.propFix[e]||e;if(bw in bv){bv[bw]=true}bv.setAttribute(e,e.toLowerCase())}return e}};if(!F){aF={name:true,id:true};be=b.valHooks.button={get:function(bw,bv){var e;e=bw.getAttributeNode(bv);return e&&(aF[bv]?e.nodeValue!=="":e.specified)?e.nodeValue:L},set:function(bw,bx,bv){var e=bw.getAttributeNode(bv);if(!e){e=av.createAttribute(bv);bw.setAttributeNode(e)}return(e.nodeValue=bx+"")}};b.attrHooks.tabindex.set=be.set;b.each(["width","height"],function(bv,e){b.attrHooks[e]=b.extend(b.attrHooks[e],{set:function(bw,bx){if(bx===""){bw.setAttribute(e,"auto");return bx}}})});b.attrHooks.contenteditable={get:be.get,set:function(bv,bw,e){if(bw===""){bw="false"}be.set(bv,bw,e)}}}if(!b.support.hrefNormalized){b.each(["href","src","width","height"],function(bv,e){b.attrHooks[e]=b.extend(b.attrHooks[e],{get:function(bx){var bw=bx.getAttribute(e,2);return bw===null?L:bw}})})}if(!b.support.style){b.attrHooks.style={get:function(e){return e.style.cssText.toLowerCase()||L},set:function(e,bv){return(e.style.cssText=""+bv)}}}if(!b.support.optSelected){b.propHooks.selected=b.extend(b.propHooks.selected,{get:function(bv){var e=bv.parentNode;if(e){e.selectedIndex;if(e.parentNode){e.parentNode.selectedIndex}}return null}})}if(!b.support.enctype){b.propFix.enctype="encoding"}if(!b.support.checkOn){b.each(["radio","checkbox"],function(){b.valHooks[this]={get:function(e){return e.getAttribute("value")===null?"on":e.value}}})}b.each(["radio","checkbox"],function(){b.valHooks[this]=b.extend(b.valHooks[this],{set:function(e,bv){if(b.isArray(bv)){return(e.checked=b.inArray(b(e).val(),bv)>=0)}}})});var bd=/^(?:textarea|input|select)$/i,n=/^([^\.]*)?(?:\.(.+))?$/,J=/\bhover(\.\S+)?\b/,aO=/^key/,bf=/^(?:mouse|contextmenu)|click/,T=/^(?:focusinfocus|focusoutblur)$/,U=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,Y=function(e){var bv=U.exec(e);if(bv){bv[1]=(bv[1]||"").toLowerCase();bv[3]=bv[3]&&new RegExp("(?:^|\\s)"+bv[3]+"(?:\\s|$)")}return bv},j=function(bw,e){var bv=bw.attributes||{};return((!e[1]||bw.nodeName.toLowerCase()===e[1])&&(!e[2]||(bv.id||{}).value===e[2])&&(!e[3]||e[3].test((bv["class"]||{}).value)))},bt=function(e){return b.event.special.hover?e:e.replace(J,"mouseenter$1 mouseleave$1")};b.event={add:function(bx,bC,bJ,bA,by){var bD,bB,bK,bI,bH,bF,e,bG,bv,bz,bw,bE;if(bx.nodeType===3||bx.nodeType===8||!bC||!bJ||!(bD=b._data(bx))){return}if(bJ.handler){bv=bJ;bJ=bv.handler}if(!bJ.guid){bJ.guid=b.guid++}bK=bD.events;if(!bK){bD.events=bK={}}bB=bD.handle;if(!bB){bD.handle=bB=function(bL){return typeof b!=="undefined"&&(!bL||b.event.triggered!==bL.type)?b.event.dispatch.apply(bB.elem,arguments):L};bB.elem=bx}bC=b.trim(bt(bC)).split(" ");for(bI=0;bI<bC.length;bI++){bH=n.exec(bC[bI])||[];bF=bH[1];e=(bH[2]||"").split(".").sort();bE=b.event.special[bF]||{};bF=(by?bE.delegateType:bE.bindType)||bF;bE=b.event.special[bF]||{};bG=b.extend({type:bF,origType:bH[1],data:bA,handler:bJ,guid:bJ.guid,selector:by,quick:Y(by),namespace:e.join(".")},bv);bw=bK[bF];if(!bw){bw=bK[bF]=[];bw.delegateCount=0;if(!bE.setup||bE.setup.call(bx,bA,e,bB)===false){if(bx.addEventListener){bx.addEventListener(bF,bB,false)}else{if(bx.attachEvent){bx.attachEvent("on"+bF,bB)}}}}if(bE.add){bE.add.call(bx,bG);if(!bG.handler.guid){bG.handler.guid=bJ.guid}}if(by){bw.splice(bw.delegateCount++,0,bG)}else{bw.push(bG)}b.event.global[bF]=true}bx=null},global:{},remove:function(bJ,bE,bv,bH,bB){var bI=b.hasData(bJ)&&b._data(bJ),bF,bx,bz,bL,bC,bA,bG,bw,by,bK,bD,e;if(!bI||!(bw=bI.events)){return}bE=b.trim(bt(bE||"")).split(" ");for(bF=0;bF<bE.length;bF++){bx=n.exec(bE[bF])||[];bz=bL=bx[1];bC=bx[2];if(!bz){for(bz in bw){b.event.remove(bJ,bz+bE[bF],bv,bH,true)}continue}by=b.event.special[bz]||{};bz=(bH?by.delegateType:by.bindType)||bz;bD=bw[bz]||[];bA=bD.length;bC=bC?new RegExp("(^|\\.)"+bC.split(".").sort().join("\\.(?:.*\\.)?")+"(\\.|$)"):null;for(bG=0;bG<bD.length;bG++){e=bD[bG];if((bB||bL===e.origType)&&(!bv||bv.guid===e.guid)&&(!bC||bC.test(e.namespace))&&(!bH||bH===e.selector||bH==="**"&&e.selector)){bD.splice(bG--,1);if(e.selector){bD.delegateCount--}if(by.remove){by.remove.call(bJ,e)}}}if(bD.length===0&&bA!==bD.length){if(!by.teardown||by.teardown.call(bJ,bC)===false){b.removeEvent(bJ,bz,bI.handle)}delete bw[bz]}}if(b.isEmptyObject(bw)){bK=bI.handle;if(bK){bK.elem=null}b.removeData(bJ,["events","handle"],true)}},customEvent:{getData:true,setData:true,changeData:true},trigger:function(bv,bD,bA,bJ){if(bA&&(bA.nodeType===3||bA.nodeType===8)){return}var bG=bv.type||bv,bx=[],e,bw,bC,bH,bz,by,bF,bE,bB,bI;if(T.test(bG+b.event.triggered)){return}if(bG.indexOf("!")>=0){bG=bG.slice(0,-1);bw=true}if(bG.indexOf(".")>=0){bx=bG.split(".");bG=bx.shift();bx.sort()}if((!bA||b.event.customEvent[bG])&&!b.event.global[bG]){return}bv=typeof bv==="object"?bv[b.expando]?bv:new b.Event(bG,bv):new b.Event(bG);bv.type=bG;bv.isTrigger=true;bv.exclusive=bw;bv.namespace=bx.join(".");bv.namespace_re=bv.namespace?new RegExp("(^|\\.)"+bx.join("\\.(?:.*\\.)?")+"(\\.|$)"):null;by=bG.indexOf(":")<0?"on"+bG:"";if(!bA){e=b.cache;for(bC in e){if(e[bC].events&&e[bC].events[bG]){b.event.trigger(bv,bD,e[bC].handle.elem,true)}}return}bv.result=L;if(!bv.target){bv.target=bA}bD=bD!=null?b.makeArray(bD):[];bD.unshift(bv);bF=b.event.special[bG]||{};if(bF.trigger&&bF.trigger.apply(bA,bD)===false){return}bB=[[bA,bF.bindType||bG]];if(!bJ&&!bF.noBubble&&!b.isWindow(bA)){bI=bF.delegateType||bG;bH=T.test(bI+bG)?bA:bA.parentNode;bz=null;for(;bH;bH=bH.parentNode){bB.push([bH,bI]);bz=bH}if(bz&&bz===bA.ownerDocument){bB.push([bz.defaultView||bz.parentWindow||bb,bI])}}for(bC=0;bC<bB.length&&!bv.isPropagationStopped();bC++){bH=bB[bC][0];bv.type=bB[bC][1];bE=(b._data(bH,"events")||{})[bv.type]&&b._data(bH,"handle");if(bE){bE.apply(bH,bD)}bE=by&&bH[by];if(bE&&b.acceptData(bH)&&bE.apply(bH,bD)===false){bv.preventDefault()}}bv.type=bG;if(!bJ&&!bv.isDefaultPrevented()){if((!bF._default||bF._default.apply(bA.ownerDocument,bD)===false)&&!(bG==="click"&&b.nodeName(bA,"a"))&&b.acceptData(bA)){if(by&&bA[bG]&&((bG!=="focus"&&bG!=="blur")||bv.target.offsetWidth!==0)&&!b.isWindow(bA)){bz=bA[by];if(bz){bA[by]=null}b.event.triggered=bG;bA[bG]();b.event.triggered=L;if(bz){bA[by]=bz}}}}return bv.result},dispatch:function(e){e=b.event.fix(e||bb.event);var bz=((b._data(this,"events")||{})[e.type]||[]),bA=bz.delegateCount,bG=[].slice.call(arguments,0),by=!e.exclusive&&!e.namespace,bH=[],bC,bB,bK,bx,bF,bE,bv,bD,bI,bw,bJ;bG[0]=e;e.delegateTarget=this;if(bA&&!e.target.disabled&&!(e.button&&e.type==="click")){bx=b(this);bx.context=this.ownerDocument||this;for(bK=e.target;bK!=this;bK=bK.parentNode||this){bE={};bD=[];bx[0]=bK;for(bC=0;bC<bA;bC++){bI=bz[bC];bw=bI.selector;if(bE[bw]===L){bE[bw]=(bI.quick?j(bK,bI.quick):bx.is(bw))}if(bE[bw]){bD.push(bI)}}if(bD.length){bH.push({elem:bK,matches:bD})}}}if(bz.length>bA){bH.push({elem:this,matches:bz.slice(bA)})}for(bC=0;bC<bH.length&&!e.isPropagationStopped();bC++){bv=bH[bC];e.currentTarget=bv.elem;for(bB=0;bB<bv.matches.length&&!e.isImmediatePropagationStopped();bB++){bI=bv.matches[bB];if(by||(!e.namespace&&!bI.namespace)||e.namespace_re&&e.namespace_re.test(bI.namespace)){e.data=bI.data;e.handleObj=bI;bF=((b.event.special[bI.origType]||{}).handle||bI.handler).apply(bv.elem,bG);if(bF!==L){e.result=bF;if(bF===false){e.preventDefault();e.stopPropagation()}}}}}return e.result},props:"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(bv,e){if(bv.which==null){bv.which=e.charCode!=null?e.charCode:e.keyCode}return bv}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(bx,bw){var by,bz,e,bv=bw.button,bA=bw.fromElement;if(bx.pageX==null&&bw.clientX!=null){by=bx.target.ownerDocument||av;bz=by.documentElement;e=by.body;bx.pageX=bw.clientX+(bz&&bz.scrollLeft||e&&e.scrollLeft||0)-(bz&&bz.clientLeft||e&&e.clientLeft||0);bx.pageY=bw.clientY+(bz&&bz.scrollTop||e&&e.scrollTop||0)-(bz&&bz.clientTop||e&&e.clientTop||0)}if(!bx.relatedTarget&&bA){bx.relatedTarget=bA===bx.target?bw.toElement:bA}if(!bx.which&&bv!==L){bx.which=(bv&1?1:(bv&2?3:(bv&4?2:0)))}return bx}},fix:function(bw){if(bw[b.expando]){return bw}var bv,bz,e=bw,bx=b.event.fixHooks[bw.type]||{},by=bx.props?this.props.concat(bx.props):this.props;bw=b.Event(e);for(bv=by.length;bv;){bz=by[--bv];bw[bz]=e[bz]}if(!bw.target){bw.target=e.srcElement||av}if(bw.target.nodeType===3){bw.target=bw.target.parentNode}if(bw.metaKey===L){bw.metaKey=bw.ctrlKey}return bx.filter?bx.filter(bw,e):bw},special:{ready:{setup:b.bindReady},load:{noBubble:true},focus:{delegateType:"focusin"},blur:{delegateType:"focusout"},beforeunload:{setup:function(bw,bv,e){if(b.isWindow(this)){this.onbeforeunload=e}},teardown:function(bv,e){if(this.onbeforeunload===e){this.onbeforeunload=null}}}},simulate:function(bw,by,bx,bv){var bz=b.extend(new b.Event(),bx,{type:bw,isSimulated:true,originalEvent:{}});if(bv){b.event.trigger(bz,null,by)}else{b.event.dispatch.call(by,bz)}if(bz.isDefaultPrevented()){bx.preventDefault()}}};b.event.handle=b.event.dispatch;b.removeEvent=av.removeEventListener?function(bv,e,bw){if(bv.removeEventListener){bv.removeEventListener(e,bw,false)}}:function(bv,e,bw){if(bv.detachEvent){bv.detachEvent("on"+e,bw)}};b.Event=function(bv,e){if(!(this instanceof b.Event)){return new b.Event(bv,e)}if(bv&&bv.type){this.originalEvent=bv;this.type=bv.type;this.isDefaultPrevented=(bv.defaultPrevented||bv.returnValue===false||bv.getPreventDefault&&bv.getPreventDefault())?i:bk}else{this.type=bv}if(e){b.extend(this,e)}this.timeStamp=bv&&bv.timeStamp||b.now();this[b.expando]=true};function bk(){return false}function i(){return true}b.Event.prototype={preventDefault:function(){this.isDefaultPrevented=i;var bv=this.originalEvent;if(!bv){return}if(bv.preventDefault){bv.preventDefault()}else{bv.returnValue=false}},stopPropagation:function(){this.isPropagationStopped=i;var bv=this.originalEvent;if(!bv){return}if(bv.stopPropagation){bv.stopPropagation()}bv.cancelBubble=true},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=i;this.stopPropagation()},isDefaultPrevented:bk,isPropagationStopped:bk,isImmediatePropagationStopped:bk};b.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(bv,e){b.event.special[bv]={delegateType:e,bindType:e,handle:function(bz){var bB=this,bA=bz.relatedTarget,by=bz.handleObj,bw=by.selector,bx;if(!bA||(bA!==bB&&!b.contains(bB,bA))){bz.type=by.origType;bx=by.handler.apply(this,arguments);bz.type=e}return bx}}});if(!b.support.submitBubbles){b.event.special.submit={setup:function(){if(b.nodeName(this,"form")){return false
index e48ba50..1effb45 100644 (file)
@@ -1,3 +1,18 @@
-"/*! jQuery v1.7.1 jquery.com | jquery.org/license */\n"
-"(function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cv(a){if(!ck[a]){var b=c.body,d=f(\"<\"+a+\">\").appendTo(b),e=d.css(\"display\");d.remove();if(e===\"none\"||e===\"\"){cl||(cl=c.createElement(\"iframe\"),cl.frameBorder=cl.width=cl.height=0),b.appendChild(cl);if(!cm||!cl.createElement)cm=(cl.contentWindow||cl.contentDocument).document,cm.write((c.compatMode===\"CSS1Compat\"?\"<!doctype html>\":\"\")+\"<html><body>\"),cm.close();d=cm.createElement(a),cm.body.appendChild(d),e=f.css(d,\"display\"),b.removeChild(cl)}ck[a]=e}return ck[a]}function cu(a,b){var c={};f.each(cq.concat.apply([],cq.slice(0,b)),function(){c[this]=a});return c}function ct(){cr=b}function cs(){setTimeout(ct,0);return cr=f.now()}function cj(){try{return new a.ActiveXObject(\"Microsoft.XMLHTTP\")}catch(b){}}function ci(){try{return new a.XMLHttpRequest}catch(b){}}function cc(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g<i;g++){if(g===1)for(h in a.converters)typeof h==\"string\"&&(e[h.toLowerCase()]=a.converters[h]);l=k,k=d[g];if(k===\"*\")k=l;else if(l!==\"*\"&&l!==k){m=l+\" \"+k,n=e[m]||e[\"* \"+k];if(!n){p=b;for(o in e){j=o.split(\" \");if(j[0]===l||j[0]===\"*\"){p=e[j[1]+\" \"+k];if(p){o=e[o],o===!0?n=p:p===!0&&(n=o);break}}}}!n&&!p&&f.error(\"No conversion from \"+m.replace(\" \",\" to \")),n!==!0&&(c=n?n(c):p(o(c)))}}return c}function cb(a,c,d){var e=a.contents,f=a.dataTypes,g=a.responseFields,h,i,j,k;for(i in g)i in d&&(c[g[i]]=d[i]);while(f[0]===\"*\")f.shift(),h===b&&(h=a.mimeType||c.getResponseHeader(\"content-type\"));if(h)for(i in e)if(e[i]&&e[i].test(h)){f.unshift(i);break}if(f[0]in d)j=f[0];else{for(i in d){if(!f[0]||a.converters[i+\" \"+f[0]]){j=i;break}k||(k=i)}j=j||k}if(j){j!==f[0]&&f.unshift(j);return d[j]}}function ca(a,b,c,d){if(f.isArray(b))f.each(b,function(b,e){c||bE.test(a)?d(a,e):ca(a+\"[\"+(typeof e==\"object\"||f.isArray(e)?b:\"\")+\"]\",e,c,d)});else if(!c&&b!=null&&typeof b==\"object\")for(var e in b)ca(a+\"[\"+e+\"]\",b[e],c,d);else d(a,b)}function b_(a,c){var d,e,g=f.ajaxSettings.flatOptions||{};for(d in c)c[d]!==b&&((g[d]?a:e||(e={}))[d]=c[d]);e&&f.extend(!0,a,e)}function b$(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h=a[f],i=0,j=h?h.length:0,k=a===bT,l;for(;i<j&&(k||!l);i++)l=h[i](c,d,e),typeof l==\"string\"&&(!k||g[l]?l=b:(c.dataTypes.unshift(l),l=b$(a,c,d,e,l,g)));(k||!l)&&!g[\"*\"]&&(l=b$(a,c,d,e,\"*\",g));return l}function bZ(a){return function(b,c){typeof b!=\"string\"&&(c=b,b=\"*\");if(f.isFunction(c)){var d=b.toLowerCase().split(bP),e=0,g=d.length,h,i,j;for(;e<g;e++)h=d[e],j=/^\\+/.test(h),j&&(h=h.substr(1)||\"*\"),i=a[h]=a[h]||[],i[j?\"unshift\":\"push\"](c)}}}function bC(a,b,c){var d=b===\"width\"?a.offsetWidth:a.offsetHeight,e=b===\"width\"?bx:by,g=0,h=e.length;if(d>0){if(c!==\"border\")for(;g<h;g++)c||(d-=parseFloat(f.css(a,\"padding\"+e[g]))||0),c===\"margin\"?d+=parseFloat(f.css(a,c+e[g]))||0:d-=parseFloat(f.css(a,\"border\"+e[g]+\"Width\"))||0;return d+\"px\"}d=bz(a,b,b);if(d<0||d==null)d=a.style[b]||0;d=parseFloat(d)||0;if(c)for(;g<h;g++)d+=parseFloat(f.css(a,\"padding\"+e[g]))||0,c!==\"padding\"&&(d+=parseFloat(f.css(a,\"border\"+e[g]+\"Width\"))||0),c===\"margin\"&&(d+=parseFloat(f.css(a,c+e[g]))||0);return d+\"px\"}function bp(a,b){b.src?f.ajax({url:b.src,async:!1,dataType:\"script\"}):f.globalEval((b.text||b.textContent||b.innerHTML||\"\").replace(bf,\"/*$0*/\")),b.parentNode&&b.parentNode.removeChild(b)}function bo(a){var b=c.createElement(\"div\");bh.appendChild(b),b.innerHTML=a.outerHTML;return b.firstChild}function bn(a){var b=(a.nodeName||\"\").toLowerCase();b===\"input\"?bm(a):b!==\"script\"&&typeof a.getElementsByTagName!=\"undefined\"&&f.grep(a.getElementsByTagName(\"input\"),bm)}function bm(a){if(a.type===\"checkbox\"||a.type===\"radio\")a.defaultChecked=a.checked}function bl(a){return typeof a.getElementsByTagName!=\"undefined\"?a.getElementsByTagName(\"*\"):typeof a.querySelectorAll!=\"undefined\"?a.querySelectorAll(\"*\"):[]}function bk(a,b){var c;if(b.nodeType===1){b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase();if(c===\"object\")b.outerHTML=a.outerHTML;else if(c!==\"input\"||a.type!==\"checkbox\"&&a.type!==\"radio\"){if(c===\"option\")b.selected=a.defaultSelected;else if(c===\"input\"||c===\"textarea\")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(f.expando)}}function bj(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c,d,e,g=f._data(a),h=f._data(b,g),i=g.events;if(i){delete h.handle,h.events={};for(c in i)for(d=0,e=i[c].length;d<e;d++)f.event.add(b,c+(i[c][d].namespace?\".\":\"\")+i[c][d].namespace,i[c][d],i[c][d].data)}h.data&&(h.data=f.extend({},h.data))}}function bi(a,b){return f.nodeName(a,\"table\")?a.getElementsByTagName(\"tbody\")[0]||a.appendChild(a.ownerDocument.createElement(\"tbody\")):a}function U(a){var b=V.split(\"|\"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}function T(a,b,c){b=b||0;if(f.isFunction(b))return f.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return f.grep(a,function(a,d){return a===b===c});if(typeof b==\"string\"){var d=f.grep(a,function(a){return a.nodeType===1});if(O.test(b))return f.filter(b,d,!c);b=f.filter(b,d)}return f.grep(a,function(a,d){return f.inArray(a,b)>=0===c})}function S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+\"defer\",e=b+\"queue\",g=b+\"mark\",h=f._data(a,d);h&&(c===\"queue\"||!f._data(a,e))&&(c===\"mark\"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b===\"data\"&&f.isEmptyObject(a[b]))continue;if(b!==\"toJSON\")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e=\"data-\"+c.replace(k,\"-$1\").toLowerCase();d=a.getAttribute(e);if(typeof d==\"string\"){try{d=d===\"true\"?!0:d===\"false\"?!1:d===\"null\"?null:f.isNumeric(d)?parseFloat(d):j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\\s+/);for(c=0,d=a.length;c<d;c++)b[a[c]]=!0;return b}var c=a.document,d=a.navigator,e=a.location,f=function(){function J(){if(!e.isReady){try{c.documentElement.doScroll(\"left\")}catch(a){setTimeout(J,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^#<]*(<[\\w\\W]+>)[^>]*$|#([\\w\\-]*)$)/,j=/\\S/,k=/^\\s+/,l=/\\s+$/,m=/^<(\\w+)\\s*\\/?>(?:<\\/\\1>)?$/,n=/^[\\],:{}\\s]*$/,o=/\\\\(?:[\"\\\\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/\"[^\"\\\\\\n\\r]*\"|true|false|null|-?\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?/g,q=/(?:^|:|,)(?:\\s*\\[)+/g,r=/(webkit)[ \\/]([\\w.]+)/,s=/(opera)(?:.*version)?[ \\/]([\\w.]+)/,t=/(msie) ([\\w.]+)/,u=/(mozilla)(?:.*? rv:([\\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+\"\").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a===\"body\"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a==\"string\"){a.charAt(0)!==\"<\"||a.charAt(a.length-1)!==\">\"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:\"\",jquery:\"1.7.1\",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b===\"find\"?d.selector=this.selector+(this.selector?\" \":\"\")+c:b&&(d.selector=this.selector+\".\"+b+\"(\"+c+\")\");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+a;return a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),\"slice\",F.call(arguments).join(\",\"))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i==\"boolean\"&&(l=i,i=arguments[1]||{},j=2),typeof i!=\"object\"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j<k;j++)if((a=arguments[j])!=null)for(c in a){d=i[c],f=a[c];if(i===f)continue;l&&f&&(e.isPlainObject(f)||(g=e.isArray(f)))?(g?(g=!1,h=d&&e.isArray(d)?d:[]):h=d&&e.isPlainObject(d)?d:{},i[c]=e.extend(l,h,f)):f!==b&&(i[c]=f)}return i},e.extend({noConflict:function(b){a.$===e&&(a.$=g),b&&a.jQuery===e&&(a.jQuery=f);return e},isReady:!1,readyWait:1,holdReady:function(a){a?e.readyWait++:e.ready(!0)},ready:function(a){if(a===!0&&!--e.readyWait||a!==!0&&!e.isReady){if(!c.body)return setTimeout(e.ready,1);e.isReady=!0;if(a!==!0&&--e.readyWait>0)return;A.fireWith(c,[e]),e.fn.trigger&&e(c).trigger(\"ready\").off(\"ready\")}},bindReady:function(){if(!A){A=e.Callbacks(\"once memory\");if(c.readyState===\"complete\")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener(\"DOMContentLoaded\",B,!1),a.addEventListener(\"load\",e.ready,!1);else if(c.attachEvent){c.attachEvent(\"onreadystatechange\",B),a.attachEvent(\"onload\",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)===\"function\"},isArray:Array.isArray||function(a){return e.type(a)===\"array\"},isWindow:function(a){return a&&typeof a==\"object\"&&\"setInterval\"in a},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||\"object\"},isPlainObject:function(a){if(!a||e.type(a)!==\"object\"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!D.call(a,\"constructor\")&&!D.call(a.constructor.prototype,\"isPrototypeOf\"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw new Error(a)},parseJSON:function(b){if(typeof b!=\"string\"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o,\"@\").replace(p,\"]\").replace(q,\"\")))return(new Function(\"return \"+b))();e.error(\"Invalid JSON: \"+b)},parseXML:function(c){var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,\"text/xml\")):(d=new ActiveXObject(\"Microsoft.XMLDOM\"),d.async=\"false\",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName(\"parsererror\").length)&&e.error(\"Invalid XML: \"+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,\"ms-\").replace(v,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g<h;)if(c.apply(a[g++],d)===!1)break}else if(i){for(f in a)if(c.call(a[f],f,a[f])===!1)break}else for(;g<h;)if(c.call(a[g],g,a[g++])===!1)break;return a},trim:G?function(a){return a==null?\"\":G.call(a)}:function(a){return a==null?\"\":(a+\"\").replace(k,\"\").replace(l,\"\")},makeArray:function(a,b){var c=b||[];if(a!=null){var d=e.type(a);a.length==null||d===\"string\"||d===\"function\"||d===\"regexp\"||e.isWindow(a)?E.call(c,a):e.merge(c,a)}return c},inArray:function(a,b,c){var d;if(b){if(H)return H.call(b,a,c);d=b.length,c=c?c<0?Math.max(0,d+c):c:0;for(;c<d;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,c){var d=a.length,e=0;if(typeof c.length==\"number\")for(var f=c.length;e<f;e++)a[d++]=c[e];else while(c[e]!==b)a[d++]=c[e++];a.length=d;return a},grep:function(a,b,c){var d=[],e;c=!!c;for(var f=0,g=a.length;f<g;f++)e=!!b(a[f],f),c!==e&&d.push(a[f]);return d},map:function(a,c,d){var f,g,h=[],i=0,j=a.length,k=a instanceof e||j!==b&&typeof j==\"number\"&&(j>0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i<j;i++)f=c(a[i],i,d),f!=null&&(h[h.length]=f);else for(g in a)f=c(a[g],g,d),f!=null&&(h[h.length]=f);return h.concat.apply([],h)},guid:1,proxy:function(a,c){if(typeof c==\"string\"){var d=a[c];c=a,a=d}if(!e.isFunction(a))return b;var f=F.call(arguments,2),g=function(){return a.apply(c,f.concat(F.call(arguments)))};g.guid=a.guid=a.guid||g.guid||e.guid++;return g},access:function(a,c,d,f,g,h){var i=a.length;if(typeof c==\"object\"){for(var j in c)e.access(a,j,c[j],f,g,d);return a}if(d!==b){f=!h&&f&&e.isFunction(d);for(var k=0;k<i;k++)g(a[k],c,f?d.call(a[k],k,g(a[k],c)):d,h);return a}return i?g(a[0],c):b},now:function(){return(new Date).getTime()},uaMatch:function(a){a=a.toLowerCase();var b=r.exec(a)||s.exec(a)||t.exec(a)||a.indexOf(\"compatible\")<0&&u.exec(a)||[];return{browser:b[1]||\"\",version:b[2]||\"0\"}},sub:function(){function a(b,c){return new a.fn.init(b,c)}e.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.sub=this.sub,a.fn.init=function(d,f){f&&f instanceof e&&!(f instanceof a)&&(f=a(f));return e.fn.init.call(this,d,f,b)},a.fn.init.prototype=a.fn;var b=a(c);return a},browser:{}}),e.each(\"Boolean Number String Function Array Date RegExp Object\".split(\" \"),function(a,b){I[\"[object \"+b+\"]\"]=b.toLowerCase()}),z=e.uaMatch(y),z.browser&&(e.browser[z.browser]=!0,e.browser.version=z.version),e.browser.webkit&&(e.browser.safari=!0),j.test(\" \")&&(k=/^[\\s\\xA0]+/,l=/[\\s\\xA0]+$/),h=e(c),c.addEventListener?B=function(){c.removeEventListener(\"DOMContentLoaded\",B,!1),e.ready()}:c.attachEvent&&(B=function(){c.readyState===\"complete\"&&(c.detachEvent(\"onreadystatechange\",B),e.ready())});return e}(),g={};f.Callbacks=function(a){a=a?g[a]||h(a):{};var c=[],d=[],e,i,j,k,l,m=function(b){var d,e,g,h,i;for(d=0,e=b.length;d<e;d++)g=b[d],h=f.type(g),h===\"array\"?m(g):h===\"function\"&&(!a.unique||!o.has(g))&&c.push(g)},n=function(b,f){f=f||[],e=!a.memory||[b,f],i=!0,l=j||0,j=0,k=c.length;for(;c&&l<k;l++)if(c[l].apply(b,f)===!1&&a.stopOnFalse){e=!0;break}i=!1,c&&(a.once?e===!0?o.disable():c=[]:d&&d.length&&(e=d.shift(),o.fireWith(e[0],e[1])))},o={add:function(){if(c){var a=c.length;m(arguments),i?k=c.length:e&&e!==!0&&(j=a,n(e[0],e[1]))}return this},remove:function(){if(c){var b=arguments,d=0,e=b.length;for(;d<e;d++)for(var f=0;f<c.length;f++)if(b[d]===c[f]){i&&f<=k&&(k--,f<=l&&l--),c.splice(f--,1);if(a.unique)break}}return this},has:function(a){if(c){var b=0,d=c.length;for(;b<d;b++)if(a===c[b])return!0}return!1},empty:function(){c=[];return this},disable:function(){c=d=e=b;return this},disabled:function(){return!c},lock:function(){d=b,(!e||e===!0)&&o.disable();return this},locked:function(){return!d},fireWith:function(b,c){d&&(i?a.once||d.push([b,c]):(!a.once||!e)&&n(b,c));return this},fire:function(){o.fireWith(this,arguments);return this},fired:function(){return!!e}};return o};var i=[].slice;f.extend({Deferred:function(a){var b=f.Callbacks(\"once memory\"),c=f.Callbacks(\"once memory\"),d=f.Callbacks(\"memory\"),e=\"pending\",g={resolve:b,reject:c,notify:d},h={done:b.add,fail:c.add,progress:d.add,state:function(){return e},isResolved:b.fired,isRejected:c.fired,then:function(a,b,c){i.done(a).fail(b).progress(c);return this},always:function(){i.done.apply(i,arguments).fail.apply(i,arguments);return this},pipe:function(a,b,c){return f.Deferred(function(d){f.each({done:[a,\"resolve\"],fail:[b,\"reject\"],progress:[c,\"notify\"]},function(a,b){var c=b[0],e=b[1],g;f.isFunction(c)?i[a](function()\n"
-"{g=c.apply(this,arguments),g&&f.isFunction(g.promise)?g.promise().then(d.resolve,d.reject,d.notify):d[e+\"With\"](this===i?d:this,[g])}):i[a](d[e])})}).promise()},promise:function(a){if(a==null)a=h;else for(var b in h)a[b]=h[b];return a}},i=h.promise({}),j;for(j in g)i[j]=g[j].fire,i[j+\"With\"]=g[j].fireWith;i.done(function(){e=\"resolved\"},c.disable,d.lock).fail(function(){e=\"rejected\"},b.disable,d.lock),a&&a.call(i,i);return i},when:function(a){function m(a){return function(b){e[a]=arguments.length>1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c<d;c++)b[c]&&b[c].promise&&f.isFunction(b[c].promise)?b[c].promise().then(l(c),j.reject,m(c)):--g;g||j.resolveWith(j,b)}else j!==a&&j.resolveWith(j,d?[a]:[]);return k}}),f.support=function(){var b,d,e,g,h,i,j,k,l,m,n,o,p,q=c.createElement(\"div\"),r=c.documentElement;q.setAttribute(\"className\",\"t\"),q.innerHTML=\"   <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>\",d=q.getElementsByTagName(\"*\"),e=q.getElementsByTagName(\"a\")[0];if(!d||!d.length||!e)return{};g=c.createElement(\"select\"),h=g.appendChild(c.createElement(\"option\")),i=q.getElementsByTagName(\"input\")[0],b={leadingWhitespace:q.firstChild.nodeType===3,tbody:!q.getElementsByTagName(\"tbody\").length,htmlSerialize:!!q.getElementsByTagName(\"link\").length,style:/top/.test(e.getAttribute(\"style\")),hrefNormalized:e.getAttribute(\"href\")===\"/a\",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value===\"on\",optSelected:h.selected,getSetAttribute:q.className!==\"t\",enctype:!!c.createElement(\"form\").enctype,html5Clone:c.createElement(\"nav\").cloneNode(!0).outerHTML!==\"<:nav></:nav>\",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete q.test}catch(s){b.deleteExpando=!1}!q.addEventListener&&q.attachEvent&&q.fireEvent&&(q.attachEvent(\"onclick\",function(){b.noCloneEvent=!1}),q.cloneNode(!0).fireEvent(\"onclick\")),i=c.createElement(\"input\"),i.value=\"t\",i.setAttribute(\"type\",\"radio\"),b.radioValue=i.value===\"t\",i.setAttribute(\"checked\",\"checked\"),q.appendChild(i),k=c.createDocumentFragment(),k.appendChild(q.lastChild),b.checkClone=k.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,k.removeChild(i),k.appendChild(q),q.innerHTML=\"\",a.getComputedStyle&&(j=c.createElement(\"div\"),j.style.width=\"0\",j.style.marginRight=\"0\",q.style.width=\"2px\",q.appendChild(j),b.reliableMarginRight=(parseInt((a.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0);if(q.attachEvent)for(o in{submit:1,change:1,focusin:1})n=\"on\"+o,p=n in q,p||(q.setAttribute(n,\"return;\"),p=typeof q[n]==\"function\"),b[o+\"Bubbles\"]=p;k.removeChild(q),k=g=h=j=q=i=null,f(function(){var a,d,e,g,h,i,j,k,m,n,o,r=c.getElementsByTagName(\"body\")[0];!r||(j=1,k=\"position:absolute;top:0;left:0;width:1px;height:1px;margin:0;\",m=\"visibility:hidden;border:0;\",n=\"style='\"+k+\"border:5px solid #000;padding:0;'\",o=\"<div \"+n+\"><div></div></div>\"+\"<table \"+n+\" cellpadding='0' cellspacing='0'>\"+\"<tr><td></td></tr></table>\",a=c.createElement(\"div\"),a.style.cssText=m+\"width:0;height:0;position:static;top:0;margin-top:\"+j+\"px\",r.insertBefore(a,r.firstChild),q=c.createElement(\"div\"),a.appendChild(q),q.innerHTML=\"<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>\",l=q.getElementsByTagName(\"td\"),p=l[0].offsetHeight===0,l[0].style.display=\"\",l[1].style.display=\"none\",b.reliableHiddenOffsets=p&&l[0].offsetHeight===0,q.innerHTML=\"\",q.style.width=q.style.paddingLeft=\"1px\",f.boxModel=b.boxModel=q.offsetWidth===2,typeof q.style.zoom!=\"undefined\"&&(q.style.display=\"inline\",q.style.zoom=1,b.inlineBlockNeedsLayout=q.offsetWidth===2,q.style.display=\"\",q.innerHTML=\"<div style='width:4px;'></div>\",b.shrinkWrapBlocks=q.offsetWidth!==2),q.style.cssText=k+m,q.innerHTML=o,d=q.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,i={doesNotAddBorder:e.offsetTop!==5,doesAddBorderForTableAndCells:h.offsetTop===5},e.style.position=\"fixed\",e.style.top=\"20px\",i.fixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top=\"\",d.style.overflow=\"hidden\",d.style.position=\"relative\",i.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,i.doesNotIncludeMarginInBodyOffset=r.offsetTop!==j,r.removeChild(a),q=a=null,f.extend(b,i))});return b}();var j=/^(?:\\{.*\\}|\\[.*\\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:\"jQuery\"+(f.fn.jquery+Math.random()).replace(/\\D/g,\"\"),noData:{embed:!0,object:\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c==\"string\",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c===\"events\";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c==\"object\"||typeof c==\"function\")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(\" \")));for(e=0,g=b.length;e<g;e++)delete d[b[e]];if(!(c?m:f.isEmptyObject)(d))return}}if(!c){delete j[k].data;if(!m(j[k]))return}f.support.deleteExpando||!j.setInterval?delete j[k]:j[k]=null,i&&(f.support.deleteExpando?delete a[h]:a.removeAttribute?a.removeAttribute(h):a[h]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute(\"classid\")===b}return!0}}),f.fn.extend({data:function(a,c){var d,e,g,h=null;if(typeof a==\"undefined\"){if(this.length){h=f.data(this[0]);if(this[0].nodeType===1&&!f._data(this[0],\"parsedAttrs\")){e=this[0].attributes;for(var i=0,j=e.length;i<j;i++)g=e[i].name,g.indexOf(\"data-\")===0&&(g=f.camelCase(g.substring(5)),l(this[0],g,h[g]));f._data(this[0],\"parsedAttrs\",!0)}}return h}if(typeof a==\"object\")return this.each(function(){f.data(this,a)});d=a.split(\".\"),d[1]=d[1]?\".\"+d[1]:\"\";if(c===b){h=this.triggerHandler(\"getData\"+d[1]+\"!\",[d[0]]),h===b&&this.length&&(h=f.data(this[0],a),h=l(this[0],a,h));return h===b&&d[1]?this.data(d[0]):h}return this.each(function(){var b=f(this),e=[d[0],c];b.triggerHandler(\"setData\"+d[1]+\"!\",e),f.data(this,a,c),b.triggerHandler(\"changeData\"+d[1]+\"!\",e)})},removeData:function(a){return this.each(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,b){a&&(b=(b||\"fx\")+\"mark\",f._data(a,b,(f._data(a,b)||0)+1))},_unmark:function(a,b,c){a!==!0&&(c=b,b=a,a=!1);if(b){c=c||\"fx\";var d=c+\"mark\",e=a?0:(f._data(b,d)||1)-1;e?f._data(b,d,e):(f.removeData(b,d,!0),n(b,c,\"mark\"))}},queue:function(a,b,c){var d;if(a){b=(b||\"fx\")+\"queue\",d=f._data(a,b),c&&(!d||f.isArray(c)?d=f._data(a,b,f.makeArray(c)):d.push(c));return d||[]}},dequeue:function(a,b){b=b||\"fx\";var c=f.queue(a,b),d=c.shift(),e={};d===\"inprogress\"&&(d=c.shift()),d&&(b===\"fx\"&&c.unshift(\"inprogress\"),f._data(a,b+\".run\",e),d.call(a,function(){f.dequeue(a,b)},e)),c.length||(f.removeData(a,b+\"queue \"+b+\".run\",!0),n(a,b,\"queue\"))}}),f.fn.extend({queue:function(a,c){typeof a!=\"string\"&&(c=a,a=\"fx\");if(c===b)return f.queue(this[0],a);return this.each(function(){var b=f.queue(this,a,c);a===\"fx\"&&b[0]!==\"inprogress\"&&f.dequeue(this,a)})},dequeue:function(a){return this.each(function(){f.dequeue(this,a)})},delay:function(a,b){a=f.fx?f.fx.speeds[a]||a:a,b=b||\"fx\";return this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},clearQueue:function(a){return this.queue(a||\"fx\",[])},promise:function(a,c){function m(){--h||d.resolveWith(e,[e])}typeof a!=\"string\"&&(c=a,a=b),a=a||\"fx\";var d=f.Deferred(),e=this,g=e.length,h=1,i=a+\"defer\",j=a+\"queue\",k=a+\"mark\",l;while(g--)if(l=f.data(e[g],i,b,!0)||(f.data(e[g],j,b,!0)||f.data(e[g],k,b,!0))&&f.data(e[g],i,f.Callbacks(\"once memory\"),!0))h++,l.add(m);m();return d.promise()}});var o=/[\\n\\t\\r]/g,p=/\\s+/,q=/\\r/g,r=/^(?:button|input)$/i,s=/^(?:button|input|object|select|textarea)$/i,t=/^a(?:rea)?$/i,u=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,v=f.support.getSetAttribute,w,x,y;f.fn.extend({attr:function(a,b){return f.access(this,a,b,!0,f.attr)},removeAttr:function(a){return this.each(function(){f.removeAttr(this,a)})},prop:function(a,b){return f.access(this,a,b,!0,f.prop)},removeProp:function(a){a=f.propFix[a]||a;return this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,g,h,i;if(f.isFunction(a))return this.each(function(b){f(this).addClass(a.call(this,b,this.className))});if(a&&typeof a==\"string\"){b=a.split(p);for(c=0,d=this.length;c<d;c++){e=this[c];if(e.nodeType===1)if(!e.className&&b.length===1)e.className=a;else{g=\" \"+e.className+\" \";for(h=0,i=b.length;h<i;h++)~g.indexOf(\" \"+b[h]+\" \")||(g+=b[h]+\" \");e.className=f.trim(g)}}}return this},removeClass:function(a){var c,d,e,g,h,i,j;if(f.isFunction(a))return this.each(function(b){f(this).removeClass(a.call(this,b,this.className))});if(a&&typeof a==\"string\"||a===b){c=(a||\"\").split(p);for(d=0,e=this.length;d<e;d++){g=this[d];if(g.nodeType===1&&g.className)if(a){h=(\" \"+g.className+\" \").replace(o,\" \");for(i=0,j=c.length;i<j;i++)h=h.replace(\" \"+c[i]+\" \",\" \");g.className=f.trim(h)}else g.className=\"\"}}return this},toggleClass:function(a,b){var c=typeof a,d=typeof b==\"boolean\";if(f.isFunction(a))return this.each(function(c){f(this).toggleClass(a.call(this,c,this.className,b),b)});return this.each(function(){if(c===\"string\"){var e,g=0,h=f(this),i=b,j=a.split(p);while(e=j[g++])i=d?i:!h.hasClass(e),h[i?\"addClass\":\"removeClass\"](e)}else if(c===\"undefined\"||c===\"boolean\")this.className&&f._data(this,\"__className__\",this.className),this.className=this.className||a===!1?\"\":f._data(this,\"__className__\")||\"\"})},hasClass:function(a){var b=\" \"+a+\" \",c=0,d=this.length;for(;c<d;c++)if(this[c].nodeType===1&&(\" \"+this[c].className+\" \").replace(o,\" \").indexOf(b)>-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h=\"\":typeof h==\"number\"?h+=\"\":f.isArray(h)&&(h=f.map(h,function(a){return a==null?\"\":a+\"\"})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!(\"set\"in c)||c.set(this,h,\"value\")===b)this.value=h}})}if(g){c=f.valHooks[g.nodeName.toLowerCase()]||f.valHooks[g.type];if(c&&\"get\"in c&&(d=c.get(g,\"value\"))!==b)return d;d=g.value;return typeof d==\"string\"?d.replace(q,\"\"):d==null?\"\":d}}}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type===\"select-one\";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c<d;c++){e=i[c];if(e.selected&&(f.support.optDisabled?!e.disabled:e.getAttribute(\"disabled\")===null)&&(!e.parentNode.disabled||!f.nodeName(e.parentNode,\"optgroup\"))){b=f(e).val();if(j)return b;h.push(b)}}if(j&&!h.length&&i.length)return f(i[g]).val();return h},set:function(a,b){var c=f.makeArray(b);f(a).find(\"option\").each(function(){this.selected=f.inArray(f(this).val(),c)>=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a)[c](d);if(typeof a.getAttribute==\"undefined\")return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return}if(h&&\"set\"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,\"\"+d);return d}if(h&&\"get\"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;h<g;h++)e=d[h],e&&(c=f.propFix[e]||e,f.attr(a,e,\"\"),a.removeAttribute(v?e:c),u.test(e)&&c in a&&(a[c]=!1))}},attrHooks:{type:{set:function(a,b){if(r.test(a.nodeName)&&a.parentNode)f.error(\"type property can't be changed\");else if(!f.support.radioValue&&b===\"radio\"&&f.nodeName(a,\"input\")){var c=a.value;a.setAttribute(\"type\",b),c&&(a.value=c);return b}}},value:{get:function(a,b){if(w&&f.nodeName(a,\"button\"))return w.get(a,b);return b in a?a.value:null},set:function(a,b,c){if(w&&f.nodeName(a,\"button\"))return w.set(a,b,c);a.value=b}}},propFix:{tabindex:\"tabIndex\",readonly:\"readOnly\",\"for\":\"htmlFor\",\"class\":\"className\",maxlength:\"maxLength\",cellspacing:\"cellSpacing\",cellpadding:\"cellPadding\",rowspan:\"rowSpan\",colspan:\"colSpan\",usemap:\"useMap\",frameborder:\"frameBorder\",contenteditable:\"contentEditable\"},prop:function(a,c,d){var e,g,h,i=a.nodeType;if(!!a&&i!==3&&i!==8&&i!==2){h=i!==1||!f.isXMLDoc(a),h&&(c=f.propFix[c]||c,g=f.propHooks[c]);return d!==b?g&&\"set\"in g&&(e=g.set(a,d,c))!==b?e:a[c]=d:g&&\"get\"in g&&(e=g.get(a,c))!==null?e:a[c]}},propHooks:{tabIndex:{get:function(a){var c=a.getAttributeNode(\"tabindex\");return c&&c.specified?parseInt(c.value,10):s.test(a.nodeName)||t.test(a.nodeName)&&a.href?0:b}}}}),f.attrHooks.tabindex=f.propHooks.tabIndex,x={get:function(a,c){var d,e=f.prop(a,c);return e===!0||typeof e!=\"boolean\"&&(d=a.getAttributeNode(c))&&d.nodeValue!==!1?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase()));return c}},v||(y={name:!0,id:!0},w=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&(y[c]?d.nodeValue!==\"\":d.specified)?d.nodeValue:b},set:function(a,b,d){var e=a.getAttributeNode(d);e||(e=c.createAttribute(d),a.setAttributeNode(e));return e.nodeValue=b+\"\"}},f.attrHooks.tabindex.set=w.set,f.each([\"width\",\"height\"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===\"\"){a.setAttribute(b,\"auto\");return c}}})}),f.attrHooks.contenteditable={get:w.get,set:function(a,b,c){b===\"\"&&(b=\"false\"),w.set(a,b,c)}}),f.support.hrefNormalized||f.each([\"href\",\"src\",\"width\",\"height\"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=\"\"+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex);return null}})),f.support.enctype||(f.propFix.enctype=\"encoding\"),f.support.checkOn||f.each([\"radio\",\"checkbox\"],function(){f.valHooks[this]={get:function(a){return a.getAttribute(\"value\")===null?\"on\":a.value}}}),f.each([\"radio\",\"checkbox\"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\\.]*)?(?:\\.(.+))?$/,B=/\\bhover(\\.\\S+)?\\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\\w*)(?:#([\\w\\-]+))?(?:\\.([\\w\\-]+))?$/,G=function(a){var b=F.exec(a);b&&(b[1]=(b[1]||\"\").toLowerCase(),b[3]=b[3]&&new RegExp(\"(?:^|\\\\s)\"+b[3]+\"(?:\\\\s|$)\"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c[\"class\"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,\"mouseenter$1 mouseleave$1\")};\n"
+"/*!\n"
+" * jQuery JavaScript Library v1.7.1\n"
+" * http://jquery.com/\n"
+" *\n"
+" * Copyright 2011, John Resig\n"
+" * Dual licensed under the MIT or GPL Version 2 licenses.\n"
+" * http://jquery.org/license\n"
+" *\n"
+" * Includes Sizzle.js\n"
+" * http://sizzlejs.com/\n"
+" * Copyright 2011, The Dojo Foundation\n"
+" * Released under the MIT, BSD, and GPL Licenses.\n"
+" *\n"
+" * Date: Mon Nov 21 21:11:03 2011 -0500\n"
+" */\n"
+"(function(bb,L){var av=bb.document,bu=bb.navigator,bl=bb.location;var b=(function(){var bF=function(b0,b1){return new bF.fn.init(b0,b1,bD)},bU=bb.jQuery,bH=bb.$,bD,bY=/^(?:[^#<]*(<[\\w\\W]+>)[^>]*$|#([\\w\\-]*)$)/,bM=/\\S/,bI=/^\\s+/,bE=/\\s+$/,bA=/^<(\\w+)\\s*\\/?>(?:<\\/\\1>)?$/,bN=/^[\\],:{}\\s]*$/,bW=/\\\\(?:[\"\\\\\\/bfnrt]|u[0-9a-fA-F]{4})/g,bP=/\"[^\"\\\\\\n\\r]*\"|true|false|null|-?\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?/g,bJ=/(?:^|:|,)(?:\\s*\\[)+/g,by=/(webkit)[ \\/]([\\w.]+)/,bR=/(opera)(?:.*version)?[ \\/]([\\w.]+)/,bQ=/(msie) ([\\w.]+)/,bS=/(mozilla)(?:.*? rv:([\\w.]+))?/,bB=/-([a-z]|[0-9])/ig,bZ=/^-ms-/,bT=function(b0,b1){return(b1+\"\").toUpperCase()},bX=bu.userAgent,bV,bC,e,bL=Object.prototype.toString,bG=Object.prototype.hasOwnProperty,bz=Array.prototype.push,bK=Array.prototype.slice,bO=String.prototype.trim,bv=Array.prototype.indexOf,bx={};bF.fn=bF.prototype={constructor:bF,init:function(b0,b4,b3){var b2,b5,b1,b6;if(!b0){return this}if(b0.nodeType){this.context=this[0]=b0;this.length=1;return this}if(b0===\"body\"&&!b4&&av.body){this.context=av;this[0]=av.body;this.selector=b0;this.length=1;return this}if(typeof b0===\"string\"){if(b0.charAt(0)===\"<\"&&b0.charAt(b0.length-1)===\">\"&&b0.length>=3){b2=[null,b0,null]}else{b2=bY.exec(b0)}if(b2&&(b2[1]||!b4)){if(b2[1]){b4=b4 instanceof bF?b4[0]:b4;b6=(b4?b4.ownerDocument||b4:av);b1=bA.exec(b0);if(b1){if(bF.isPlainObject(b4)){b0=[av.createElement(b1[1])];bF.fn.attr.call(b0,b4,true)}else{b0=[b6.createElement(b1[1])]}}else{b1=bF.buildFragment([b2[1]],[b6]);b0=(b1.cacheable?bF.clone(b1.fragment):b1.fragment).childNodes}return bF.merge(this,b0)}else{b5=av.getElementById(b2[2]);if(b5&&b5.parentNode){if(b5.id!==b2[2]){return b3.find(b0)}this.length=1;this[0]=b5}this.context=av;this.selector=b0;return this}}else{if(!b4||b4.jquery){return(b4||b3).find(b0)}else{return this.constructor(b4).find(b0)}}}else{if(bF.isFunction(b0)){return b3.ready(b0)}}if(b0.selector!==L){this.selector=b0.selector;this.context=b0.context}return bF.makeArray(b0,this)},selector:\"\",jquery:\"1.7.1\",length:0,size:function(){return this.length},toArray:function(){return bK.call(this,0)},get:function(b0){return b0==null?this.toArray():(b0<0?this[this.length+b0]:this[b0])},pushStack:function(b1,b3,b0){var b2=this.constructor();if(bF.isArray(b1)){bz.apply(b2,b1)}else{bF.merge(b2,b1)}b2.prevObject=this;b2.context=this.context;if(b3===\"find\"){b2.selector=this.selector+(this.selector?\" \":\"\")+b0}else{if(b3){b2.selector=this.selector+\".\"+b3+\"(\"+b0+\")\"}}return b2},each:function(b1,b0){return bF.each(this,b1,b0)},ready:function(b0){bF.bindReady();bC.add(b0);return this},eq:function(b0){b0=+b0;return b0===-1?this.slice(b0):this.slice(b0,b0+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(bK.apply(this,arguments),\"slice\",bK.call(arguments).join(\",\"))},map:function(b0){return this.pushStack(bF.map(this,function(b2,b1){return b0.call(b2,b1,b2)}))},end:function(){return this.prevObject||this.constructor(null)},push:bz,sort:[].sort,splice:[].splice};bF.fn.init.prototype=bF.fn;bF.extend=bF.fn.extend=function(){var b9,b2,b0,b1,b6,b7,b5=arguments[0]||{},b4=1,b3=arguments.length,b8=false;if(typeof b5===\"boolean\"){b8=b5;b5=arguments[1]||{};b4=2}if(typeof b5!==\"object\"&&!bF.isFunction(b5)){b5={}}if(b3===b4){b5=this;--b4}for(;b4<b3;b4++){if((b9=arguments[b4])!=null){for(b2 in b9){b0=b5[b2];b1=b9[b2];if(b5===b1){continue}if(b8&&b1&&(bF.isPlainObject(b1)||(b6=bF.isArray(b1)))){if(b6){b6=false;b7=b0&&bF.isArray(b0)?b0:[]}else{b7=b0&&bF.isPlainObject(b0)?b0:{}}b5[b2]=bF.extend(b8,b7,b1)}else{if(b1!==L){b5[b2]=b1}}}}}return b5};bF.extend({noConflict:function(b0){if(bb.$===bF){bb.$=bH}if(b0&&bb.jQuery===bF){bb.jQuery=bU}return bF},isReady:false,readyWait:1,holdReady:function(b0){if(b0){bF.readyWait++}else{bF.ready(true)}},ready:function(b0){if((b0===true&&!--bF.readyWait)||(b0!==true&&!bF.isReady)){if(!av.body){return setTimeout(bF.ready,1)}bF.isReady=true;if(b0!==true&&--bF.readyWait>0){return}bC.fireWith(av,[bF]);if(bF.fn.trigger){bF(av).trigger(\"ready\").off(\"ready\")}}},bindReady:function(){if(bC){return}bC=bF.Callbacks(\"once memory\");if(av.readyState===\"complete\"){return setTimeout(bF.ready,1)}if(av.addEventListener){av.addEventListener(\"DOMContentLoaded\",e,false);bb.addEventListener(\"load\",bF.ready,false)}else{if(av.attachEvent){av.attachEvent(\"onreadystatechange\",e);bb.attachEvent(\"onload\",bF.ready);var b0=false;try{b0=bb.frameElement==null}catch(b1){}if(av.documentElement.doScroll&&b0){bw()}}}},isFunction:function(b0){return bF.type(b0)===\"function\"},isArray:Array.isArray||function(b0){return bF.type(b0)===\"array\"},isWindow:function(b0){return b0&&typeof b0===\"object\"&&\"setInterval\" in b0},isNumeric:function(b0){return !isNaN(parseFloat(b0))&&isFinite(b0)},type:function(b0){return b0==null?String(b0):bx[bL.call(b0)]||\"object\"},isPlainObject:function(b2){if(!b2||bF.type(b2)!==\"object\"||b2.nodeType||bF.isWindow(b2)){return false}try{if(b2.constructor&&!bG.call(b2,\"constructor\")&&!bG.call(b2.constructor.prototype,\"isPrototypeOf\")){return false}}catch(b1){return false}var b0;for(b0 in b2){}return b0===L||bG.call(b2,b0)},isEmptyObject:function(b1){for(var b0 in b1){return false}return true},error:function(b0){throw new Error(b0)},parseJSON:function(b0){if(typeof b0!==\"string\"||!b0){return null}b0=bF.trim(b0);if(bb.JSON&&bb.JSON.parse){return bb.JSON.parse(b0)}if(bN.test(b0.replace(bW,\"@\").replace(bP,\"]\").replace(bJ,\"\"))){return(new Function(\"return \"+b0))()}bF.error(\"Invalid JSON: \"+b0)},parseXML:function(b2){var b0,b1;try{if(bb.DOMParser){b1=new DOMParser();b0=b1.parseFromString(b2,\"text/xml\")}else{b0=new ActiveXObject(\"Microsoft.XMLDOM\");b0.async=\"false\";b0.loadXML(b2)}}catch(b3){b0=L}if(!b0||!b0.documentElement||b0.getElementsByTagName(\"parsererror\").length){bF.error(\"Invalid XML: \"+b2)}return b0},noop:function(){},globalEval:function(b0){if(b0&&bM.test(b0)){(bb.execScript||function(b1){bb[\"eval\"].call(bb,b1)})(b0)}},camelCase:function(b0){return b0.replace(bZ,\"ms-\").replace(bB,bT)},nodeName:function(b1,b0){return b1.nodeName&&b1.nodeName.toUpperCase()===b0.toUpperCase()},each:function(b3,b6,b2){var b1,b4=0,b5=b3.length,b0=b5===L||bF.isFunction(b3);if(b2){if(b0){for(b1 in b3){if(b6.apply(b3[b1],b2)===false){break}}}else{for(;b4<b5;){if(b6.apply(b3[b4++],b2)===false){break}}}}else{if(b0){for(b1 in b3){if(b6.call(b3[b1],b1,b3[b1])===false){break}}}else{for(;b4<b5;){if(b6.call(b3[b4],b4,b3[b4++])===false){break}}}}return b3},trim:bO?function(b0){return b0==null?\"\":bO.call(b0)}:function(b0){return b0==null?\"\":b0.toString().replace(bI,\"\").replace(bE,\"\")},makeArray:function(b3,b1){var b0=b1||[];if(b3!=null){var b2=bF.type(b3);if(b3.length==null||b2===\"string\"||b2===\"function\"||b2===\"regexp\"||bF.isWindow(b3)){bz.call(b0,b3)}else{bF.merge(b0,b3)}}return b0},inArray:function(b2,b3,b1){var b0;if(b3){if(bv){return bv.call(b3,b2,b1)}b0=b3.length;b1=b1?b1<0?Math.max(0,b0+b1):b1:0;for(;b1<b0;b1++){if(b1 in b3&&b3[b1]===b2){return b1}}}return -1},merge:function(b4,b2){var b3=b4.length,b1=0;if(typeof b2.length===\"number\"){for(var b0=b2.length;b1<b0;b1++){b4[b3++]=b2[b1]}}else{while(b2[b1]!==L){b4[b3++]=b2[b1++]}}b4.length=b3;return b4},grep:function(b1,b6,b0){var b2=[],b5;b0=!!b0;for(var b3=0,b4=b1.length;b3<b4;b3++){b5=!!b6(b1[b3],b3);if(b0!==b5){b2.push(b1[b3])}}return b2},map:function(b0,b7,b8){var b5,b6,b4=[],b2=0,b1=b0.length,b3=b0 instanceof bF||b1!==L&&typeof b1===\"number\"&&((b1>0&&b0[0]&&b0[b1-1])||b1===0||bF.isArray(b0));if(b3){for(;b2<b1;b2++){b5=b7(b0[b2],b2,b8);if(b5!=null){b4[b4.length]=b5}}}else{for(b6 in b0){b5=b7(b0[b6],b6,b8);if(b5!=null){b4[b4.length]=b5}}}return b4.concat.apply([],b4)},guid:1,proxy:function(b4,b3){if(typeof b3===\"string\"){var b2=b4[b3];b3=b4;b4=b2}if(!bF.isFunction(b4)){return L}var b0=bK.call(arguments,2),b1=function(){return b4.apply(b3,b0.concat(bK.call(arguments)))};b1.guid=b4.guid=b4.guid||b1.guid||bF.guid++;return b1},access:function(b0,b8,b6,b2,b5,b7){var b1=b0.length;if(typeof b8===\"object\"){for(var b3 in b8){bF.access(b0,b3,b8[b3],b2,b5,b6)}return b0}if(b6!==L){b2=!b7&&b2&&bF.isFunction(b6);for(var b4=0;b4<b1;b4++){b5(b0[b4],b8,b2?b6.call(b0[b4],b4,b5(b0[b4],b8)):b6,b7)}return b0}return b1?b5(b0[0],b8):L},now:function(){return(new Date()).getTime()},uaMatch:function(b1){b1=b1.toLowerCase();var b0=by.exec(b1)||bR.exec(b1)||bQ.exec(b1)||b1.indexOf(\"compatible\")<0&&bS.exec(b1)||[];return{browser:b0[1]||\"\",version:b0[2]||\"0\"}},sub:function(){function b0(b3,b4){return new b0.fn.init(b3,b4)}bF.extend(true,b0,this);b0.superclass=this;b0.fn=b0.prototype=this();b0.fn.constructor=b0;b0.sub=this.sub;b0.fn.init=function b2(b3,b4){if(b4&&b4 instanceof bF&&!(b4 instanceof b0)){b4=b0(b4)}return bF.fn.init.call(this,b3,b4,b1)};b0.fn.init.prototype=b0.fn;var b1=b0(av);return b0},browser:{}});bF.each(\"Boolean Number String Function Array Date RegExp Object\".split(\" \"),function(b1,b0){bx[\"[object \"+b0+\"]\"]=b0.toLowerCase()});bV=bF.uaMatch(bX);if(bV.browser){bF.browser[bV.browser]=true;bF.browser.version=bV.version}if(bF.browser.webkit){bF.browser.safari=true}if(bM.test(\"\\xA0\")){bI=/^[\\s\\xA0]+/;bE=/[\\s\\xA0]+$/}bD=bF(av);if(av.addEventListener){e=function(){av.removeEventListener(\"DOMContentLoaded\",e,false);bF.ready()}}else{if(av.attachEvent){e=function(){if(av.readyState===\"complete\"){av.detachEvent(\"onreadystatechange\",e);bF.ready()}}}}function bw(){if(bF.isReady){return}try{av.documentElement.doScroll(\"left\")}catch(b0){setTimeout(bw,1);return}bF.ready()}return bF})();var a2={};function X(e){var bv=a2[e]={},bw,bx;e=e.split(/\\s+/);for(bw=0,bx=e.length;bw<bx;bw++){bv[e[bw]]=true}return bv}b.Callbacks=function(bw){bw=bw?(a2[bw]||X(bw)):{};var bB=[],bC=[],bx,by,bv,bz,bA,bE=function(bF){var bG,bJ,bI,bH,bK;for(bG=0,bJ=bF.length;bG<bJ;bG++){bI=bF[bG];bH=b.type(bI);if(bH===\"array\"){bE(bI)}else{if(bH===\"function\"){if(!bw.unique||!bD.has(bI)){bB.push(bI)}}}}},e=function(bG,bF){bF=bF||[];bx=!bw.memory||[bG,bF];by=true;bA=bv||0;bv=0;bz=bB.length;for(;bB&&bA<bz;bA++){if(bB[bA].apply(bG,bF)===false&&bw.stopOnFalse){bx=true;break}}by=false;if(bB){if(!bw.once){if(bC&&bC.length){bx=bC.shift();bD.fireWith(bx[0],bx[1])}}else{if(bx===true){bD.disable()}else{bB=[]}}}},bD={add:function(){if(bB){var bF=bB.length;bE(arguments);if(by){bz=bB.length}else{if(bx&&bx!==true){bv=bF;e(bx[0],bx[1])}}}return this},remove:function(){if(bB){var bF=arguments,bH=0,bI=bF.length;for(;bH<bI;bH++){for(var bG=0;bG<bB.length;bG++){if(bF[bH]===bB[bG]){if(by){if(bG<=bz){bz--;if(bG<=bA){bA--}}}bB.splice(bG--,1);if(bw.unique){break}}}}}return this},has:function(bG){if(bB){var bF=0,bH=bB.length;for(;bF<bH;bF++){if(bG===bB[bF]){return true}}}return false},empty:function(){bB=[];return this},disable:function(){bB=bC=bx=L;return this},disabled:function(){return !bB},lock:function(){bC=L;if(!bx||bx===true){bD.disable()}return this},locked:function(){return !bC},fireWith:function(bG,bF){if(bC){if(by){if(!bw.once){bC.push([bG,bF])}}else{if(!(bw.once&&bx)){e(bG,bF)}}}return this},fire:function(){bD.fireWith(this,arguments);return this},fired:function(){return !!bx}};return bD};var aJ=[].slice;b.extend({Deferred:function(by){var bx=b.Callbacks(\"once memory\"),bw=b.Callbacks(\"once memory\"),bv=b.Callbacks(\"memory\"),e=\"pending\",bA={resolve:bx,reject:bw,notify:bv},bC={done:bx.add,fail:bw.add,progress:bv.add,state:function(){return e},isResolved:bx.fired,isRejected:bw.fired,then:function(bE,bD,bF){bB.done(bE).fail(bD).progress(bF);return this},always:function(){bB.done.apply(bB,arguments).fail.apply(bB,arguments);return this},pipe:function(bF,bE,bD){return b.Deferred(function(bG){b.each({done:[bF,\"resolve\"],fail:[bE,\"reject\"],progress:[bD,\"notify\"]},function(bI,bL){var bH=bL[0],bK=bL[1],bJ;if(b.isFunction(bH)){bB[bI](function(){bJ=bH.apply(this,arguments);if(bJ&&b.isFunction(bJ.promise)){bJ.promise().then(bG.resolve,bG.reject,bG.notify)}else{bG[bK+\"With\"](this===bB?bG:this,[bJ])}})}else{bB[bI](bG[bK])}})}).promise()},promise:function(bE){if(bE==null){bE=bC}else{for(var bD in bC){bE[bD]=bC[bD]}}return bE}},bB=bC.promise({}),bz;for(bz in bA){bB[bz]=bA[bz].fire;bB[bz+\"With\"]=bA[bz].fireWith}bB.done(function(){e=\"resolved\"},bw.disable,bv.lock).fail(function(){e=\"rejected\"},bx.disable,bv.lock);if(by){by.call(bB,bB)}return bB},when:function(bA){var bx=aJ.call(arguments,0),bv=0,e=bx.length,bB=new Array(e),bw=e,by=e,bC=e<=1&&bA&&b.isFunction(bA.promise)?bA:b.Deferred(),bE=bC.promise();function bD(bF){return function(bG){bx[bF]=arguments.length>1?aJ.call(arguments,0):bG;if(!(--bw)){bC.resolveWith(bC,bx)}}}function bz(bF){return function(bG){bB[bF]=arguments.length>1?aJ.call(arguments,0):bG;bC.notifyWith(bE,bB)}}if(e>1){for(;bv<e;bv++){if(bx[bv]&&bx[bv].promise&&b.isFunction(bx[bv].promise)){bx[bv].promise().then(bD(bv),bC.reject,bz(bv))\n"
+"}else{--bw}}if(!bw){bC.resolveWith(bC,bx)}}else{if(bC!==bA){bC.resolveWith(bC,e?[bA]:[])}}return bE}});b.support=(function(){var bJ,bI,bF,bG,bx,bE,bA,bD,bz,bK,bB,by,bw,bv=av.createElement(\"div\"),bH=av.documentElement;bv.setAttribute(\"className\",\"t\");bv.innerHTML=\"   <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>\";bI=bv.getElementsByTagName(\"*\");bF=bv.getElementsByTagName(\"a\")[0];if(!bI||!bI.length||!bF){return{}}bG=av.createElement(\"select\");bx=bG.appendChild(av.createElement(\"option\"));bE=bv.getElementsByTagName(\"input\")[0];bJ={leadingWhitespace:(bv.firstChild.nodeType===3),tbody:!bv.getElementsByTagName(\"tbody\").length,htmlSerialize:!!bv.getElementsByTagName(\"link\").length,style:/top/.test(bF.getAttribute(\"style\")),hrefNormalized:(bF.getAttribute(\"href\")===\"/a\"),opacity:/^0.55/.test(bF.style.opacity),cssFloat:!!bF.style.cssFloat,checkOn:(bE.value===\"on\"),optSelected:bx.selected,getSetAttribute:bv.className!==\"t\",enctype:!!av.createElement(\"form\").enctype,html5Clone:av.createElement(\"nav\").cloneNode(true).outerHTML!==\"<:nav></:nav>\",submitBubbles:true,changeBubbles:true,focusinBubbles:false,deleteExpando:true,noCloneEvent:true,inlineBlockNeedsLayout:false,shrinkWrapBlocks:false,reliableMarginRight:true};bE.checked=true;bJ.noCloneChecked=bE.cloneNode(true).checked;bG.disabled=true;bJ.optDisabled=!bx.disabled;try{delete bv.test}catch(bC){bJ.deleteExpando=false}if(!bv.addEventListener&&bv.attachEvent&&bv.fireEvent){bv.attachEvent(\"onclick\",function(){bJ.noCloneEvent=false});bv.cloneNode(true).fireEvent(\"onclick\")}bE=av.createElement(\"input\");bE.value=\"t\";bE.setAttribute(\"type\",\"radio\");bJ.radioValue=bE.value===\"t\";bE.setAttribute(\"checked\",\"checked\");bv.appendChild(bE);bD=av.createDocumentFragment();bD.appendChild(bv.lastChild);bJ.checkClone=bD.cloneNode(true).cloneNode(true).lastChild.checked;bJ.appendChecked=bE.checked;bD.removeChild(bE);bD.appendChild(bv);bv.innerHTML=\"\";if(bb.getComputedStyle){bA=av.createElement(\"div\");bA.style.width=\"0\";bA.style.marginRight=\"0\";bv.style.width=\"2px\";bv.appendChild(bA);bJ.reliableMarginRight=(parseInt((bb.getComputedStyle(bA,null)||{marginRight:0}).marginRight,10)||0)===0}if(bv.attachEvent){for(by in {submit:1,change:1,focusin:1}){bB=\"on\"+by;bw=(bB in bv);if(!bw){bv.setAttribute(bB,\"return;\");bw=(typeof bv[bB]===\"function\")}bJ[by+\"Bubbles\"]=bw}}bD.removeChild(bv);bD=bG=bx=bA=bv=bE=null;b(function(){var bM,bU,bV,bT,bN,bO,bL,bS,bR,e,bP,bQ=av.getElementsByTagName(\"body\")[0];if(!bQ){return}bL=1;bS=\"position:absolute;top:0;left:0;width:1px;height:1px;margin:0;\";bR=\"visibility:hidden;border:0;\";e=\"style='\"+bS+\"border:5px solid #000;padding:0;'\";bP=\"<div \"+e+\"><div></div></div><table \"+e+\" cellpadding='0' cellspacing='0'><tr><td></td></tr></table>\";bM=av.createElement(\"div\");bM.style.cssText=bR+\"width:0;height:0;position:static;top:0;margin-top:\"+bL+\"px\";bQ.insertBefore(bM,bQ.firstChild);bv=av.createElement(\"div\");bM.appendChild(bv);bv.innerHTML=\"<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>\";bz=bv.getElementsByTagName(\"td\");bw=(bz[0].offsetHeight===0);bz[0].style.display=\"\";bz[1].style.display=\"none\";bJ.reliableHiddenOffsets=bw&&(bz[0].offsetHeight===0);bv.innerHTML=\"\";bv.style.width=bv.style.paddingLeft=\"1px\";b.boxModel=bJ.boxModel=bv.offsetWidth===2;if(typeof bv.style.zoom!==\"undefined\"){bv.style.display=\"inline\";bv.style.zoom=1;bJ.inlineBlockNeedsLayout=(bv.offsetWidth===2);bv.style.display=\"\";bv.innerHTML=\"<div style='width:4px;'></div>\";bJ.shrinkWrapBlocks=(bv.offsetWidth!==2)}bv.style.cssText=bS+bR;bv.innerHTML=bP;bU=bv.firstChild;bV=bU.firstChild;bN=bU.nextSibling.firstChild.firstChild;bO={doesNotAddBorder:(bV.offsetTop!==5),doesAddBorderForTableAndCells:(bN.offsetTop===5)};bV.style.position=\"fixed\";bV.style.top=\"20px\";bO.fixedPosition=(bV.offsetTop===20||bV.offsetTop===15);bV.style.position=bV.style.top=\"\";bU.style.overflow=\"hidden\";bU.style.position=\"relative\";bO.subtractsBorderForOverflowNotVisible=(bV.offsetTop===-5);bO.doesNotIncludeMarginInBodyOffset=(bQ.offsetTop!==bL);bQ.removeChild(bM);bv=bM=null;b.extend(bJ,bO)});return bJ})();var aS=/^(?:\\{.*\\}|\\[.*\\])$/,aA=/([A-Z])/g;b.extend({cache:{},uuid:0,expando:\"jQuery\"+(b.fn.jquery+Math.random()).replace(/\\D/g,\"\"),noData:{embed:true,object:\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\",applet:true},hasData:function(e){e=e.nodeType?b.cache[e[b.expando]]:e[b.expando];return !!e&&!S(e)},data:function(bx,bv,bz,by){if(!b.acceptData(bx)){return}var bG,bA,bD,bE=b.expando,bC=typeof bv===\"string\",bF=bx.nodeType,e=bF?b.cache:bx,bw=bF?bx[bE]:bx[bE]&&bE,bB=bv===\"events\";if((!bw||!e[bw]||(!bB&&!by&&!e[bw].data))&&bC&&bz===L){return}if(!bw){if(bF){bx[bE]=bw=++b.uuid}else{bw=bE}}if(!e[bw]){e[bw]={};if(!bF){e[bw].toJSON=b.noop}}if(typeof bv===\"object\"||typeof bv===\"function\"){if(by){e[bw]=b.extend(e[bw],bv)}else{e[bw].data=b.extend(e[bw].data,bv)}}bG=bA=e[bw];if(!by){if(!bA.data){bA.data={}}bA=bA.data}if(bz!==L){bA[b.camelCase(bv)]=bz}if(bB&&!bA[bv]){return bG.events}if(bC){bD=bA[bv];if(bD==null){bD=bA[b.camelCase(bv)]}}else{bD=bA}return bD},removeData:function(bx,bv,by){if(!b.acceptData(bx)){return}var bB,bA,bz,bC=b.expando,bD=bx.nodeType,e=bD?b.cache:bx,bw=bD?bx[bC]:bC;if(!e[bw]){return}if(bv){bB=by?e[bw]:e[bw].data;if(bB){if(!b.isArray(bv)){if(bv in bB){bv=[bv]}else{bv=b.camelCase(bv);if(bv in bB){bv=[bv]}else{bv=bv.split(\" \")}}}for(bA=0,bz=bv.length;bA<bz;bA++){delete bB[bv[bA]]}if(!(by?S:b.isEmptyObject)(bB)){return}}}if(!by){delete e[bw].data;if(!S(e[bw])){return}}if(b.support.deleteExpando||!e.setInterval){delete e[bw]}else{e[bw]=null}if(bD){if(b.support.deleteExpando){delete bx[bC]}else{if(bx.removeAttribute){bx.removeAttribute(bC)}else{bx[bC]=null}}}},_data:function(bv,e,bw){return b.data(bv,e,bw,true)},acceptData:function(bv){if(bv.nodeName){var e=b.noData[bv.nodeName.toLowerCase()];if(e){return !(e===true||bv.getAttribute(\"classid\")!==e)}}return true}});b.fn.extend({data:function(by,bA){var bB,e,bw,bz=null;if(typeof by===\"undefined\"){if(this.length){bz=b.data(this[0]);if(this[0].nodeType===1&&!b._data(this[0],\"parsedAttrs\")){e=this[0].attributes;for(var bx=0,bv=e.length;bx<bv;bx++){bw=e[bx].name;if(bw.indexOf(\"data-\")===0){bw=b.camelCase(bw.substring(5));a5(this[0],bw,bz[bw])}}b._data(this[0],\"parsedAttrs\",true)}}return bz}else{if(typeof by===\"object\"){return this.each(function(){b.data(this,by)})}}bB=by.split(\".\");bB[1]=bB[1]?\".\"+bB[1]:\"\";if(bA===L){bz=this.triggerHandler(\"getData\"+bB[1]+\"!\",[bB[0]]);if(bz===L&&this.length){bz=b.data(this[0],by);bz=a5(this[0],by,bz)}return bz===L&&bB[1]?this.data(bB[0]):bz}else{return this.each(function(){var bC=b(this),bD=[bB[0],bA];bC.triggerHandler(\"setData\"+bB[1]+\"!\",bD);b.data(this,by,bA);bC.triggerHandler(\"changeData\"+bB[1]+\"!\",bD)})}},removeData:function(e){return this.each(function(){b.removeData(this,e)})}});function a5(bx,bw,by){if(by===L&&bx.nodeType===1){var bv=\"data-\"+bw.replace(aA,\"-$1\").toLowerCase();by=bx.getAttribute(bv);if(typeof by===\"string\"){try{by=by===\"true\"?true:by===\"false\"?false:by===\"null\"?null:b.isNumeric(by)?parseFloat(by):aS.test(by)?b.parseJSON(by):by}catch(bz){}b.data(bx,bw,by)}else{by=L}}return by}function S(bv){for(var e in bv){if(e===\"data\"&&b.isEmptyObject(bv[e])){continue}if(e!==\"toJSON\"){return false}}return true}function bi(by,bx,bA){var bw=bx+\"defer\",bv=bx+\"queue\",e=bx+\"mark\",bz=b._data(by,bw);if(bz&&(bA===\"queue\"||!b._data(by,bv))&&(bA===\"mark\"||!b._data(by,e))){setTimeout(function(){if(!b._data(by,bv)&&!b._data(by,e)){b.removeData(by,bw,true);bz.fire()}},0)}}b.extend({_mark:function(bv,e){if(bv){e=(e||\"fx\")+\"mark\";b._data(bv,e,(b._data(bv,e)||0)+1)}},_unmark:function(by,bx,bv){if(by!==true){bv=bx;bx=by;by=false}if(bx){bv=bv||\"fx\";var e=bv+\"mark\",bw=by?0:((b._data(bx,e)||1)-1);if(bw){b._data(bx,e,bw)}else{b.removeData(bx,e,true);bi(bx,bv,\"mark\")}}},queue:function(bv,e,bx){var bw;if(bv){e=(e||\"fx\")+\"queue\";bw=b._data(bv,e);if(bx){if(!bw||b.isArray(bx)){bw=b._data(bv,e,b.makeArray(bx))}else{bw.push(bx)}}return bw||[]}},dequeue:function(by,bx){bx=bx||\"fx\";var bv=b.queue(by,bx),bw=bv.shift(),e={};if(bw===\"inprogress\"){bw=bv.shift()}if(bw){if(bx===\"fx\"){bv.unshift(\"inprogress\")}b._data(by,bx+\".run\",e);bw.call(by,function(){b.dequeue(by,bx)},e)}if(!bv.length){b.removeData(by,bx+\"queue \"+bx+\".run\",true);bi(by,bx,\"queue\")}}});b.fn.extend({queue:function(e,bv){if(typeof e!==\"string\"){bv=e;e=\"fx\"}if(bv===L){return b.queue(this[0],e)}return this.each(function(){var bw=b.queue(this,e,bv);if(e===\"fx\"&&bw[0]!==\"inprogress\"){b.dequeue(this,e)}})},dequeue:function(e){return this.each(function(){b.dequeue(this,e)})},delay:function(bv,e){bv=b.fx?b.fx.speeds[bv]||bv:bv;e=e||\"fx\";return this.queue(e,function(bx,bw){var by=setTimeout(bx,bv);bw.stop=function(){clearTimeout(by)}})},clearQueue:function(e){return this.queue(e||\"fx\",[])},promise:function(bD,bw){if(typeof bD!==\"string\"){bw=bD;bD=L}bD=bD||\"fx\";var e=b.Deferred(),bv=this,by=bv.length,bB=1,bz=bD+\"defer\",bA=bD+\"queue\",bC=bD+\"mark\",bx;function bE(){if(!(--bB)){e.resolveWith(bv,[bv])}}while(by--){if((bx=b.data(bv[by],bz,L,true)||(b.data(bv[by],bA,L,true)||b.data(bv[by],bC,L,true))&&b.data(bv[by],bz,b.Callbacks(\"once memory\"),true))){bB++;bx.add(bE)}}bE();return e.promise()}});var aP=/[\\n\\t\\r]/g,af=/\\s+/,aU=/\\r/g,g=/^(?:button|input)$/i,D=/^(?:button|input|object|select|textarea)$/i,l=/^a(?:rea)?$/i,ao=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,F=b.support.getSetAttribute,be,aY,aF;b.fn.extend({attr:function(e,bv){return b.access(this,e,bv,true,b.attr)},removeAttr:function(e){return this.each(function(){b.removeAttr(this,e)})},prop:function(e,bv){return b.access(this,e,bv,true,b.prop)},removeProp:function(e){e=b.propFix[e]||e;return this.each(function(){try{this[e]=L;delete this[e]}catch(bv){}})},addClass:function(by){var bA,bw,bv,bx,bz,bB,e;if(b.isFunction(by)){return this.each(function(bC){b(this).addClass(by.call(this,bC,this.className))})}if(by&&typeof by===\"string\"){bA=by.split(af);for(bw=0,bv=this.length;bw<bv;bw++){bx=this[bw];if(bx.nodeType===1){if(!bx.className&&bA.length===1){bx.className=by}else{bz=\" \"+bx.className+\" \";for(bB=0,e=bA.length;bB<e;bB++){if(!~bz.indexOf(\" \"+bA[bB]+\" \")){bz+=bA[bB]+\" \"}}bx.className=b.trim(bz)}}}}return this},removeClass:function(bz){var bA,bw,bv,by,bx,bB,e;if(b.isFunction(bz)){return this.each(function(bC){b(this).removeClass(bz.call(this,bC,this.className))})}if((bz&&typeof bz===\"string\")||bz===L){bA=(bz||\"\").split(af);for(bw=0,bv=this.length;bw<bv;bw++){by=this[bw];if(by.nodeType===1&&by.className){if(bz){bx=(\" \"+by.className+\" \").replace(aP,\" \");for(bB=0,e=bA.length;bB<e;bB++){bx=bx.replace(\" \"+bA[bB]+\" \",\" \")}by.className=b.trim(bx)}else{by.className=\"\"}}}}return this},toggleClass:function(bx,bv){var bw=typeof bx,e=typeof bv===\"boolean\";if(b.isFunction(bx)){return this.each(function(by){b(this).toggleClass(bx.call(this,by,this.className,bv),bv)})}return this.each(function(){if(bw===\"string\"){var bA,bz=0,by=b(this),bB=bv,bC=bx.split(af);while((bA=bC[bz++])){bB=e?bB:!by.hasClass(bA);by[bB?\"addClass\":\"removeClass\"](bA)}}else{if(bw===\"undefined\"||bw===\"boolean\"){if(this.className){b._data(this,\"__className__\",this.className)}this.className=this.className||bx===false?\"\":b._data(this,\"__className__\")||\"\"}}})},hasClass:function(e){var bx=\" \"+e+\" \",bw=0,bv=this.length;for(;bw<bv;bw++){if(this[bw].nodeType===1&&(\" \"+this[bw].className+\" \").replace(aP,\" \").indexOf(bx)>-1){return true}}return false},val:function(bx){var e,bv,by,bw=this[0];if(!arguments.length){if(bw){e=b.valHooks[bw.nodeName.toLowerCase()]||b.valHooks[bw.type];if(e&&\"get\" in e&&(bv=e.get(bw,\"value\"))!==L){return bv}bv=bw.value;return typeof bv===\"string\"?bv.replace(aU,\"\"):bv==null?\"\":bv}return}by=b.isFunction(bx);return this.each(function(bA){var bz=b(this),bB;if(this.nodeType!==1){return}if(by){bB=bx.call(this,bA,bz.val())}else{bB=bx}if(bB==null){bB=\"\"}else{if(typeof bB===\"number\"){bB+=\"\"}else{if(b.isArray(bB)){bB=b.map(bB,function(bC){return bC==null?\"\":bC+\"\"})}}}e=b.valHooks[this.nodeName.toLowerCase()]||b.valHooks[this.type];if(!e||!(\"set\" in e)||e.set(this,bB,\"value\")===L){this.value=bB}})}});b.extend({valHooks:{option:{get:function(e){var bv=e.attributes.value;return !bv||bv.specified?e.value:e.text}},select:{get:function(e){var bA,bv,bz,bx,by=e.selectedIndex,bB=[],bC=e.options,bw=e.type===\"select-one\";if(by<0){return null}bv=bw?by:0;bz=bw?by+1:bC.length;for(;bv<bz;bv++){bx=bC[bv];if(bx.selected&&(b.support.optDisabled?!bx.disabled:bx.getAttribute(\"disabled\")===null)&&(!bx.parentNode.disabled||!b.nodeName(bx.parentNode,\"optgroup\"))){bA=b(bx).val();if(bw){return bA}bB.push(bA)}}if(bw&&!bB.length&&bC.length){return b(bC[by]).val()}return bB},set:function(bv,bw){var e=b.makeArray(bw);b(bv).find(\"option\").each(function(){this.selected=b.inArray(b(this).val(),e)>=0});if(!e.length){bv.selectedIndex=-1}return e}}},attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(bA,bx,bB,bz){var bw,e,by,bv=bA.nodeType;\n"
+"if(!bA||bv===3||bv===8||bv===2){return}if(bz&&bx in b.attrFn){return b(bA)[bx](bB)}if(typeof bA.getAttribute===\"undefined\"){return b.prop(bA,bx,bB)}by=bv!==1||!b.isXMLDoc(bA);if(by){bx=bx.toLowerCase();e=b.attrHooks[bx]||(ao.test(bx)?aY:be)}if(bB!==L){if(bB===null){b.removeAttr(bA,bx);return}else{if(e&&\"set\" in e&&by&&(bw=e.set(bA,bB,bx))!==L){return bw}else{bA.setAttribute(bx,\"\"+bB);return bB}}}else{if(e&&\"get\" in e&&by&&(bw=e.get(bA,bx))!==null){return bw}else{bw=bA.getAttribute(bx);return bw===null?L:bw}}},removeAttr:function(bx,bz){var by,bA,bv,e,bw=0;if(bz&&bx.nodeType===1){bA=bz.toLowerCase().split(af);e=bA.length;for(;bw<e;bw++){bv=bA[bw];if(bv){by=b.propFix[bv]||bv;b.attr(bx,bv,\"\");bx.removeAttribute(F?bv:by);if(ao.test(bv)&&by in bx){bx[by]=false}}}}},attrHooks:{type:{set:function(e,bv){if(g.test(e.nodeName)&&e.parentNode){b.error(\"type property can't be changed\")}else{if(!b.support.radioValue&&bv===\"radio\"&&b.nodeName(e,\"input\")){var bw=e.value;e.setAttribute(\"type\",bv);if(bw){e.value=bw}return bv}}}},value:{get:function(bv,e){if(be&&b.nodeName(bv,\"button\")){return be.get(bv,e)}return e in bv?bv.value:null},set:function(bv,bw,e){if(be&&b.nodeName(bv,\"button\")){return be.set(bv,bw,e)}bv.value=bw}}},propFix:{tabindex:\"tabIndex\",readonly:\"readOnly\",\"for\":\"htmlFor\",\"class\":\"className\",maxlength:\"maxLength\",cellspacing:\"cellSpacing\",cellpadding:\"cellPadding\",rowspan:\"rowSpan\",colspan:\"colSpan\",usemap:\"useMap\",frameborder:\"frameBorder\",contenteditable:\"contentEditable\"},prop:function(bz,bx,bA){var bw,e,by,bv=bz.nodeType;if(!bz||bv===3||bv===8||bv===2){return}by=bv!==1||!b.isXMLDoc(bz);if(by){bx=b.propFix[bx]||bx;e=b.propHooks[bx]}if(bA!==L){if(e&&\"set\" in e&&(bw=e.set(bz,bA,bx))!==L){return bw}else{return(bz[bx]=bA)}}else{if(e&&\"get\" in e&&(bw=e.get(bz,bx))!==null){return bw}else{return bz[bx]}}},propHooks:{tabIndex:{get:function(bv){var e=bv.getAttributeNode(\"tabindex\");return e&&e.specified?parseInt(e.value,10):D.test(bv.nodeName)||l.test(bv.nodeName)&&bv.href?0:L}}}});b.attrHooks.tabindex=b.propHooks.tabIndex;aY={get:function(bv,e){var bx,bw=b.prop(bv,e);return bw===true||typeof bw!==\"boolean\"&&(bx=bv.getAttributeNode(e))&&bx.nodeValue!==false?e.toLowerCase():L},set:function(bv,bx,e){var bw;if(bx===false){b.removeAttr(bv,e)}else{bw=b.propFix[e]||e;if(bw in bv){bv[bw]=true}bv.setAttribute(e,e.toLowerCase())}return e}};if(!F){aF={name:true,id:true};be=b.valHooks.button={get:function(bw,bv){var e;e=bw.getAttributeNode(bv);return e&&(aF[bv]?e.nodeValue!==\"\":e.specified)?e.nodeValue:L},set:function(bw,bx,bv){var e=bw.getAttributeNode(bv);if(!e){e=av.createAttribute(bv);bw.setAttributeNode(e)}return(e.nodeValue=bx+\"\")}};b.attrHooks.tabindex.set=be.set;b.each([\"width\",\"height\"],function(bv,e){b.attrHooks[e]=b.extend(b.attrHooks[e],{set:function(bw,bx){if(bx===\"\"){bw.setAttribute(e,\"auto\");return bx}}})});b.attrHooks.contenteditable={get:be.get,set:function(bv,bw,e){if(bw===\"\"){bw=\"false\"}be.set(bv,bw,e)}}}if(!b.support.hrefNormalized){b.each([\"href\",\"src\",\"width\",\"height\"],function(bv,e){b.attrHooks[e]=b.extend(b.attrHooks[e],{get:function(bx){var bw=bx.getAttribute(e,2);return bw===null?L:bw}})})}if(!b.support.style){b.attrHooks.style={get:function(e){return e.style.cssText.toLowerCase()||L},set:function(e,bv){return(e.style.cssText=\"\"+bv)}}}if(!b.support.optSelected){b.propHooks.selected=b.extend(b.propHooks.selected,{get:function(bv){var e=bv.parentNode;if(e){e.selectedIndex;if(e.parentNode){e.parentNode.selectedIndex}}return null}})}if(!b.support.enctype){b.propFix.enctype=\"encoding\"}if(!b.support.checkOn){b.each([\"radio\",\"checkbox\"],function(){b.valHooks[this]={get:function(e){return e.getAttribute(\"value\")===null?\"on\":e.value}}})}b.each([\"radio\",\"checkbox\"],function(){b.valHooks[this]=b.extend(b.valHooks[this],{set:function(e,bv){if(b.isArray(bv)){return(e.checked=b.inArray(b(e).val(),bv)>=0)}}})});var bd=/^(?:textarea|input|select)$/i,n=/^([^\\.]*)?(?:\\.(.+))?$/,J=/\\bhover(\\.\\S+)?\\b/,aO=/^key/,bf=/^(?:mouse|contextmenu)|click/,T=/^(?:focusinfocus|focusoutblur)$/,U=/^(\\w*)(?:#([\\w\\-]+))?(?:\\.([\\w\\-]+))?$/,Y=function(e){var bv=U.exec(e);if(bv){bv[1]=(bv[1]||\"\").toLowerCase();bv[3]=bv[3]&&new RegExp(\"(?:^|\\\\s)\"+bv[3]+\"(?:\\\\s|$)\")}return bv},j=function(bw,e){var bv=bw.attributes||{};return((!e[1]||bw.nodeName.toLowerCase()===e[1])&&(!e[2]||(bv.id||{}).value===e[2])&&(!e[3]||e[3].test((bv[\"class\"]||{}).value)))},bt=function(e){return b.event.special.hover?e:e.replace(J,\"mouseenter$1 mouseleave$1\")};b.event={add:function(bx,bC,bJ,bA,by){var bD,bB,bK,bI,bH,bF,e,bG,bv,bz,bw,bE;if(bx.nodeType===3||bx.nodeType===8||!bC||!bJ||!(bD=b._data(bx))){return}if(bJ.handler){bv=bJ;bJ=bv.handler}if(!bJ.guid){bJ.guid=b.guid++}bK=bD.events;if(!bK){bD.events=bK={}}bB=bD.handle;if(!bB){bD.handle=bB=function(bL){return typeof b!==\"undefined\"&&(!bL||b.event.triggered!==bL.type)?b.event.dispatch.apply(bB.elem,arguments):L};bB.elem=bx}bC=b.trim(bt(bC)).split(\" \");for(bI=0;bI<bC.length;bI++){bH=n.exec(bC[bI])||[];bF=bH[1];e=(bH[2]||\"\").split(\".\").sort();bE=b.event.special[bF]||{};bF=(by?bE.delegateType:bE.bindType)||bF;bE=b.event.special[bF]||{};bG=b.extend({type:bF,origType:bH[1],data:bA,handler:bJ,guid:bJ.guid,selector:by,quick:Y(by),namespace:e.join(\".\")},bv);bw=bK[bF];if(!bw){bw=bK[bF]=[];bw.delegateCount=0;if(!bE.setup||bE.setup.call(bx,bA,e,bB)===false){if(bx.addEventListener){bx.addEventListener(bF,bB,false)}else{if(bx.attachEvent){bx.attachEvent(\"on\"+bF,bB)}}}}if(bE.add){bE.add.call(bx,bG);if(!bG.handler.guid){bG.handler.guid=bJ.guid}}if(by){bw.splice(bw.delegateCount++,0,bG)}else{bw.push(bG)}b.event.global[bF]=true}bx=null},global:{},remove:function(bJ,bE,bv,bH,bB){var bI=b.hasData(bJ)&&b._data(bJ),bF,bx,bz,bL,bC,bA,bG,bw,by,bK,bD,e;if(!bI||!(bw=bI.events)){return}bE=b.trim(bt(bE||\"\")).split(\" \");for(bF=0;bF<bE.length;bF++){bx=n.exec(bE[bF])||[];bz=bL=bx[1];bC=bx[2];if(!bz){for(bz in bw){b.event.remove(bJ,bz+bE[bF],bv,bH,true)}continue}by=b.event.special[bz]||{};bz=(bH?by.delegateType:by.bindType)||bz;bD=bw[bz]||[];bA=bD.length;bC=bC?new RegExp(\"(^|\\\\.)\"+bC.split(\".\").sort().join(\"\\\\.(?:.*\\\\.)?\")+\"(\\\\.|$)\"):null;for(bG=0;bG<bD.length;bG++){e=bD[bG];if((bB||bL===e.origType)&&(!bv||bv.guid===e.guid)&&(!bC||bC.test(e.namespace))&&(!bH||bH===e.selector||bH===\"**\"&&e.selector)){bD.splice(bG--,1);if(e.selector){bD.delegateCount--}if(by.remove){by.remove.call(bJ,e)}}}if(bD.length===0&&bA!==bD.length){if(!by.teardown||by.teardown.call(bJ,bC)===false){b.removeEvent(bJ,bz,bI.handle)}delete bw[bz]}}if(b.isEmptyObject(bw)){bK=bI.handle;if(bK){bK.elem=null}b.removeData(bJ,[\"events\",\"handle\"],true)}},customEvent:{getData:true,setData:true,changeData:true},trigger:function(bv,bD,bA,bJ){if(bA&&(bA.nodeType===3||bA.nodeType===8)){return}var bG=bv.type||bv,bx=[],e,bw,bC,bH,bz,by,bF,bE,bB,bI;if(T.test(bG+b.event.triggered)){return}if(bG.indexOf(\"!\")>=0){bG=bG.slice(0,-1);bw=true}if(bG.indexOf(\".\")>=0){bx=bG.split(\".\");bG=bx.shift();bx.sort()}if((!bA||b.event.customEvent[bG])&&!b.event.global[bG]){return}bv=typeof bv===\"object\"?bv[b.expando]?bv:new b.Event(bG,bv):new b.Event(bG);bv.type=bG;bv.isTrigger=true;bv.exclusive=bw;bv.namespace=bx.join(\".\");bv.namespace_re=bv.namespace?new RegExp(\"(^|\\\\.)\"+bx.join(\"\\\\.(?:.*\\\\.)?\")+\"(\\\\.|$)\"):null;by=bG.indexOf(\":\")<0?\"on\"+bG:\"\";if(!bA){e=b.cache;for(bC in e){if(e[bC].events&&e[bC].events[bG]){b.event.trigger(bv,bD,e[bC].handle.elem,true)}}return}bv.result=L;if(!bv.target){bv.target=bA}bD=bD!=null?b.makeArray(bD):[];bD.unshift(bv);bF=b.event.special[bG]||{};if(bF.trigger&&bF.trigger.apply(bA,bD)===false){return}bB=[[bA,bF.bindType||bG]];if(!bJ&&!bF.noBubble&&!b.isWindow(bA)){bI=bF.delegateType||bG;bH=T.test(bI+bG)?bA:bA.parentNode;bz=null;for(;bH;bH=bH.parentNode){bB.push([bH,bI]);bz=bH}if(bz&&bz===bA.ownerDocument){bB.push([bz.defaultView||bz.parentWindow||bb,bI])}}for(bC=0;bC<bB.length&&!bv.isPropagationStopped();bC++){bH=bB[bC][0];bv.type=bB[bC][1];bE=(b._data(bH,\"events\")||{})[bv.type]&&b._data(bH,\"handle\");if(bE){bE.apply(bH,bD)}bE=by&&bH[by];if(bE&&b.acceptData(bH)&&bE.apply(bH,bD)===false){bv.preventDefault()}}bv.type=bG;if(!bJ&&!bv.isDefaultPrevented()){if((!bF._default||bF._default.apply(bA.ownerDocument,bD)===false)&&!(bG===\"click\"&&b.nodeName(bA,\"a\"))&&b.acceptData(bA)){if(by&&bA[bG]&&((bG!==\"focus\"&&bG!==\"blur\")||bv.target.offsetWidth!==0)&&!b.isWindow(bA)){bz=bA[by];if(bz){bA[by]=null}b.event.triggered=bG;bA[bG]();b.event.triggered=L;if(bz){bA[by]=bz}}}}return bv.result},dispatch:function(e){e=b.event.fix(e||bb.event);var bz=((b._data(this,\"events\")||{})[e.type]||[]),bA=bz.delegateCount,bG=[].slice.call(arguments,0),by=!e.exclusive&&!e.namespace,bH=[],bC,bB,bK,bx,bF,bE,bv,bD,bI,bw,bJ;bG[0]=e;e.delegateTarget=this;if(bA&&!e.target.disabled&&!(e.button&&e.type===\"click\")){bx=b(this);bx.context=this.ownerDocument||this;for(bK=e.target;bK!=this;bK=bK.parentNode||this){bE={};bD=[];bx[0]=bK;for(bC=0;bC<bA;bC++){bI=bz[bC];bw=bI.selector;if(bE[bw]===L){bE[bw]=(bI.quick?j(bK,bI.quick):bx.is(bw))}if(bE[bw]){bD.push(bI)}}if(bD.length){bH.push({elem:bK,matches:bD})}}}if(bz.length>bA){bH.push({elem:this,matches:bz.slice(bA)})}for(bC=0;bC<bH.length&&!e.isPropagationStopped();bC++){bv=bH[bC];e.currentTarget=bv.elem;for(bB=0;bB<bv.matches.length&&!e.isImmediatePropagationStopped();bB++){bI=bv.matches[bB];if(by||(!e.namespace&&!bI.namespace)||e.namespace_re&&e.namespace_re.test(bI.namespace)){e.data=bI.data;e.handleObj=bI;bF=((b.event.special[bI.origType]||{}).handle||bI.handler).apply(bv.elem,bG);if(bF!==L){e.result=bF;if(bF===false){e.preventDefault();e.stopPropagation()}}}}}return e.result},props:\"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which\".split(\" \"),fixHooks:{},keyHooks:{props:\"char charCode key keyCode\".split(\" \"),filter:function(bv,e){if(bv.which==null){bv.which=e.charCode!=null?e.charCode:e.keyCode}return bv}},mouseHooks:{props:\"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement\".split(\" \"),filter:function(bx,bw){var by,bz,e,bv=bw.button,bA=bw.fromElement;if(bx.pageX==null&&bw.clientX!=null){by=bx.target.ownerDocument||av;bz=by.documentElement;e=by.body;bx.pageX=bw.clientX+(bz&&bz.scrollLeft||e&&e.scrollLeft||0)-(bz&&bz.clientLeft||e&&e.clientLeft||0);bx.pageY=bw.clientY+(bz&&bz.scrollTop||e&&e.scrollTop||0)-(bz&&bz.clientTop||e&&e.clientTop||0)}if(!bx.relatedTarget&&bA){bx.relatedTarget=bA===bx.target?bw.toElement:bA}if(!bx.which&&bv!==L){bx.which=(bv&1?1:(bv&2?3:(bv&4?2:0)))}return bx}},fix:function(bw){if(bw[b.expando]){return bw}var bv,bz,e=bw,bx=b.event.fixHooks[bw.type]||{},by=bx.props?this.props.concat(bx.props):this.props;bw=b.Event(e);for(bv=by.length;bv;){bz=by[--bv];bw[bz]=e[bz]}if(!bw.target){bw.target=e.srcElement||av}if(bw.target.nodeType===3){bw.target=bw.target.parentNode}if(bw.metaKey===L){bw.metaKey=bw.ctrlKey}return bx.filter?bx.filter(bw,e):bw},special:{ready:{setup:b.bindReady},load:{noBubble:true},focus:{delegateType:\"focusin\"},blur:{delegateType:\"focusout\"},beforeunload:{setup:function(bw,bv,e){if(b.isWindow(this)){this.onbeforeunload=e}},teardown:function(bv,e){if(this.onbeforeunload===e){this.onbeforeunload=null}}}},simulate:function(bw,by,bx,bv){var bz=b.extend(new b.Event(),bx,{type:bw,isSimulated:true,originalEvent:{}});if(bv){b.event.trigger(bz,null,by)}else{b.event.dispatch.call(by,bz)}if(bz.isDefaultPrevented()){bx.preventDefault()}}};b.event.handle=b.event.dispatch;b.removeEvent=av.removeEventListener?function(bv,e,bw){if(bv.removeEventListener){bv.removeEventListener(e,bw,false)}}:function(bv,e,bw){if(bv.detachEvent){bv.detachEvent(\"on\"+e,bw)}};b.Event=function(bv,e){if(!(this instanceof b.Event)){return new b.Event(bv,e)}if(bv&&bv.type){this.originalEvent=bv;this.type=bv.type;this.isDefaultPrevented=(bv.defaultPrevented||bv.returnValue===false||bv.getPreventDefault&&bv.getPreventDefault())?i:bk}else{this.type=bv}if(e){b.extend(this,e)}this.timeStamp=bv&&bv.timeStamp||b.now();this[b.expando]=true};function bk(){return false}function i(){return true}b.Event.prototype={preventDefault:function(){this.isDefaultPrevented=i;var bv=this.originalEvent;if(!bv){return}if(bv.preventDefault){bv.preventDefault()}else{bv.returnValue=false}},stopPropagation:function(){this.isPropagationStopped=i;var bv=this.originalEvent;if(!bv){return}if(bv.stopPropagation){bv.stopPropagation()}bv.cancelBubble=true},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=i;this.stopPropagation()},isDefaultPrevented:bk,isPropagationStopped:bk,isImmediatePropagationStopped:bk};b.each({mouseenter:\"mouseover\",mouseleave:\"mouseout\"},function(bv,e){b.event.special[bv]={delegateType:e,bindType:e,handle:function(bz){var bB=this,bA=bz.relatedTarget,by=bz.handleObj,bw=by.selector,bx;if(!bA||(bA!==bB&&!b.contains(bB,bA))){bz.type=by.origType;bx=by.handler.apply(this,arguments);bz.type=e}return bx}}});if(!b.support.submitBubbles){b.event.special.submit={setup:function(){if(b.nodeName(this,\"form\")){return false\n"
index e1f8314..bc16cf6 100644 (file)
@@ -1,3 +1,10 @@
-f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k<c.length;k++){l=A.exec(c[k])||[],m=l[1],n=(l[2]||"").split(".").sort(),s=f.event.special[m]||{},m=(g?s.delegateType:s.bindType)||m,s=f.event.special[m]||{},o=f.extend({type:m,origType:l[1],data:e,handler:d,guid:d.guid,selector:g,quick:G(g),namespace:n.join(".")},p),r=j[m];if(!r){r=j[m]=[],r.delegateCount=0;if(!s.setup||s.setup.call(a,e,n,i)===!1)a.addEventListener?a.addEventListener(m,i,!1):a.attachEvent&&a.attachEvent("on"+m,i)}s.add&&(s.add.call(a,o),o.handler.guid||(o.handler.guid=d.guid)),g?r.splice(r.delegateCount++,0,o):r.push(o),f.event.global[m]=!0}a=null}},global:{},remove:function(a,b,c,d,e){var g=f.hasData(a)&&f._data(a),h,i,j,k,l,m,n,o,p,q,r,s;if(!!g&&!!(o=g.events)){b=f.trim(I(b||"")).split(" ");for(h=0;h<b.length;h++){i=A.exec(b[h])||[],j=k=i[1],l=i[2];if(!j){for(j in o)f.event.remove(a,j+b[h],c,d,!0);continue}p=f.event.special[j]||{},j=(d?p.delegateType:p.bindType)||j,r=o[j]||[],m=r.length,l=l?new RegExp("(^|\\.)"+l.split(".").sort().join("\\.(?:.*\\.)?")+"(\\.|$)"):null;for(n=0;n<r.length;n++)s=r[n],(e||k===s.origType)&&(!c||c.guid===s.guid)&&(!l||l.test(s.namespace))&&(!d||d===s.selector||d==="**"&&s.selector)&&(r.splice(n--,1),s.selector&&r.delegateCount--,p.remove&&p.remove.call(a,s));r.length===0&&m!==r.length&&((!p.teardown||p.teardown.call(a,l)===!1)&&f.removeEvent(a,j,g.handle),delete o[j])}f.isEmptyObject(o)&&(q=g.handle,q&&(q.elem=null),f.removeData(a,["events","handle"],!0))}},customEvent:{getData:!0,setData:!0,changeData:!0},trigger:function(c,d,e,g){if(!e||e.nodeType!==3&&e.nodeType!==8){var h=c.type||c,i=[],j,k,l,m,n,o,p,q,r,s;if(E.test(h+f.event.triggered))return;h.indexOf("!")>=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"";if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;l<r.length&&!c.isPropagationStopped();l++)m=r[l][0],c.type=r[l][1],q=(f._data(m,"events")||{})[c.type]&&f._data(m,"handle"),q&&q.apply(m,d),q=o&&m[o],q&&f.acceptData(m)&&q.apply(m,d)===!1&&c.preventDefault();c.type=h,!g&&!c.isDefaultPrevented()&&(!p._default||p._default.apply(e.ownerDocument,d)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)&&o&&e[h]&&(h!=="focus"&&h!=="blur"||c.target.offsetWidth!==0)&&!f.isWindow(e)&&(n=e[o],n&&(e[o]=null),f.event.triggered=h,e[h](),f.event.triggered=b,n&&(e[o]=n));return c.result}},dispatch:function(c){c=f.event.fix(c||a.event);var d=(f._data(this,"events")||{})[c.type]||[],e=d.delegateCount,g=[].slice.call(arguments,0),h=!c.exclusive&&!c.namespace,i=[],j,k,l,m,n,o,p,q,r,s,t;g[0]=c,c.delegateTarget=this;if(e&&!c.target.disabled&&(!c.button||c.type!=="click")){m=f(this),m.context=this.ownerDocument||this;for(l=c.target;l!=this;l=l.parentNode||this){o={},q=[],m[0]=l;for(j=0;j<e;j++)r=d[j],s=r.selector,o[s]===b&&(o[s]=r.quick?H(l,r.quick):m.is(s)),o[s]&&q.push(r);q.length&&i.push({elem:l,matches:q})}}d.length>e&&i.push({elem:this,matches:d.slice(e)});for(j=0;j<i.length&&!c.isPropagationStopped();j++){p=i[j],c.currentTarget=p.elem;for(k=0;k<p.matches.length&&!c.isImmediatePropagationStopped();k++){r=p.matches[k];if(h||!c.namespace&&!r.namespace||c.namespace_re&&c.namespace_re.test(r.namespace))c.data=r.data,c.handleObj=r,n=((f.event.special[r.origType]||{}).handle||r.handler).apply(p.elem,g),n!==b&&(c.result=n,n===!1&&(c.preventDefault(),c.stopPropagation()))}}return c.result},props:"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){a.which==null&&(a.which=b.charCode!=null?b.charCode:b.keyCode);return a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,d){var e,f,g,h=d.button,i=d.fromElement;a.pageX==null&&d.clientX!=null&&(e=a.target.ownerDocument||c,f=e.documentElement,g=e.body,a.pageX=d.clientX+(f&&f.scrollLeft||g&&g.scrollLeft||0)-(f&&f.clientLeft||g&&g.clientLeft||0),a.pageY=d.clientY+(f&&f.scrollTop||g&&g.scrollTop||0)-(f&&f.clientTop||g&&g.clientTop||0)),!a.relatedTarget&&i&&(a.relatedTarget=i===a.target?d.toElement:i),!a.which&&h!==b&&(a.which=h&1?1:h&2?3:h&4?2:0);return a}},fix:function(a){if(a[f.expando])return a;var d,e,g=a,h=f.event.fixHooks[a.type]||{},i=h.props?this.props.concat(h.props):this.props;a=f.Event(g);for(d=i.length;d;)e=i[--d],a[e]=g[e];a.target||(a.target=g.srcElement||c),a.target.nodeType===3&&(a.target=a.target.parentNode),a.metaKey===b&&(a.metaKey=a.ctrlKey);return h.filter?h.filter(a,g):a},special:{ready:{setup:f.bindReady},load:{noBubble:!0},focus:{delegateType:"focusin"},blur:{delegateType:"focusout"},beforeunload:{setup:function(a,b,c){f.isWindow(this)&&(this.onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeunload=null)}}},simulate:function(a,b,c,d){var e=f.extend(new f.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?f.event.trigger(e,null,b):f.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},f.event.handle=f.event.dispatch,f.removeEvent=c.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){a.detachEvent&&a.detachEvent("on"+b,c)},f.Event=function(a,b){if(!(this instanceof f.Event))return new f.Event(a,b);a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?K:J):this.type=a,b&&f.extend(this,b),this.timeStamp=a&&a.timeStamp||f.now(),this[f.expando]=!0},f.Event.prototype={preventDefault:function(){this.isDefaultPrevented=K;var a=this.originalEvent;!a||(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){this.isPropagationStopped=K;var a=this.originalEvent;!a||(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=K,this.stopPropagation()},isDefaultPrevented:J,isPropagationStopped:J,isImmediatePropagationStopped:J},f.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){f.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c=this,d=a.relatedTarget,e=a.handleObj,g=e.selector,h;if(!d||d!==c&&!f.contains(c,d))a.type=e.origType,h=e.handler.apply(this,arguments),a.type=b;return h}}}),f.support.submitBubbles||(f.event.special.submit={setup:function(){if(f.nodeName(this,"form"))return!1;f.event.add(this,"click._submit keypress._submit",function(a){var c=a.target,d=f.nodeName(c,"input")||f.nodeName(c,"button")?c.form:b;d&&!d._submit_attached&&(f.event.add(d,"submit._submit",function(a){this.parentNode&&!a.isTrigger&&f.event.simulate("submit",this.parentNode,a,!0)}),d._submit_attached=!0)})},teardown:function(){if(f.nodeName(this,"form"))return!1;f.event.remove(this,"._submit")}}),f.support.changeBubbles||(f.event.special.change={setup:function(){if(z.test(this.nodeName)){if(this.type==="checkbox"||this.type==="radio")f.event.add(this,"propertychange._change",function(a){a.originalEvent.propertyName==="checked"&&(this._just_changed=!0)}),f.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1,f.event.simulate("change",this,a,!0))});return!1}f.event.add(this,"beforeactivate._change",function(a){var b=a.target;z.test(b.nodeName)&&!b._change_attached&&(f.event.add(b,"change._change",function(a){this.parentNode&&!a.isSimulated&&!a.isTrigger&&f.event.simulate("change",this.parentNode,a,!0)}),b._change_attached=!0)})},handle:function(a){var b=a.target;if(this!==b||a.isSimulated||a.isTrigger||b.type!=="radio"&&b.type!=="checkbox")return a.handleObj.handler.apply(this,arguments)},teardown:function(){f.event.remove(this,"._change");return z.test(this.nodeName)}}),f.support.focusinBubbles||f.each({focus:"focusin",blur:"focusout"},function(a,b){var d=0,e=function(a){f.event.simulate(b,a.target,f.event.fix(a),!0)};f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.fn.extend({on:function(a,c,d,e,g){var h,i;if(typeof a=="object"){typeof c!="string"&&(d=c,c=b);for(i in a)this.on(i,c,d,a[i],g);return this}d==null&&e==null?(e=c,d=c=b):e==null&&(typeof c=="string"?(e=d,d=b):(e=d,d=c,c=b));if(e===!1)e=J;else if(!e)return this;g===1&&(h=e,e=function(a){f().off(a);return h.apply(this,arguments)},e.guid=h.guid||(h.guid=f.guid++));return this.each(function(){f.event.add(this,a,e,d,c)})},one:function(a,b,c,d){return this.on.call(this,a,b,c,d,1)},off:function(a,c,d){if(a&&a.preventDefault&&a.handleObj){var e=a.handleObj;f(a.delegateTarget).off(e.namespace?e.type+"."+e.namespace:e.type,e.selector,e.handler);return this}if(typeof a=="object"){for(var g in a)this.off(g,c,a[g]);return this}if(c===!1||typeof c=="function")d=c,c=b;d===!1&&(d=J);return this.each(function(){f.event.remove(this,a,d,c)})},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},live:function(a,b,c){f(this.context).on(a,this.selector,b,c);return this},die:function(a,b){f(this.context).off(a,this.selector||"**",b);return this},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return arguments.length==1?this.off(a,"**"):this.off(b,a,c)},trigger:function(a,b){return this.each(function(){f.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0])return f.event.trigger(a,b,this[0],!0)},toggle:function(a){var b=arguments,c=a.guid||f.guid++,d=0,e=function(c){var e=(f._data(this,"lastToggle"+a.guid)||0)%d;f._data(this,"lastToggle"+a.guid,e+1),c.preventDefault();return b[e].apply(this,arguments)||!1};e.guid=c;while(d<b.length)b[d++].guid=c;return this.click(e)},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),f.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){f.fn[b]=function(a,c){c==null&&(c=a,a=null);return arguments.length>0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h<i;h++){var j=e[h];if(j){var k=!1;j=j[a];while(j){if(j[d]===c){k=e[j.sizset];break}if(j.nodeType===1){g||(j[d]=c,j.sizset=h);if(typeof b!="string"){if(j===b){k=!0;break}}else if(m.filter(b,[j]).length>0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h<i;h++){var j=e[h];if(j){var k=!1;j=j[a];while(j){if(j[d]===c){k=e[j.sizset];break}j.nodeType===1&&!g&&(j[d]=c,j.sizset=h);if(j.nodeName.toLowerCase()===b){k=j;break}j=j[a]}e[h]=k}}}var a=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b<a.length;b++)a[b]===a[b-1]&&a.splice(b--,1)}return a},m.matches=function(a,b){return m(a,null,null,b)},m.matchesSelector=function(a,b){return m(b,null,null,[a]).length>0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e<f;e++){h=o.order[e];if(g=o.leftMatch[h].exec(a)){i=g[1],g.splice(1,1);if(i.substr(i.length-1)!=="\\"){g[1]=(g[1]||"").replace(j,""),d=o.find[h](g,b,c);if(d!=null){a=a.replace(o.match[h],"");break}}}}d||(d=typeof b.getElementsByTagName!="undefined"?b.getElementsByTagName("*"):[]);return{set:d,expr:a}},m.filter=function(a,c,d,e){var f,g,h,i,j,k,l,n,p,q=a,r=[],s=c,t=c&&c[0]&&m.isXML(c[0]);while(a&&c.length){for(h in o.filter)if((f=o.leftMatch[h].exec(a))!=null&&f[2]){k=o.filter[h],l=f[1],g=!1,f.splice(1,1);if(l.substr(l.length-1)==="\\")continue;s===r&&(r=[]);if(o.preFilter[h]){f=o.preFilter[h](f,s,d,r,e,t);if(!f)g=i=!0;else if(f===!0)continue}if(f)for(n=0;(j=s[n])!=null;n++)j&&(i=k(j,f,n,s),p=e^i,d&&i!=null?p?g=!0:s[n]=!1:p&&(r.push(j),g=!0));if(i!==b){d||(s=r),a=a.replace(o.match[h],"");if(!g)return[];break}}if(a===q)if(g==null)m.error(a);else break;q=a}return s},m.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)};var n=m.getText=function(a){var b,c,d=a.nodeType,e="";if(d){if(d===1||d===9){if(typeof a.textContent=="string")return a.textContent;if(typeof a.innerText=="string")return a.innerText.replace(k,"");for(a=a.firstChild;a;a=a.nextSibling)e+=n(a)}else if(d===3||d===4)return a.nodeValue}else for(b=0;c=a[b];b++)c.nodeType!==8&&(e+=n(c));return e},o=m.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(a){return a.getAttribute("href")},type:function(a){return a.getAttribute("type")}},relative:{"+":function(a,b){var c=typeof b=="string",d=c&&!l.test(b),e=c&&!d;d&&(b=b.toLowerCase());for(var f=0,g=a.length,h;f<g;f++)if(h=a[f]){while((h=h.previousSibling)&&h.nodeType!==1);a[f]=e||h&&h.nodeName.toLowerCase()===b?h||!1:h===b}e&&m.filter(b,a,!0)},">":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e<f;e++){c=a[e];if(c){var g=c.parentNode;a[e]=g.nodeName.toLowerCase()===b?g:!1}}}else{for(;e<f;e++)c=a[e],c&&(a[e]=d?c.parentNode:c.parentNode===b);d
-&&m.filter(b,a,!0)}},"":function(a,b,c){var d,f=e++,g=x;typeof b=="string"&&!l.test(b)&&(b=b.toLowerCase(),d=b,g=w),g("parentNode",b,f,a,d,c)},"~":function(a,b,c){var d,f=e++,g=x;typeof b=="string"&&!l.test(b)&&(b=b.toLowerCase(),d=b,g=w),g("previousSibling",b,f,a,d,c)}},find:{ID:function(a,b,c){if(typeof b.getElementById!="undefined"&&!c){var d=b.getElementById(a[1]);return d&&d.parentNode?[d]:[]}},NAME:function(a,b){if(typeof b.getElementsByName!="undefined"){var c=[],d=b.getElementsByName(a[1]);for(var e=0,f=d.length;e<f;e++)d[e].getAttribute("name")===a[1]&&c.push(d[e]);return c.length===0?null:c}},TAG:function(a,b){if(typeof b.getElementsByTagName!="undefined")return b.getElementsByTagName(a[1])}},preFilter:{CLASS:function(a,b,c,d,e,f){a=" "+a[1].replace(j,"")+" ";if(f)return a;for(var g=0,h;(h=b[g])!=null;g++)h&&(e^(h.className&&(" "+h.className+" ").replace(/[\t\n\r]/g," ").indexOf(a)>=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return b<c[3]-0},gt:function(a,b,c){return b>c[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||n([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h<i;h++)if(g[h]===a)return!1;return!0}m.error(e)},CHILD:function(a,b){var c,e,f,g,h,i,j,k=b[1],l=a;switch(k){case"only":case"first":while(l=l.previousSibling)if(l.nodeType===1)return!1;if(k==="first")return!0;l=a;case"last":while(l=l.nextSibling)if(l.nodeType===1)return!1;return!0;case"nth":c=b[2],e=b[3];if(c===1&&e===0)return!0;f=b[0],g=a.parentNode;if(g&&(g[d]!==f||!a.nodeIndex)){i=0;for(l=g.firstChild;l;l=l.nextSibling)l.nodeType===1&&(l.nodeIndex=++i);g[d]=f}j=a.nodeIndex-e;return c===0?j===0:j%c===0&&j/c>=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null:f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var e=a.length;c<e;c++)d.push(a[c]);else for(;a[c];c++)d.push(a[c]);return d}}var u,v;c.documentElement.compareDocumentPosition?u=function(a,b){if(a===b){h=!0;return 0}if(!a.compareDocumentPosition||!b.compareDocumentPosition)return a.compareDocumentPosition?-1:1;return a.compareDocumentPosition(b)&4?-1:1}:(u=function(a,b){if(a===b){h=!0;return 0}if(a.sourceIndex&&b.sourceIndex)return a.sourceIndex-b.sourceIndex;var c,d,e=[],f=[],g=a.parentNode,i=b.parentNode,j=g;if(g===i)return v(a,b);if(!g)return-1;if(!i)return 1;while(j)e.unshift(j),j=j.parentNode;j=i;while(j)f.unshift(j),j=j.parentNode;c=e.length,d=f.length;for(var k=0;k<c&&k<d;k++)if(e[k]!==f[k])return v(e[k],f[k]);return k===c?v(a,f[k],-1):v(e[k],b,1)},v=function(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}),function(){var a=c.createElement("div"),d="script"+(new Date).getTime(),e=c.documentElement;a.innerHTML="<a name='"+d+"'/>",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="<a href='#'></a>",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="<p class='TEST'></p>";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="<div class='test e'></div><div class='test'></div>";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h<i;h++)m(a,g[h],e,c);return m.filter(f,e)};m.attr=f.attr,m.selectors.attrMap={},f.find=m,f.expr=m.selectors,f.expr[":"]=f.expr.filters,f.unique=m.uniqueSort,f.text=m.getText,f.isXMLDoc=m.isXML,f.contains=m.contains}();var L=/Until$/,M=/^(?:parents|prevUntil|prevAll)/,N=/,/,O=/^.[^:#\[\.,]*$/,P=Array.prototype.slice,Q=f.expr.match.POS,R={children:!0,contents:!0,next:!0,prev:!0};f.fn.extend({find:function(a){var b=this,c,d;if(typeof a!="string")return f(a).filter(function(){for(c=0,d=b.length;c<d;c++)if(f.contains(b[c],this))return!0});var e=this.pushStack("","find",a),g,h,i;for(c=0,d=this.length;c<d;c++){g=e.length,f.find(a,this[c],e);if(c>0)for(h=g;h<e.length;h++)for(i=0;i<g;i++)if(e[i]===e[h]){e.splice(h--,1);break}}return e},has:function(a){var b=f(a);return this.filter(function(){for(var a=0,c=b.length;a<c;a++)if(f.contains(this,b[a]))return!0})},not:function(a){return this.pushStack(T(this,a,!1),"not",a)},filter:function(a){return this.pushStack(T(this,a,!0),"filter",a)},is:function(a){return!!a&&(typeof a=="string"?Q.test(a)?f(a,this.context).index(this[0])>=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d<a.length;d++)f(g).is(a[d])&&c.push({selector:a[d],elem:g,level:h});g=g.parentNode,h++}return c}var i=Q.test(a)||typeof a!="string"?f(a,b||this.context):0;for(d=0,e=this.length;d<e;d++){g=this[d];while(g){if(i?i.index(g)>-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var V="abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/<tbody/i,_=/<|&#?\w+;/,ba=/<(?:script|style)/i,bb=/<(?:script|object|embed|option|style)/i,bc=new RegExp("<(?:"+V+")","i"),bd=/checked\s*(?:[^=]|=\s*.checked.)/i,be=/\/(java|ecma)script/i,bf=/^\s*<!(?:\[CDATA\[|\-\-)/,bg={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div<div>","</div>"]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f.clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),
-f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function()
+}b.event.add(this,"click._submit keypress._submit",function(bx){var bw=bx.target,bv=b.nodeName(bw,"input")||b.nodeName(bw,"button")?bw.form:L;if(bv&&!bv._submit_attached){b.event.add(bv,"submit._submit",function(e){if(this.parentNode&&!e.isTrigger){b.event.simulate("submit",this.parentNode,e,true)}});bv._submit_attached=true}})},teardown:function(){if(b.nodeName(this,"form")){return false}b.event.remove(this,"._submit")}}}if(!b.support.changeBubbles){b.event.special.change={setup:function(){if(bd.test(this.nodeName)){if(this.type==="checkbox"||this.type==="radio"){b.event.add(this,"propertychange._change",function(e){if(e.originalEvent.propertyName==="checked"){this._just_changed=true}});b.event.add(this,"click._change",function(e){if(this._just_changed&&!e.isTrigger){this._just_changed=false;b.event.simulate("change",this,e,true)}})}return false}b.event.add(this,"beforeactivate._change",function(bw){var bv=bw.target;if(bd.test(bv.nodeName)&&!bv._change_attached){b.event.add(bv,"change._change",function(e){if(this.parentNode&&!e.isSimulated&&!e.isTrigger){b.event.simulate("change",this.parentNode,e,true)}});bv._change_attached=true}})},handle:function(bv){var e=bv.target;if(this!==e||bv.isSimulated||bv.isTrigger||(e.type!=="radio"&&e.type!=="checkbox")){return bv.handleObj.handler.apply(this,arguments)}},teardown:function(){b.event.remove(this,"._change");return bd.test(this.nodeName)}}}if(!b.support.focusinBubbles){b.each({focus:"focusin",blur:"focusout"},function(bx,e){var bv=0,bw=function(by){b.event.simulate(e,by.target,b.event.fix(by),true)};b.event.special[e]={setup:function(){if(bv++===0){av.addEventListener(bx,bw,true)}},teardown:function(){if(--bv===0){av.removeEventListener(bx,bw,true)}}}})}b.fn.extend({on:function(bw,e,bz,by,bv){var bA,bx;if(typeof bw==="object"){if(typeof e!=="string"){bz=e;e=L}for(bx in bw){this.on(bx,e,bz,bw[bx],bv)}return this}if(bz==null&&by==null){by=e;bz=e=L}else{if(by==null){if(typeof e==="string"){by=bz;bz=L}else{by=bz;bz=e;e=L}}}if(by===false){by=bk}else{if(!by){return this}}if(bv===1){bA=by;by=function(bB){b().off(bB);return bA.apply(this,arguments)};by.guid=bA.guid||(bA.guid=b.guid++)}return this.each(function(){b.event.add(this,bw,by,bz,e)})},one:function(bv,e,bx,bw){return this.on.call(this,bv,e,bx,bw,1)},off:function(bw,e,by){if(bw&&bw.preventDefault&&bw.handleObj){var bv=bw.handleObj;b(bw.delegateTarget).off(bv.namespace?bv.type+"."+bv.namespace:bv.type,bv.selector,bv.handler);return this}if(typeof bw==="object"){for(var bx in bw){this.off(bx,e,bw[bx])}return this}if(e===false||typeof e==="function"){by=e;e=L}if(by===false){by=bk}return this.each(function(){b.event.remove(this,bw,by,e)})},bind:function(e,bw,bv){return this.on(e,null,bw,bv)},unbind:function(e,bv){return this.off(e,null,bv)},live:function(e,bw,bv){b(this.context).on(e,this.selector,bw,bv);return this},die:function(e,bv){b(this.context).off(e,this.selector||"**",bv);return this},delegate:function(e,bv,bx,bw){return this.on(bv,e,bx,bw)},undelegate:function(e,bv,bw){return arguments.length==1?this.off(e,"**"):this.off(bv,e,bw)},trigger:function(e,bv){return this.each(function(){b.event.trigger(e,bv,this)})},triggerHandler:function(e,bv){if(this[0]){return b.event.trigger(e,bv,this[0],true)}},toggle:function(bx){var bv=arguments,e=bx.guid||b.guid++,bw=0,by=function(bz){var bA=(b._data(this,"lastToggle"+bx.guid)||0)%bw;b._data(this,"lastToggle"+bx.guid,bA+1);bz.preventDefault();return bv[bA].apply(this,arguments)||false};by.guid=e;while(bw<bv.length){bv[bw++].guid=e}return this.click(by)},hover:function(e,bv){return this.mouseenter(e).mouseleave(bv||e)}});b.each(("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu").split(" "),function(bv,e){b.fn[e]=function(bx,bw){if(bw==null){bw=bx;bx=null}return arguments.length>0?this.on(e,null,bx,bw):this.trigger(e)};if(b.attrFn){b.attrFn[e]=true}if(aO.test(e)){b.event.fixHooks[e]=b.event.keyHooks}if(bf.test(e)){b.event.fixHooks[e]=b.event.mouseHooks}});
+/*!
+ * Sizzle CSS Selector Engine
+ *  Copyright 2011, The Dojo Foundation
+ *  Released under the MIT, BSD, and GPL Licenses.
+ *  More information: http://sizzlejs.com/
+ */
+(function(){var bH=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,bC="sizcache"+(Math.random()+"").replace(".",""),bI=0,bL=Object.prototype.toString,bB=false,bA=true,bK=/\\/g,bO=/\r\n/g,bQ=/\W/;[0,0].sort(function(){bA=false;return 0});var by=function(bV,e,bY,bZ){bY=bY||[];e=e||av;var b1=e;if(e.nodeType!==1&&e.nodeType!==9){return[]}if(!bV||typeof bV!=="string"){return bY}var bS,b3,b6,bR,b2,b5,b4,bX,bU=true,bT=by.isXML(e),bW=[],b0=bV;do{bH.exec("");bS=bH.exec(b0);if(bS){b0=bS[3];bW.push(bS[1]);if(bS[2]){bR=bS[3];break}}}while(bS);if(bW.length>1&&bD.exec(bV)){if(bW.length===2&&bE.relative[bW[0]]){b3=bM(bW[0]+bW[1],e,bZ)}else{b3=bE.relative[bW[0]]?[e]:by(bW.shift(),e);while(bW.length){bV=bW.shift();if(bE.relative[bV]){bV+=bW.shift()}b3=bM(bV,b3,bZ)}}}else{if(!bZ&&bW.length>1&&e.nodeType===9&&!bT&&bE.match.ID.test(bW[0])&&!bE.match.ID.test(bW[bW.length-1])){b2=by.find(bW.shift(),e,bT);e=b2.expr?by.filter(b2.expr,b2.set)[0]:b2.set[0]}if(e){b2=bZ?{expr:bW.pop(),set:bF(bZ)}:by.find(bW.pop(),bW.length===1&&(bW[0]==="~"||bW[0]==="+")&&e.parentNode?e.parentNode:e,bT);b3=b2.expr?by.filter(b2.expr,b2.set):b2.set;if(bW.length>0){b6=bF(b3)}else{bU=false}while(bW.length){b5=bW.pop();b4=b5;if(!bE.relative[b5]){b5=""}else{b4=bW.pop()}if(b4==null){b4=e}bE.relative[b5](b6,b4,bT)}}else{b6=bW=[]}}if(!b6){b6=b3}if(!b6){by.error(b5||bV)}if(bL.call(b6)==="[object Array]"){if(!bU){bY.push.apply(bY,b6)}else{if(e&&e.nodeType===1){for(bX=0;b6[bX]!=null;bX++){if(b6[bX]&&(b6[bX]===true||b6[bX].nodeType===1&&by.contains(e,b6[bX]))){bY.push(b3[bX])}}}else{for(bX=0;b6[bX]!=null;bX++){if(b6[bX]&&b6[bX].nodeType===1){bY.push(b3[bX])}}}}}else{bF(b6,bY)}if(bR){by(bR,b1,bY,bZ);by.uniqueSort(bY)}return bY};by.uniqueSort=function(bR){if(bJ){bB=bA;bR.sort(bJ);if(bB){for(var e=1;e<bR.length;e++){if(bR[e]===bR[e-1]){bR.splice(e--,1)}}}}return bR};by.matches=function(e,bR){return by(e,null,null,bR)};by.matchesSelector=function(e,bR){return by(bR,null,null,[e]).length>0};by.find=function(bX,e,bY){var bW,bS,bU,bT,bV,bR;if(!bX){return[]}for(bS=0,bU=bE.order.length;bS<bU;bS++){bV=bE.order[bS];if((bT=bE.leftMatch[bV].exec(bX))){bR=bT[1];bT.splice(1,1);if(bR.substr(bR.length-1)!=="\\"){bT[1]=(bT[1]||"").replace(bK,"");bW=bE.find[bV](bT,e,bY);if(bW!=null){bX=bX.replace(bE.match[bV],"");break}}}}if(!bW){bW=typeof e.getElementsByTagName!=="undefined"?e.getElementsByTagName("*"):[]}return{set:bW,expr:bX}};by.filter=function(b1,b0,b4,bU){var bW,e,bZ,b6,b3,bR,bT,bV,b2,bS=b1,b5=[],bY=b0,bX=b0&&b0[0]&&by.isXML(b0[0]);while(b1&&b0.length){for(bZ in bE.filter){if((bW=bE.leftMatch[bZ].exec(b1))!=null&&bW[2]){bR=bE.filter[bZ];bT=bW[1];e=false;bW.splice(1,1);if(bT.substr(bT.length-1)==="\\"){continue}if(bY===b5){b5=[]}if(bE.preFilter[bZ]){bW=bE.preFilter[bZ](bW,bY,b4,b5,bU,bX);if(!bW){e=b6=true}else{if(bW===true){continue}}}if(bW){for(bV=0;(b3=bY[bV])!=null;bV++){if(b3){b6=bR(b3,bW,bV,bY);b2=bU^b6;if(b4&&b6!=null){if(b2){e=true}else{bY[bV]=false}}else{if(b2){b5.push(b3);e=true}}}}}if(b6!==L){if(!b4){bY=b5}b1=b1.replace(bE.match[bZ],"");if(!e){return[]}break}}}if(b1===bS){if(e==null){by.error(b1)}else{break}}bS=b1}return bY};by.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)};var bw=by.getText=function(bU){var bS,bT,e=bU.nodeType,bR="";if(e){if(e===1||e===9){if(typeof bU.textContent==="string"){return bU.textContent}else{if(typeof bU.innerText==="string"){return bU.innerText.replace(bO,"")}else{for(bU=bU.firstChild;bU;bU=bU.nextSibling){bR+=bw(bU)}}}}else{if(e===3||e===4){return bU.nodeValue}}}else{for(bS=0;(bT=bU[bS]);bS++){if(bT.nodeType!==8){bR+=bw(bT)}}}return bR};var bE=by.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(e){return e.getAttribute("href")},type:function(e){return e.getAttribute("type")}},relative:{"+":function(bW,bR){var bT=typeof bR==="string",bV=bT&&!bQ.test(bR),bX=bT&&!bV;if(bV){bR=bR.toLowerCase()}for(var bS=0,e=bW.length,bU;bS<e;bS++){if((bU=bW[bS])){while((bU=bU.previousSibling)&&bU.nodeType!==1){}bW[bS]=bX||bU&&bU.nodeName.toLowerCase()===bR?bU||false:bU===bR}}if(bX){by.filter(bR,bW,true)}},">":function(bW,bR){var bV,bU=typeof bR==="string",bS=0,e=bW.length;if(bU&&!bQ.test(bR)){bR=bR.toLowerCase();for(;bS<e;bS++){bV=bW[bS];if(bV){var bT=bV.parentNode;bW[bS]=bT.nodeName.toLowerCase()===bR?bT:false}}}else{for(;bS<e;bS++){bV=bW[bS];if(bV){bW[bS]=bU?bV.parentNode:bV.parentNode===bR}}if(bU){by.filter(bR,bW,true)}}},"":function(bT,bR,bV){var bU,bS=bI++,e=bN;if(typeof bR==="string"&&!bQ.test(bR)){bR=bR.toLowerCase();bU=bR;e=bv}e("parentNode",bR,bS,bT,bU,bV)},"~":function(bT,bR,bV){var bU,bS=bI++,e=bN;if(typeof bR==="string"&&!bQ.test(bR)){bR=bR.toLowerCase();bU=bR;e=bv}e("previousSibling",bR,bS,bT,bU,bV)}},find:{ID:function(bR,bS,bT){if(typeof bS.getElementById!=="undefined"&&!bT){var e=bS.getElementById(bR[1]);return e&&e.parentNode?[e]:[]}},NAME:function(bS,bV){if(typeof bV.getElementsByName!=="undefined"){var bR=[],bU=bV.getElementsByName(bS[1]);for(var bT=0,e=bU.length;bT<e;bT++){if(bU[bT].getAttribute("name")===bS[1]){bR.push(bU[bT])}}return bR.length===0?null:bR}},TAG:function(e,bR){if(typeof bR.getElementsByTagName!=="undefined"){return bR.getElementsByTagName(e[1])}}},preFilter:{CLASS:function(bT,bR,bS,e,bW,bX){bT=" "+bT[1].replace(bK,"")+" ";if(bX){return bT}for(var bU=0,bV;(bV=bR[bU])!=null;bU++){if(bV){if(bW^(bV.className&&(" "+bV.className+" ").replace(/[\t\n\r]/g," ").indexOf(bT)>=0)){if(!bS){e.push(bV)}}else{if(bS){bR[bU]=false}}}}return false},ID:function(e){return e[1].replace(bK,"")},TAG:function(bR,e){return bR[1].replace(bK,"").toLowerCase()},CHILD:function(e){if(e[1]==="nth"){if(!e[2]){by.error(e[0])}e[2]=e[2].replace(/^\+|\s*/g,"");var bR=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(e[2]==="even"&&"2n"||e[2]==="odd"&&"2n+1"||!/\D/.test(e[2])&&"0n+"+e[2]||e[2]);e[2]=(bR[1]+(bR[2]||1))-0;e[3]=bR[3]-0}else{if(e[2]){by.error(e[0])}}e[0]=bI++;return e},ATTR:function(bU,bR,bS,e,bV,bW){var bT=bU[1]=bU[1].replace(bK,"");if(!bW&&bE.attrMap[bT]){bU[1]=bE.attrMap[bT]}bU[4]=(bU[4]||bU[5]||"").replace(bK,"");if(bU[2]==="~="){bU[4]=" "+bU[4]+" "}return bU},PSEUDO:function(bU,bR,bS,e,bV){if(bU[1]==="not"){if((bH.exec(bU[3])||"").length>1||/^\w/.test(bU[3])){bU[3]=by(bU[3],null,null,bR)}else{var bT=by.filter(bU[3],bR,bS,true^bV);if(!bS){e.push.apply(e,bT)}return false}}else{if(bE.match.POS.test(bU[0])||bE.match.CHILD.test(bU[0])){return true}}return bU},POS:function(e){e.unshift(true);return e}},filters:{enabled:function(e){return e.disabled===false&&e.type!=="hidden"},disabled:function(e){return e.disabled===true},checked:function(e){return e.checked===true},selected:function(e){if(e.parentNode){e.parentNode.selectedIndex}return e.selected===true},parent:function(e){return !!e.firstChild},empty:function(e){return !e.firstChild},has:function(bS,bR,e){return !!by(e[3],bS).length},header:function(e){return(/h\d/i).test(e.nodeName)},text:function(bS){var e=bS.getAttribute("type"),bR=bS.type;return bS.nodeName.toLowerCase()==="input"&&"text"===bR&&(e===bR||e===null)},radio:function(e){return e.nodeName.toLowerCase()==="input"&&"radio"===e.type},checkbox:function(e){return e.nodeName.toLowerCase()==="input"&&"checkbox"===e.type},file:function(e){return e.nodeName.toLowerCase()==="input"&&"file"===e.type},password:function(e){return e.nodeName.toLowerCase()==="input"&&"password"===e.type},submit:function(bR){var e=bR.nodeName.toLowerCase();return(e==="input"||e==="button")&&"submit"===bR.type},image:function(e){return e.nodeName.toLowerCase()==="input"&&"image"===e.type},reset:function(bR){var e=bR.nodeName.toLowerCase();return(e==="input"||e==="button")&&"reset"===bR.type},button:function(bR){var e=bR.nodeName.toLowerCase();return e==="input"&&"button"===bR.type||e==="button"},input:function(e){return(/input|select|textarea|button/i).test(e.nodeName)},focus:function(e){return e===e.ownerDocument.activeElement}},setFilters:{first:function(bR,e){return e===0},last:function(bS,bR,e,bT){return bR===bT.length-1},even:function(bR,e){return e%2===0},odd:function(bR,e){return e%2===1
+},lt:function(bS,bR,e){return bR<e[3]-0},gt:function(bS,bR,e){return bR>e[3]-0},nth:function(bS,bR,e){return e[3]-0===bR},eq:function(bS,bR,e){return e[3]-0===bR}},filter:{PSEUDO:function(bS,bX,bW,bY){var e=bX[1],bR=bE.filters[e];if(bR){return bR(bS,bW,bX,bY)}else{if(e==="contains"){return(bS.textContent||bS.innerText||bw([bS])||"").indexOf(bX[3])>=0}else{if(e==="not"){var bT=bX[3];for(var bV=0,bU=bT.length;bV<bU;bV++){if(bT[bV]===bS){return false}}return true}else{by.error(e)}}}},CHILD:function(bS,bU){var bT,b0,bW,bZ,e,bV,bY,bX=bU[1],bR=bS;switch(bX){case"only":case"first":while((bR=bR.previousSibling)){if(bR.nodeType===1){return false}}if(bX==="first"){return true}bR=bS;case"last":while((bR=bR.nextSibling)){if(bR.nodeType===1){return false}}return true;case"nth":bT=bU[2];b0=bU[3];if(bT===1&&b0===0){return true}bW=bU[0];bZ=bS.parentNode;if(bZ&&(bZ[bC]!==bW||!bS.nodeIndex)){bV=0;for(bR=bZ.firstChild;bR;bR=bR.nextSibling){if(bR.nodeType===1){bR.nodeIndex=++bV}}bZ[bC]=bW}bY=bS.nodeIndex-b0;if(bT===0){return bY===0}else{return(bY%bT===0&&bY/bT>=0)}}},ID:function(bR,e){return bR.nodeType===1&&bR.getAttribute("id")===e},TAG:function(bR,e){return(e==="*"&&bR.nodeType===1)||!!bR.nodeName&&bR.nodeName.toLowerCase()===e},CLASS:function(bR,e){return(" "+(bR.className||bR.getAttribute("class"))+" ").indexOf(e)>-1},ATTR:function(bV,bT){var bS=bT[1],e=by.attr?by.attr(bV,bS):bE.attrHandle[bS]?bE.attrHandle[bS](bV):bV[bS]!=null?bV[bS]:bV.getAttribute(bS),bW=e+"",bU=bT[2],bR=bT[4];return e==null?bU==="!=":!bU&&by.attr?e!=null:bU==="="?bW===bR:bU==="*="?bW.indexOf(bR)>=0:bU==="~="?(" "+bW+" ").indexOf(bR)>=0:!bR?bW&&e!==false:bU==="!="?bW!==bR:bU==="^="?bW.indexOf(bR)===0:bU==="$="?bW.substr(bW.length-bR.length)===bR:bU==="|="?bW===bR||bW.substr(0,bR.length+1)===bR+"-":false},POS:function(bU,bR,bS,bV){var e=bR[2],bT=bE.setFilters[e];if(bT){return bT(bU,bS,bR,bV)}}}};var bD=bE.match.POS,bx=function(bR,e){return"\\"+(e-0+1)};for(var bz in bE.match){bE.match[bz]=new RegExp(bE.match[bz].source+(/(?![^\[]*\])(?![^\(]*\))/.source));bE.leftMatch[bz]=new RegExp(/(^(?:.|\r|\n)*?)/.source+bE.match[bz].source.replace(/\\(\d+)/g,bx))}var bF=function(bR,e){bR=Array.prototype.slice.call(bR,0);if(e){e.push.apply(e,bR);return e}return bR};try{Array.prototype.slice.call(av.documentElement.childNodes,0)[0].nodeType}catch(bP){bF=function(bU,bT){var bS=0,bR=bT||[];if(bL.call(bU)==="[object Array]"){Array.prototype.push.apply(bR,bU)}else{if(typeof bU.length==="number"){for(var e=bU.length;bS<e;bS++){bR.push(bU[bS])}}else{for(;bU[bS];bS++){bR.push(bU[bS])}}}return bR}}var bJ,bG;if(av.documentElement.compareDocumentPosition){bJ=function(bR,e){if(bR===e){bB=true;return 0}if(!bR.compareDocumentPosition||!e.compareDocumentPosition){return bR.compareDocumentPosition?-1:1}return bR.compareDocumentPosition(e)&4?-1:1}}else{bJ=function(bY,bX){if(bY===bX){bB=true;return 0}else{if(bY.sourceIndex&&bX.sourceIndex){return bY.sourceIndex-bX.sourceIndex}}var bV,bR,bS=[],e=[],bU=bY.parentNode,bW=bX.parentNode,bZ=bU;if(bU===bW){return bG(bY,bX)}else{if(!bU){return -1}else{if(!bW){return 1}}}while(bZ){bS.unshift(bZ);bZ=bZ.parentNode}bZ=bW;while(bZ){e.unshift(bZ);bZ=bZ.parentNode}bV=bS.length;bR=e.length;for(var bT=0;bT<bV&&bT<bR;bT++){if(bS[bT]!==e[bT]){return bG(bS[bT],e[bT])}}return bT===bV?bG(bY,e[bT],-1):bG(bS[bT],bX,1)};bG=function(bR,e,bS){if(bR===e){return bS}var bT=bR.nextSibling;while(bT){if(bT===e){return -1}bT=bT.nextSibling}return 1}}(function(){var bR=av.createElement("div"),bS="script"+(new Date()).getTime(),e=av.documentElement;bR.innerHTML="<a name='"+bS+"'/>";e.insertBefore(bR,e.firstChild);if(av.getElementById(bS)){bE.find.ID=function(bU,bV,bW){if(typeof bV.getElementById!=="undefined"&&!bW){var bT=bV.getElementById(bU[1]);return bT?bT.id===bU[1]||typeof bT.getAttributeNode!=="undefined"&&bT.getAttributeNode("id").nodeValue===bU[1]?[bT]:L:[]}};bE.filter.ID=function(bV,bT){var bU=typeof bV.getAttributeNode!=="undefined"&&bV.getAttributeNode("id");return bV.nodeType===1&&bU&&bU.nodeValue===bT}}e.removeChild(bR);e=bR=null})();(function(){var e=av.createElement("div");e.appendChild(av.createComment(""));if(e.getElementsByTagName("*").length>0){bE.find.TAG=function(bR,bV){var bU=bV.getElementsByTagName(bR[1]);if(bR[1]==="*"){var bT=[];for(var bS=0;bU[bS];bS++){if(bU[bS].nodeType===1){bT.push(bU[bS])}}bU=bT}return bU}}e.innerHTML="<a href='#'></a>";if(e.firstChild&&typeof e.firstChild.getAttribute!=="undefined"&&e.firstChild.getAttribute("href")!=="#"){bE.attrHandle.href=function(bR){return bR.getAttribute("href",2)}}e=null})();if(av.querySelectorAll){(function(){var e=by,bT=av.createElement("div"),bS="__sizzle__";bT.innerHTML="<p class='TEST'></p>";if(bT.querySelectorAll&&bT.querySelectorAll(".TEST").length===0){return}by=function(b4,bV,bZ,b3){bV=bV||av;if(!b3&&!by.isXML(bV)){var b2=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b4);if(b2&&(bV.nodeType===1||bV.nodeType===9)){if(b2[1]){return bF(bV.getElementsByTagName(b4),bZ)}else{if(b2[2]&&bE.find.CLASS&&bV.getElementsByClassName){return bF(bV.getElementsByClassName(b2[2]),bZ)}}}if(bV.nodeType===9){if(b4==="body"&&bV.body){return bF([bV.body],bZ)}else{if(b2&&b2[3]){var bY=bV.getElementById(b2[3]);if(bY&&bY.parentNode){if(bY.id===b2[3]){return bF([bY],bZ)}}else{return bF([],bZ)}}}try{return bF(bV.querySelectorAll(b4),bZ)}catch(b0){}}else{if(bV.nodeType===1&&bV.nodeName.toLowerCase()!=="object"){var bW=bV,bX=bV.getAttribute("id"),bU=bX||bS,b6=bV.parentNode,b5=/^\s*[+~]/.test(b4);if(!bX){bV.setAttribute("id",bU)}else{bU=bU.replace(/'/g,"\\$&")}if(b5&&b6){bV=bV.parentNode}try{if(!b5||b6){return bF(bV.querySelectorAll("[id='"+bU+"'] "+b4),bZ)}}catch(b1){}finally{if(!bX){bW.removeAttribute("id")}}}}}return e(b4,bV,bZ,b3)};for(var bR in e){by[bR]=e[bR]}bT=null})()}(function(){var e=av.documentElement,bS=e.matchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.msMatchesSelector;if(bS){var bU=!bS.call(av.createElement("div"),"div"),bR=false;try{bS.call(av.documentElement,"[test!='']:sizzle")}catch(bT){bR=true}by.matchesSelector=function(bW,bY){bY=bY.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!by.isXML(bW)){try{if(bR||!bE.match.PSEUDO.test(bY)&&!/!=/.test(bY)){var bV=bS.call(bW,bY);if(bV||!bU||bW.document&&bW.document.nodeType!==11){return bV}}}catch(bX){}}return by(bY,null,null,[bW]).length>0}}})();(function(){var e=av.createElement("div");e.innerHTML="<div class='test e'></div><div class='test'></div>";if(!e.getElementsByClassName||e.getElementsByClassName("e").length===0){return}e.lastChild.className="e";if(e.getElementsByClassName("e").length===1){return}bE.order.splice(1,0,"CLASS");bE.find.CLASS=function(bR,bS,bT){if(typeof bS.getElementsByClassName!=="undefined"&&!bT){return bS.getElementsByClassName(bR[1])}};e=null})();function bv(bR,bW,bV,bZ,bX,bY){for(var bT=0,bS=bZ.length;bT<bS;bT++){var e=bZ[bT];if(e){var bU=false;e=e[bR];while(e){if(e[bC]===bV){bU=bZ[e.sizset];break}if(e.nodeType===1&&!bY){e[bC]=bV;e.sizset=bT}if(e.nodeName.toLowerCase()===bW){bU=e;break}e=e[bR]}bZ[bT]=bU}}}function bN(bR,bW,bV,bZ,bX,bY){for(var bT=0,bS=bZ.length;bT<bS;bT++){var e=bZ[bT];if(e){var bU=false;e=e[bR];while(e){if(e[bC]===bV){bU=bZ[e.sizset];break}if(e.nodeType===1){if(!bY){e[bC]=bV;e.sizset=bT}if(typeof bW!=="string"){if(e===bW){bU=true;break}}else{if(by.filter(bW,[e]).length>0){bU=e;break}}}e=e[bR]}bZ[bT]=bU}}}if(av.documentElement.contains){by.contains=function(bR,e){return bR!==e&&(bR.contains?bR.contains(e):true)}}else{if(av.documentElement.compareDocumentPosition){by.contains=function(bR,e){return !!(bR.compareDocumentPosition(e)&16)}}else{by.contains=function(){return false}}}by.isXML=function(e){var bR=(e?e.ownerDocument||e:0).documentElement;return bR?bR.nodeName!=="HTML":false};var bM=function(bS,e,bW){var bV,bX=[],bU="",bY=e.nodeType?[e]:e;while((bV=bE.match.PSEUDO.exec(bS))){bU+=bV[0];bS=bS.replace(bE.match.PSEUDO,"")}bS=bE.relative[bS]?bS+"*":bS;for(var bT=0,bR=bY.length;bT<bR;bT++){by(bS,bY[bT],bX,bW)}return by.filter(bU,bX)};by.attr=b.attr;by.selectors.attrMap={};b.find=by;b.expr=by.selectors;b.expr[":"]=b.expr.filters;b.unique=by.uniqueSort;b.text=by.getText;b.isXMLDoc=by.isXML;b.contains=by.contains})();var ab=/Until$/,aq=/^(?:parents|prevUntil|prevAll)/,a9=/,/,bp=/^.[^:#\[\.,]*$/,P=Array.prototype.slice,H=b.expr.match.POS,ay={children:true,contents:true,next:true,prev:true};b.fn.extend({find:function(e){var bw=this,by,bv;if(typeof e!=="string"){return b(e).filter(function(){for(by=0,bv=bw.length;by<bv;by++){if(b.contains(bw[by],this)){return true}}})}var bx=this.pushStack("","find",e),bA,bB,bz;for(by=0,bv=this.length;by<bv;by++){bA=bx.length;b.find(e,this[by],bx);if(by>0){for(bB=bA;bB<bx.length;bB++){for(bz=0;bz<bA;bz++){if(bx[bz]===bx[bB]){bx.splice(bB--,1);break}}}}}return bx},has:function(bv){var e=b(bv);return this.filter(function(){for(var bx=0,bw=e.length;bx<bw;bx++){if(b.contains(this,e[bx])){return true}}})},not:function(e){return this.pushStack(aG(this,e,false),"not",e)},filter:function(e){return this.pushStack(aG(this,e,true),"filter",e)},is:function(e){return !!e&&(typeof e==="string"?H.test(e)?b(e,this.context).index(this[0])>=0:b.filter(e,this).length>0:this.filter(e).length>0)},closest:function(by,bx){var bv=[],bw,e,bz=this[0];if(b.isArray(by)){var bB=1;while(bz&&bz.ownerDocument&&bz!==bx){for(bw=0;bw<by.length;bw++){if(b(bz).is(by[bw])){bv.push({selector:by[bw],elem:bz,level:bB})}}bz=bz.parentNode;bB++}return bv}var bA=H.test(by)||typeof by!=="string"?b(by,bx||this.context):0;for(bw=0,e=this.length;bw<e;bw++){bz=this[bw];while(bz){if(bA?bA.index(bz)>-1:b.find.matchesSelector(bz,by)){bv.push(bz);break}else{bz=bz.parentNode;if(!bz||!bz.ownerDocument||bz===bx||bz.nodeType===11){break}}}}bv=bv.length>1?b.unique(bv):bv;return this.pushStack(bv,"closest",by)},index:function(e){if(!e){return(this[0]&&this[0].parentNode)?this.prevAll().length:-1}if(typeof e==="string"){return b.inArray(this[0],b(e))}return b.inArray(e.jquery?e[0]:e,this)},add:function(e,bv){var bx=typeof e==="string"?b(e,bv):b.makeArray(e&&e.nodeType?[e]:e),bw=b.merge(this.get(),bx);return this.pushStack(C(bx[0])||C(bw[0])?bw:b.unique(bw))},andSelf:function(){return this.add(this.prevObject)}});function C(e){return !e||!e.parentNode||e.parentNode.nodeType===11}b.each({parent:function(bv){var e=bv.parentNode;return e&&e.nodeType!==11?e:null},parents:function(e){return b.dir(e,"parentNode")},parentsUntil:function(bv,e,bw){return b.dir(bv,"parentNode",bw)},next:function(e){return b.nth(e,2,"nextSibling")},prev:function(e){return b.nth(e,2,"previousSibling")},nextAll:function(e){return b.dir(e,"nextSibling")},prevAll:function(e){return b.dir(e,"previousSibling")},nextUntil:function(bv,e,bw){return b.dir(bv,"nextSibling",bw)},prevUntil:function(bv,e,bw){return b.dir(bv,"previousSibling",bw)},siblings:function(e){return b.sibling(e.parentNode.firstChild,e)},children:function(e){return b.sibling(e.firstChild)},contents:function(e){return b.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:b.makeArray(e.childNodes)}},function(e,bv){b.fn[e]=function(by,bw){var bx=b.map(this,bv,by);if(!ab.test(e)){bw=by}if(bw&&typeof bw==="string"){bx=b.filter(bw,bx)}bx=this.length>1&&!ay[e]?b.unique(bx):bx;if((this.length>1||a9.test(bw))&&aq.test(e)){bx=bx.reverse()}return this.pushStack(bx,e,P.call(arguments).join(","))}});b.extend({filter:function(bw,e,bv){if(bv){bw=":not("+bw+")"}return e.length===1?b.find.matchesSelector(e[0],bw)?[e[0]]:[]:b.find.matches(bw,e)},dir:function(bw,bv,by){var e=[],bx=bw[bv];while(bx&&bx.nodeType!==9&&(by===L||bx.nodeType!==1||!b(bx).is(by))){if(bx.nodeType===1){e.push(bx)}bx=bx[bv]}return e},nth:function(by,e,bw,bx){e=e||1;var bv=0;for(;by;by=by[bw]){if(by.nodeType===1&&++bv===e){break}}return by},sibling:function(bw,bv){var e=[];for(;bw;bw=bw.nextSibling){if(bw.nodeType===1&&bw!==bv){e.push(bw)}}return e}});function aG(bx,bw,e){bw=bw||0;if(b.isFunction(bw)){return b.grep(bx,function(bz,by){var bA=!!bw.call(bz,by,bz);return bA===e})}else{if(bw.nodeType){return b.grep(bx,function(bz,by){return(bz===bw)===e})}else{if(typeof bw==="string"){var bv=b.grep(bx,function(by){return by.nodeType===1});if(bp.test(bw)){return b.filter(bw,bv,!e)}else{bw=b.filter(bw,bv)}}}}return b.grep(bx,function(bz,by){return(b.inArray(bz,bw)>=0)===e})}function a(e){var bw=aR.split("|"),bv=e.createDocumentFragment();if(bv.createElement){while(bw.length){bv.createElement(bw.pop())}}return bv}var aR="abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",ag=/ jQuery\d+="(?:\d+|null)"/g,ar=/^\s+/,R=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,d=/<([\w:]+)/,w=/<tbody/i,W=/<|&#?\w+;/,ae=/<(?:script|style)/i,O=/<(?:script|object|embed|option|style)/i,ah=new RegExp("<(?:"+aR+")","i"),o=/checked\s*(?:[^=]|=\s*.checked.)/i,bm=/\/(java|ecma)script/i,aN=/^\s*<!(?:\[CDATA\[|\-\-)/,ax={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]},ac=a(av);
+ax.optgroup=ax.option;ax.tbody=ax.tfoot=ax.colgroup=ax.caption=ax.thead;ax.th=ax.td;if(!b.support.htmlSerialize){ax._default=[1,"div<div>","</div>"]}b.fn.extend({text:function(e){if(b.isFunction(e)){return this.each(function(bw){var bv=b(this);bv.text(e.call(this,bw,bv.text()))})}if(typeof e!=="object"&&e!==L){return this.empty().append((this[0]&&this[0].ownerDocument||av).createTextNode(e))}return b.text(this)},wrapAll:function(e){if(b.isFunction(e)){return this.each(function(bw){b(this).wrapAll(e.call(this,bw))})}if(this[0]){var bv=b(e,this[0].ownerDocument).eq(0).clone(true);if(this[0].parentNode){bv.insertBefore(this[0])}bv.map(function(){var bw=this;while(bw.firstChild&&bw.firstChild.nodeType===1){bw=bw.firstChild}return bw}).append(this)}return this},wrapInner:function(e){if(b.isFunction(e)){return this.each(function(bv){b(this).wrapInner(e.call(this,bv))})}return this.each(function(){var bv=b(this),bw=bv.contents();if(bw.length){bw.wrapAll(e)}else{bv.append(e)}})},wrap:function(e){var bv=b.isFunction(e);return this.each(function(bw){b(this).wrapAll(bv?e.call(this,bw):e)})},unwrap:function(){return this.parent().each(function(){if(!b.nodeName(this,"body")){b(this).replaceWith(this.childNodes)}}).end()},append:function(){return this.domManip(arguments,true,function(e){if(this.nodeType===1){this.appendChild(e)}})},prepend:function(){return this.domManip(arguments,true,function(e){if(this.nodeType===1){this.insertBefore(e,this.firstChild)}})},before:function(){if(this[0]&&this[0].parentNode){return this.domManip(arguments,false,function(bv){this.parentNode.insertBefore(bv,this)})}else{if(arguments.length){var e=b.clean(arguments);e.push.apply(e,this.toArray());return this.pushStack(e,"before",arguments)}}},after:function(){if(this[0]&&this[0].parentNode){return this.domManip(arguments,false,function(bv){this.parentNode.insertBefore(bv,this.nextSibling)})}else{if(arguments.length){var e=this.pushStack(this,"after",arguments);e.push.apply(e,b.clean(arguments));return e}}},remove:function(e,bx){for(var bv=0,bw;(bw=this[bv])!=null;bv++){if(!e||b.filter(e,[bw]).length){if(!bx&&bw.nodeType===1){b.cleanData(bw.getElementsByTagName("*"));b.cleanData([bw])}if(bw.parentNode){bw.parentNode.removeChild(bw)}}}return this},empty:function(){for(var e=0,bv;(bv=this[e])!=null;e++){if(bv.nodeType===1){b.cleanData(bv.getElementsByTagName("*"))}while(bv.firstChild){bv.removeChild(bv.firstChild)}}return this},clone:function(bv,e){bv=bv==null?false:bv;e=e==null?bv:e;return this.map(function(){return b.clone(this,bv,e)})},html:function(bx){if(bx===L){return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(ag,""):null}else{if(typeof bx==="string"&&!ae.test(bx)&&(b.support.leadingWhitespace||!ar.test(bx))&&!ax[(d.exec(bx)||["",""])[1].toLowerCase()]){bx=bx.replace(R,"<$1></$2>");try{for(var bw=0,bv=this.length;bw<bv;bw++){if(this[bw].nodeType===1){b.cleanData(this[bw].getElementsByTagName("*"));this[bw].innerHTML=bx}}}catch(by){this.empty().append(bx)}}else{if(b.isFunction(bx)){this.each(function(bz){var e=b(this);e.html(bx.call(this,bz,e.html()))})}else{this.empty().append(bx)}}}return this},replaceWith:function(e){if(this[0]&&this[0].parentNode){if(b.isFunction(e)){return this.each(function(bx){var bw=b(this),bv=bw.html();bw.replaceWith(e.call(this,bx,bv))})}if(typeof e!=="string"){e=b(e).detach()}return this.each(function(){var bw=this.nextSibling,bv=this.parentNode;b(this).remove();if(bw){b(bw).before(e)}else{b(bv).append(e)}})}else{return this.length?this.pushStack(b(b.isFunction(e)?e():e),"replaceWith",e):this}},detach:function(e){return this.remove(e,true)},domManip:function(bB,bF,bE){var bx,by,bA,bD,bC=bB[0],bv=[];if(!b.support.checkClone&&arguments.length===3&&typeof bC==="string"&&o.test(bC)){return this.each(function(){b(this).domManip(bB,bF,bE,true)})}if(b.isFunction(bC)){return this.each(function(bH){var bG=b(this);bB[0]=bC.call(this,bH,bF?bG.html():L);bG.domManip(bB,bF,bE)})}if(this[0]){bD=bC&&bC.parentNode;if(b.support.parentNode&&bD&&bD.nodeType===11&&bD.childNodes.length===this.length){bx={fragment:bD}}else{bx=b.buildFragment(bB,this,bv)}bA=bx.fragment;if(bA.childNodes.length===1){by=bA=bA.firstChild}else{by=bA.firstChild}if(by){bF=bF&&b.nodeName(by,"tr");for(var bw=0,e=this.length,bz=e-1;bw<e;bw++){bE.call(bF?ba(this[bw],by):this[bw],bx.cacheable||(e>1&&bw<bz)?b.clone(bA,true,true):bA)}}if(bv.length){b.each(bv,bo)}}return this}});function ba(e,bv){return b.nodeName(e,"table")?(e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody"))):e}function t(bB,bv){if(bv.nodeType!==1||!b.hasData(bB)){return}var by,bx,e,bA=b._data(bB),bz=b._data(bv,bA),bw=bA.events;if(bw){delete bz.handle;bz.events={};for(by in bw){for(bx=0,e=bw[by].length;bx<e;bx++){b.event.add(bv,by+(bw[by][bx].namespace?".":"")+bw[by][bx].namespace,bw[by][bx],bw[by][bx].data)}}}if(bz.data){bz.data=b.extend({},bz.data)}}function ai(bv,e){var bw;if(e.nodeType!==1){return}if(e.clearAttributes){e.clearAttributes()}if(e.mergeAttributes){e.mergeAttributes(bv)}bw=e.nodeName.toLowerCase();if(bw==="object"){e.outerHTML=bv.outerHTML}else{if(bw==="input"&&(bv.type==="checkbox"||bv.type==="radio")){if(bv.checked){e.defaultChecked=e.checked=bv.checked}if(e.value!==bv.value){e.value=bv.value}}else{if(bw==="option"){e.selected=bv.defaultSelected}else{if(bw==="input"||bw==="textarea"){e.defaultValue=bv.defaultValue}}}}e.removeAttribute(b.expando)}b.buildFragment=function(bz,bx,bv){var by,e,bw,bA,bB=bz[0];if(bx&&bx[0]){bA=bx[0].ownerDocument||bx[0]}if(!bA.createDocumentFragment){bA=av}if(bz.length===1&&typeof bB==="string"&&bB.length<512&&bA===av&&bB.charAt(0)==="<"&&!O.test(bB)&&(b.support.checkClone||!o.test(bB))&&(b.support.html5Clone||!ah.test(bB))){e=true;bw=b.fragments[bB];if(bw&&bw!==1){by=bw}}if(!by){by=bA.createDocumentFragment();b.clean(bz,bA,by,bv)}if(e){b.fragments[bB]=bw?by:1}return{fragment:by,cacheable:e}};b.fragments={};b.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,bv){b.fn[e]=function(bw){var bz=[],bC=b(bw),bB=this.length===1&&this[0].parentNode;if(bB&&bB.nodeType===11&&bB.childNodes.length===1&&bC.length===1){bC[bv](this[0]);return this}else{for(var bA=0,bx=bC.length;bA<bx;bA++){var by=(bA>0?this.clone(true):this).get();b(bC[bA])[bv](by);bz=bz.concat(by)}return this.pushStack(bz,e,bC.selector)}}});function bg(e){if(typeof e.getElementsByTagName!=="undefined"){return e.getElementsByTagName("*")}else{if(typeof e.querySelectorAll!=="undefined"){return e.querySelectorAll("*")}else{return[]}}}function az(e){if(e.type==="checkbox"||e.type==="radio"){e.defaultChecked=e.checked}}function E(e){var bv=(e.nodeName||"").toLowerCase();if(bv==="input"){az(e)}else{if(bv!=="script"&&typeof e.getElementsByTagName!=="undefined"){b.grep(e.getElementsByTagName("input"),az)}}}function al(e){var bv=av.createElement("div");ac.appendChild(bv);bv.innerHTML=e.outerHTML;return bv.firstChild}b.extend({clone:function(by,bA,bw){var e,bv,bx,bz=b.support.html5Clone||!ah.test("<"+by.nodeName)?by.cloneNode(true):al(by);if((!b.support.noCloneEvent||!b.support.noCloneChecked)&&(by.nodeType===1||by.nodeType===11)&&!b.isXMLDoc(by)){ai(by,bz);e=bg(by);bv=bg(bz);for(bx=0;e[bx];++bx){if(bv[bx]){ai(e[bx],bv[bx])}}}if(bA){t(by,bz);if(bw){e=bg(by);bv=bg(bz);for(bx=0;e[bx];++bx){t(e[bx],bv[bx])}}}e=bv=null;return bz},clean:function(bw,by,bH,bA){var bF;by=by||av;if(typeof by.createElement==="undefined"){by=by.ownerDocument||by[0]&&by[0].ownerDocument||av}var bI=[],bB;for(var bE=0,bz;(bz=bw[bE])!=null;bE++){if(typeof bz==="number"){bz+=""}if(!bz){continue}if(typeof bz==="string"){if(!W.test(bz)){bz=by.createTextNode(bz)}else{bz=bz.replace(R,"<$1></$2>");var bK=(d.exec(bz)||["",""])[1].toLowerCase(),bx=ax[bK]||ax._default,bD=bx[0],bv=by.createElement("div");if(by===av){ac.appendChild(bv)}else{a(by).appendChild(bv)}bv.innerHTML=bx[1]+bz+bx[2];while(bD--){bv=bv.lastChild}if(!b.support.tbody){var e=w.test(bz),bC=bK==="table"&&!e?bv.firstChild&&bv.firstChild.childNodes:bx[1]==="<table>"&&!e?bv.childNodes:[];for(bB=bC.length-1;bB>=0;--bB){if(b.nodeName(bC[bB],"tbody")&&!bC[bB].childNodes.length){bC[bB].parentNode.removeChild(bC[bB])}}}if(!b.support.leadingWhitespace&&ar.test(bz)){bv.insertBefore(by.createTextNode(ar.exec(bz)[0]),bv.firstChild)}bz=bv.childNodes}}var bG;if(!b.support.appendChecked){if(bz[0]&&typeof(bG=bz.length)==="number"){for(bB=0;bB<bG;bB++){E(bz[bB])}}else{E(bz)}}if(bz.nodeType){bI.push(bz)}else{bI=b.merge(bI,bz)}}if(bH){bF=function(bL){return !bL.type||bm.test(bL.type)};for(bE=0;bI[bE];bE++){if(bA&&b.nodeName(bI[bE],"script")&&(!bI[bE].type||bI[bE].type.toLowerCase()==="text/javascript")){bA.push(bI[bE].parentNode?bI[bE].parentNode.removeChild(bI[bE]):bI[bE])}else{if(bI[bE].nodeType===1){var bJ=b.grep(bI[bE].getElementsByTagName("script"),bF);bI.splice.apply(bI,[bE+1,0].concat(bJ))}bH.appendChild(bI[bE])}}}return bI},cleanData:function(bv){var by,bw,e=b.cache,bB=b.event.special,bA=b.support.deleteExpando;for(var bz=0,bx;(bx=bv[bz])!=null;bz++){if(bx.nodeName&&b.noData[bx.nodeName.toLowerCase()]){continue}bw=bx[b.expando];if(bw){by=e[bw];if(by&&by.events){for(var bC in by.events){if(bB[bC]){b.event.remove(bx,bC)}else{b.removeEvent(bx,bC,by.handle)}}if(by.handle){by.handle.elem=null}}if(bA){delete bx[b.expando]}else{if(bx.removeAttribute){bx.removeAttribute(b.expando)}}delete e[bw]}}}});function bo(e,bv){if(bv.src){b.ajax({url:bv.src,async:false,dataType:"script"})}else{b.globalEval((bv.text||bv.textContent||bv.innerHTML||"").replace(aN,"/*$0*/"))}if(bv.parentNode){bv.parentNode.removeChild(bv)}}var ak=/alpha\([^)]*\)/i,au=/opacity=([^)]*)/,z=/([A-Z]|^ms)/g,bc=/^-?\d+(?:px)?$/i,bn=/^-?\d/,I=/^([\-+])=([\-+.\de]+)/,a7={position:"absolute",visibility:"hidden",display:"block"},an=["Left","Right"],a1=["Top","Bottom"],Z,aI,aX;b.fn.css=function(e,bv){if(arguments.length===2&&bv===L){return this}return b.access(this,e,bv,true,function(bx,bw,by){return by!==L?b.style(bx,bw,by):b.css(bx,bw)})};b.extend({cssHooks:{opacity:{get:function(bw,bv){if(bv){var e=Z(bw,"opacity","opacity");return e===""?"1":e}else{return bw.style.opacity}}}},cssNumber:{fillOpacity:true,fontWeight:true,lineHeight:true,opacity:true,orphans:true,widows:true,zIndex:true,zoom:true},cssProps:{"float":b.support.cssFloat?"cssFloat":"styleFloat"},style:function(bx,bw,bD,by){if(!bx||bx.nodeType===3||bx.nodeType===8||!bx.style){return}var bB,bC,bz=b.camelCase(bw),bv=bx.style,bE=b.cssHooks[bz];bw=b.cssProps[bz]||bz;if(bD!==L){bC=typeof bD;if(bC==="string"&&(bB=I.exec(bD))){bD=(+(bB[1]+1)*+bB[2])+parseFloat(b.css(bx,bw));bC="number"}if(bD==null||bC==="number"&&isNaN(bD)){return}if(bC==="number"&&!b.cssNumber[bz]){bD+="px"}if(!bE||!("set" in bE)||(bD=bE.set(bx,bD))!==L){try{bv[bw]=bD}catch(bA){}}}else{if(bE&&"get" in bE&&(bB=bE.get(bx,false,by))!==L){return bB}return bv[bw]}},css:function(by,bx,bv){var bw,e;bx=b.camelCase(bx);e=b.cssHooks[bx];bx=b.cssProps[bx]||bx;if(bx==="cssFloat"){bx="float"}if(e&&"get" in e&&(bw=e.get(by,true,bv))!==L){return bw}else{if(Z){return Z(by,bx)}}},swap:function(bx,bw,by){var e={};for(var bv in bw){e[bv]=bx.style[bv];bx.style[bv]=bw[bv]}by.call(bx);for(bv in bw){bx.style[bv]=e[bv]}}});b.curCSS=b.css;b.each(["height","width"],function(bv,e){b.cssHooks[e]={get:function(by,bx,bw){var bz;if(bx){if(by.offsetWidth!==0){return p(by,e,bw)}else{b.swap(by,a7,function(){bz=p(by,e,bw)})}return bz}},set:function(bw,bx){if(bc.test(bx)){bx=parseFloat(bx);if(bx>=0){return bx+"px"}}else{return bx}}}});if(!b.support.opacity){b.cssHooks.opacity={get:function(bv,e){return au.test((e&&bv.currentStyle?bv.currentStyle.filter:bv.style.filter)||"")?(parseFloat(RegExp.$1)/100)+"":e?"1":""},set:function(by,bz){var bx=by.style,bv=by.currentStyle,e=b.isNumeric(bz)?"alpha(opacity="+bz*100+")":"",bw=bv&&bv.filter||bx.filter||"";bx.zoom=1;if(bz>=1&&b.trim(bw.replace(ak,""))===""){bx.removeAttribute("filter");if(bv&&!bv.filter){return}}bx.filter=ak.test(bw)?bw.replace(ak,e):bw+" "+e}}}b(function(){if(!b.support.reliableMarginRight){b.cssHooks.marginRight={get:function(bw,bv){var e;b.swap(bw,{display:"inline-block"},function(){if(bv){e=Z(bw,"margin-right","marginRight")}else{e=bw.style.marginRight}});return e}}}});if(av.defaultView&&av.defaultView.getComputedStyle){aI=function(by,bw){var bv,bx,e;bw=bw.replace(z,"-$1").toLowerCase();if((bx=by.ownerDocument.defaultView)&&(e=bx.getComputedStyle(by,null))){bv=e.getPropertyValue(bw);if(bv===""&&!b.contains(by.ownerDocument.documentElement,by)){bv=b.style(by,bw)}}return bv}}if(av.documentElement.currentStyle){aX=function(bz,bw){var bA,e,by,bv=bz.currentStyle&&bz.currentStyle[bw],bx=bz.style;if(bv===null&&bx&&(by=bx[bw])){bv=by}if(!bc.test(bv)&&bn.test(bv)){bA=bx.left;e=bz.runtimeStyle&&bz.runtimeStyle.left;if(e){bz.runtimeStyle.left=bz.currentStyle.left}bx.left=bw==="fontSize"?"1em":(bv||0);bv=bx.pixelLeft+"px";bx.left=bA;if(e){bz.runtimeStyle.left=e}}return bv===""?"auto":bv}}Z=aI||aX;function p(by,bw,bv){var bA=bw==="width"?by.offsetWidth:by.offsetHeight,bz=bw==="width"?an:a1,bx=0,e=bz.length;
index c31afa7..7c905ef 100644 (file)
@@ -1,3 +1,10 @@
-"f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!=\"undefined\"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(\" \");for(k=0;k<c.length;k++){l=A.exec(c[k])||[],m=l[1],n=(l[2]||\"\").split(\".\").sort(),s=f.event.special[m]||{},m=(g?s.delegateType:s.bindType)||m,s=f.event.special[m]||{},o=f.extend({type:m,origType:l[1],data:e,handler:d,guid:d.guid,selector:g,quick:G(g),namespace:n.join(\".\")},p),r=j[m];if(!r){r=j[m]=[],r.delegateCount=0;if(!s.setup||s.setup.call(a,e,n,i)===!1)a.addEventListener?a.addEventListener(m,i,!1):a.attachEvent&&a.attachEvent(\"on\"+m,i)}s.add&&(s.add.call(a,o),o.handler.guid||(o.handler.guid=d.guid)),g?r.splice(r.delegateCount++,0,o):r.push(o),f.event.global[m]=!0}a=null}},global:{},remove:function(a,b,c,d,e){var g=f.hasData(a)&&f._data(a),h,i,j,k,l,m,n,o,p,q,r,s;if(!!g&&!!(o=g.events)){b=f.trim(I(b||\"\")).split(\" \");for(h=0;h<b.length;h++){i=A.exec(b[h])||[],j=k=i[1],l=i[2];if(!j){for(j in o)f.event.remove(a,j+b[h],c,d,!0);continue}p=f.event.special[j]||{},j=(d?p.delegateType:p.bindType)||j,r=o[j]||[],m=r.length,l=l?new RegExp(\"(^|\\\\.)\"+l.split(\".\").sort().join(\"\\\\.(?:.*\\\\.)?\")+\"(\\\\.|$)\"):null;for(n=0;n<r.length;n++)s=r[n],(e||k===s.origType)&&(!c||c.guid===s.guid)&&(!l||l.test(s.namespace))&&(!d||d===s.selector||d===\"**\"&&s.selector)&&(r.splice(n--,1),s.selector&&r.delegateCount--,p.remove&&p.remove.call(a,s));r.length===0&&m!==r.length&&((!p.teardown||p.teardown.call(a,l)===!1)&&f.removeEvent(a,j,g.handle),delete o[j])}f.isEmptyObject(o)&&(q=g.handle,q&&(q.elem=null),f.removeData(a,[\"events\",\"handle\"],!0))}},customEvent:{getData:!0,setData:!0,changeData:!0},trigger:function(c,d,e,g){if(!e||e.nodeType!==3&&e.nodeType!==8){var h=c.type||c,i=[],j,k,l,m,n,o,p,q,r,s;if(E.test(h+f.event.triggered))return;h.indexOf(\"!\")>=0&&(h=h.slice(0,-1),k=!0),h.indexOf(\".\")>=0&&(i=h.split(\".\"),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c==\"object\"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join(\".\"),c.namespace_re=c.namespace?new RegExp(\"(^|\\\\.)\"+i.join(\"\\\\.(?:.*\\\\.)?\")+\"(\\\\.|$)\"):null,o=h.indexOf(\":\")<0?\"on\"+h:\"\";if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;l<r.length&&!c.isPropagationStopped();l++)m=r[l][0],c.type=r[l][1],q=(f._data(m,\"events\")||{})[c.type]&&f._data(m,\"handle\"),q&&q.apply(m,d),q=o&&m[o],q&&f.acceptData(m)&&q.apply(m,d)===!1&&c.preventDefault();c.type=h,!g&&!c.isDefaultPrevented()&&(!p._default||p._default.apply(e.ownerDocument,d)===!1)&&(h!==\"click\"||!f.nodeName(e,\"a\"))&&f.acceptData(e)&&o&&e[h]&&(h!==\"focus\"&&h!==\"blur\"||c.target.offsetWidth!==0)&&!f.isWindow(e)&&(n=e[o],n&&(e[o]=null),f.event.triggered=h,e[h](),f.event.triggered=b,n&&(e[o]=n));return c.result}},dispatch:function(c){c=f.event.fix(c||a.event);var d=(f._data(this,\"events\")||{})[c.type]||[],e=d.delegateCount,g=[].slice.call(arguments,0),h=!c.exclusive&&!c.namespace,i=[],j,k,l,m,n,o,p,q,r,s,t;g[0]=c,c.delegateTarget=this;if(e&&!c.target.disabled&&(!c.button||c.type!==\"click\")){m=f(this),m.context=this.ownerDocument||this;for(l=c.target;l!=this;l=l.parentNode||this){o={},q=[],m[0]=l;for(j=0;j<e;j++)r=d[j],s=r.selector,o[s]===b&&(o[s]=r.quick?H(l,r.quick):m.is(s)),o[s]&&q.push(r);q.length&&i.push({elem:l,matches:q})}}d.length>e&&i.push({elem:this,matches:d.slice(e)});for(j=0;j<i.length&&!c.isPropagationStopped();j++){p=i[j],c.currentTarget=p.elem;for(k=0;k<p.matches.length&&!c.isImmediatePropagationStopped();k++){r=p.matches[k];if(h||!c.namespace&&!r.namespace||c.namespace_re&&c.namespace_re.test(r.namespace))c.data=r.data,c.handleObj=r,n=((f.event.special[r.origType]||{}).handle||r.handler).apply(p.elem,g),n!==b&&(c.result=n,n===!1&&(c.preventDefault(),c.stopPropagation()))}}return c.result},props:\"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which\".split(\" \"),fixHooks:{},keyHooks:{props:\"char charCode key keyCode\".split(\" \"),filter:function(a,b){a.which==null&&(a.which=b.charCode!=null?b.charCode:b.keyCode);return a}},mouseHooks:{props:\"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement\".split(\" \"),filter:function(a,d){var e,f,g,h=d.button,i=d.fromElement;a.pageX==null&&d.clientX!=null&&(e=a.target.ownerDocument||c,f=e.documentElement,g=e.body,a.pageX=d.clientX+(f&&f.scrollLeft||g&&g.scrollLeft||0)-(f&&f.clientLeft||g&&g.clientLeft||0),a.pageY=d.clientY+(f&&f.scrollTop||g&&g.scrollTop||0)-(f&&f.clientTop||g&&g.clientTop||0)),!a.relatedTarget&&i&&(a.relatedTarget=i===a.target?d.toElement:i),!a.which&&h!==b&&(a.which=h&1?1:h&2?3:h&4?2:0);return a}},fix:function(a){if(a[f.expando])return a;var d,e,g=a,h=f.event.fixHooks[a.type]||{},i=h.props?this.props.concat(h.props):this.props;a=f.Event(g);for(d=i.length;d;)e=i[--d],a[e]=g[e];a.target||(a.target=g.srcElement||c),a.target.nodeType===3&&(a.target=a.target.parentNode),a.metaKey===b&&(a.metaKey=a.ctrlKey);return h.filter?h.filter(a,g):a},special:{ready:{setup:f.bindReady},load:{noBubble:!0},focus:{delegateType:\"focusin\"},blur:{delegateType:\"focusout\"},beforeunload:{setup:function(a,b,c){f.isWindow(this)&&(this.onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeunload=null)}}},simulate:function(a,b,c,d){var e=f.extend(new f.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?f.event.trigger(e,null,b):f.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},f.event.handle=f.event.dispatch,f.removeEvent=c.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){a.detachEvent&&a.detachEvent(\"on\"+b,c)},f.Event=function(a,b){if(!(this instanceof f.Event))return new f.Event(a,b);a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?K:J):this.type=a,b&&f.extend(this,b),this.timeStamp=a&&a.timeStamp||f.now(),this[f.expando]=!0},f.Event.prototype={preventDefault:function(){this.isDefaultPrevented=K;var a=this.originalEvent;!a||(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){this.isPropagationStopped=K;var a=this.originalEvent;!a||(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=K,this.stopPropagation()},isDefaultPrevented:J,isPropagationStopped:J,isImmediatePropagationStopped:J},f.each({mouseenter:\"mouseover\",mouseleave:\"mouseout\"},function(a,b){f.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c=this,d=a.relatedTarget,e=a.handleObj,g=e.selector,h;if(!d||d!==c&&!f.contains(c,d))a.type=e.origType,h=e.handler.apply(this,arguments),a.type=b;return h}}}),f.support.submitBubbles||(f.event.special.submit={setup:function(){if(f.nodeName(this,\"form\"))return!1;f.event.add(this,\"click._submit keypress._submit\",function(a){var c=a.target,d=f.nodeName(c,\"input\")||f.nodeName(c,\"button\")?c.form:b;d&&!d._submit_attached&&(f.event.add(d,\"submit._submit\",function(a){this.parentNode&&!a.isTrigger&&f.event.simulate(\"submit\",this.parentNode,a,!0)}),d._submit_attached=!0)})},teardown:function(){if(f.nodeName(this,\"form\"))return!1;f.event.remove(this,\"._submit\")}}),f.support.changeBubbles||(f.event.special.change={setup:function(){if(z.test(this.nodeName)){if(this.type===\"checkbox\"||this.type===\"radio\")f.event.add(this,\"propertychange._change\",function(a){a.originalEvent.propertyName===\"checked\"&&(this._just_changed=!0)}),f.event.add(this,\"click._change\",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1,f.event.simulate(\"change\",this,a,!0))});return!1}f.event.add(this,\"beforeactivate._change\",function(a){var b=a.target;z.test(b.nodeName)&&!b._change_attached&&(f.event.add(b,\"change._change\",function(a){this.parentNode&&!a.isSimulated&&!a.isTrigger&&f.event.simulate(\"change\",this.parentNode,a,!0)}),b._change_attached=!0)})},handle:function(a){var b=a.target;if(this!==b||a.isSimulated||a.isTrigger||b.type!==\"radio\"&&b.type!==\"checkbox\")return a.handleObj.handler.apply(this,arguments)},teardown:function(){f.event.remove(this,\"._change\");return z.test(this.nodeName)}}),f.support.focusinBubbles||f.each({focus:\"focusin\",blur:\"focusout\"},function(a,b){var d=0,e=function(a){f.event.simulate(b,a.target,f.event.fix(a),!0)};f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.fn.extend({on:function(a,c,d,e,g){var h,i;if(typeof a==\"object\"){typeof c!=\"string\"&&(d=c,c=b);for(i in a)this.on(i,c,d,a[i],g);return this}d==null&&e==null?(e=c,d=c=b):e==null&&(typeof c==\"string\"?(e=d,d=b):(e=d,d=c,c=b));if(e===!1)e=J;else if(!e)return this;g===1&&(h=e,e=function(a){f().off(a);return h.apply(this,arguments)},e.guid=h.guid||(h.guid=f.guid++));return this.each(function(){f.event.add(this,a,e,d,c)})},one:function(a,b,c,d){return this.on.call(this,a,b,c,d,1)},off:function(a,c,d){if(a&&a.preventDefault&&a.handleObj){var e=a.handleObj;f(a.delegateTarget).off(e.namespace?e.type+\".\"+e.namespace:e.type,e.selector,e.handler);return this}if(typeof a==\"object\"){for(var g in a)this.off(g,c,a[g]);return this}if(c===!1||typeof c==\"function\")d=c,c=b;d===!1&&(d=J);return this.each(function(){f.event.remove(this,a,d,c)})},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},live:function(a,b,c){f(this.context).on(a,this.selector,b,c);return this},die:function(a,b){f(this.context).off(a,this.selector||\"**\",b);return this},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return arguments.length==1?this.off(a,\"**\"):this.off(b,a,c)},trigger:function(a,b){return this.each(function(){f.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0])return f.event.trigger(a,b,this[0],!0)},toggle:function(a){var b=arguments,c=a.guid||f.guid++,d=0,e=function(c){var e=(f._data(this,\"lastToggle\"+a.guid)||0)%d;f._data(this,\"lastToggle\"+a.guid,e+1),c.preventDefault();return b[e].apply(this,arguments)||!1};e.guid=c;while(d<b.length)b[d++].guid=c;return this.click(e)},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),f.each(\"blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu\".split(\" \"),function(a,b){f.fn[b]=function(a,c){c==null&&(c=a,a=null);return arguments.length>0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h<i;h++){var j=e[h];if(j){var k=!1;j=j[a];while(j){if(j[d]===c){k=e[j.sizset];break}if(j.nodeType===1){g||(j[d]=c,j.sizset=h);if(typeof b!=\"string\"){if(j===b){k=!0;break}}else if(m.filter(b,[j]).length>0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h<i;h++){var j=e[h];if(j){var k=!1;j=j[a];while(j){if(j[d]===c){k=e[j.sizset];break}j.nodeType===1&&!g&&(j[d]=c,j.sizset=h);if(j.nodeName.toLowerCase()===b){k=j;break}j=j[a]}e[h]=k}}}var a=/((?:\\((?:\\([^()]+\\)|[^()]+)+\\)|\\[(?:\\[[^\\[\\]]*\\]|['\"][^'\"]*['\"]|[^\\[\\]'\"]+)+\\]|\\\\.|[^ >+~,(\\[\\\\]+)+|[>+~])(\\s*,\\s*)?((?:.|\\r|\\n)*)/g,d=\"sizcache\"+(Math.random()+\"\").replace(\".\",\"\"),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\\\/g,k=/\\r\\n/g,l=/\\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!=\"string\")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(\"\"),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]===\"~\"||w[0]===\"+\")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q=\"\",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)===\"[object Array]\")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b<a.length;b++)a[b]===a[b-1]&&a.splice(b--,1)}return a},m.matches=function(a,b){return m(a,null,null,b)},m.matchesSelector=function(a,b){return m(b,null,null,[a]).length>0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e<f;e++){h=o.order[e];if(g=o.leftMatch[h].exec(a)){i=g[1],g.splice(1,1);if(i.substr(i.length-1)!==\"\\\\\"){g[1]=(g[1]||\"\").replace(j,\"\"),d=o.find[h](g,b,c);if(d!=null){a=a.replace(o.match[h],\"\");break}}}}d||(d=typeof b.getElementsByTagName!=\"undefined\"?b.getElementsByTagName(\"*\"):[]);return{set:d,expr:a}},m.filter=function(a,c,d,e){var f,g,h,i,j,k,l,n,p,q=a,r=[],s=c,t=c&&c[0]&&m.isXML(c[0]);while(a&&c.length){for(h in o.filter)if((f=o.leftMatch[h].exec(a))!=null&&f[2]){k=o.filter[h],l=f[1],g=!1,f.splice(1,1);if(l.substr(l.length-1)===\"\\\\\")continue;s===r&&(r=[]);if(o.preFilter[h]){f=o.preFilter[h](f,s,d,r,e,t);if(!f)g=i=!0;else if(f===!0)continue}if(f)for(n=0;(j=s[n])!=null;n++)j&&(i=k(j,f,n,s),p=e^i,d&&i!=null?p?g=!0:s[n]=!1:p&&(r.push(j),g=!0));if(i!==b){d||(s=r),a=a.replace(o.match[h],\"\");if(!g)return[];break}}if(a===q)if(g==null)m.error(a);else break;q=a}return s},m.error=function(a){throw new Error(\"Syntax error, unrecognized expression: \"+a)};var n=m.getText=function(a){var b,c,d=a.nodeType,e=\"\";if(d){if(d===1||d===9){if(typeof a.textContent==\"string\")return a.textContent;if(typeof a.innerText==\"string\")return a.innerText.replace(k,\"\");for(a=a.firstChild;a;a=a.nextSibling)e+=n(a)}else if(d===3||d===4)return a.nodeValue}else for(b=0;c=a[b];b++)c.nodeType!==8&&(e+=n(c));return e},o=m.selectors={order:[\"ID\",\"NAME\",\"TAG\"],match:{ID:/#((?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)+)/,CLASS:/\\.((?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)+)/,NAME:/\\[name=['\"]*((?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)+)['\"]*\\]/,ATTR:/\\[\\s*((?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)+)\\s*(?:(\\S?=)\\s*(?:(['\"])(.*?)\\3|(#?(?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)*)|)|)\\s*\\]/,TAG:/^((?:[\\w\\u00c0-\\uFFFF\\*\\-]|\\\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\\(\\s*(even|odd|(?:[+\\-]?\\d+|(?:[+\\-]?\\d*)?n\\s*(?:[+\\-]\\s*\\d+)?))\\s*\\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\\((\\d*)\\))?(?=[^\\-]|$)/,PSEUDO:/:((?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)+)(?:\\((['\"]?)((?:\\([^\\)]+\\)|[^\\(\\)]*)+)\\2\\))?/},leftMatch:{},attrMap:{\"class\":\"className\",\"for\":\"htmlFor\"},attrHandle:{href:function(a){return a.getAttribute(\"href\")},type:function(a){return a.getAttribute(\"type\")}},relative:{\"+\":function(a,b){var c=typeof b==\"string\",d=c&&!l.test(b),e=c&&!d;d&&(b=b.toLowerCase());for(var f=0,g=a.length,h;f<g;f++)if(h=a[f]){while((h=h.previousSibling)&&h.nodeType!==1);a[f]=e||h&&h.nodeName.toLowerCase()===b?h||!1:h===b}e&&m.filter(b,a,!0)},\">\":function(a,b){var c,d=typeof b==\"string\",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e<f;e++){c=a[e];if(c){var g=c.parentNode;a[e]=g.nodeName.toLowerCase()===b?g:!1}}}else{for(;e<f;e++)c=a[e],c&&(a[e]=d?c.parentNode:c.parentNode===b);d\n"
-"&&m.filter(b,a,!0)}},\"\":function(a,b,c){var d,f=e++,g=x;typeof b==\"string\"&&!l.test(b)&&(b=b.toLowerCase(),d=b,g=w),g(\"parentNode\",b,f,a,d,c)},\"~\":function(a,b,c){var d,f=e++,g=x;typeof b==\"string\"&&!l.test(b)&&(b=b.toLowerCase(),d=b,g=w),g(\"previousSibling\",b,f,a,d,c)}},find:{ID:function(a,b,c){if(typeof b.getElementById!=\"undefined\"&&!c){var d=b.getElementById(a[1]);return d&&d.parentNode?[d]:[]}},NAME:function(a,b){if(typeof b.getElementsByName!=\"undefined\"){var c=[],d=b.getElementsByName(a[1]);for(var e=0,f=d.length;e<f;e++)d[e].getAttribute(\"name\")===a[1]&&c.push(d[e]);return c.length===0?null:c}},TAG:function(a,b){if(typeof b.getElementsByTagName!=\"undefined\")return b.getElementsByTagName(a[1])}},preFilter:{CLASS:function(a,b,c,d,e,f){a=\" \"+a[1].replace(j,\"\")+\" \";if(f)return a;for(var g=0,h;(h=b[g])!=null;g++)h&&(e^(h.className&&(\" \"+h.className+\" \").replace(/[\\t\\n\\r]/g,\" \").indexOf(a)>=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,\"\")},TAG:function(a,b){return a[1].replace(j,\"\").toLowerCase()},CHILD:function(a){if(a[1]===\"nth\"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\\+|\\s*/g,\"\");var b=/(-?)(\\d*)(?:n([+\\-]?\\d*))?/.exec(a[2]===\"even\"&&\"2n\"||a[2]===\"odd\"&&\"2n+1\"||!/\\D/.test(a[2])&&\"0n+\"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,\"\");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||\"\").replace(j,\"\"),a[2]===\"~=\"&&(a[4]=\" \"+a[4]+\" \");return a},PSEUDO:function(b,c,d,e,f){if(b[1]===\"not\")if((a.exec(b[3])||\"\").length>1||/^\\w/.test(b[3]))b[3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!==\"hidden\"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute(\"type\"),c=a.type;return a.nodeName.toLowerCase()===\"input\"&&\"text\"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()===\"input\"&&\"radio\"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()===\"input\"&&\"checkbox\"===a.type},file:function(a){return a.nodeName.toLowerCase()===\"input\"&&\"file\"===a.type},password:function(a){return a.nodeName.toLowerCase()===\"input\"&&\"password\"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b===\"input\"||b===\"button\")&&\"submit\"===a.type},image:function(a){return a.nodeName.toLowerCase()===\"input\"&&\"image\"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b===\"input\"||b===\"button\")&&\"reset\"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b===\"input\"&&\"button\"===a.type||b===\"button\"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return b<c[3]-0},gt:function(a,b,c){return b>c[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e===\"contains\")return(a.textContent||a.innerText||n([a])||\"\").indexOf(b[3])>=0;if(e===\"not\"){var g=b[3];for(var h=0,i=g.length;h<i;h++)if(g[h]===a)return!1;return!0}m.error(e)},CHILD:function(a,b){var c,e,f,g,h,i,j,k=b[1],l=a;switch(k){case\"only\":case\"first\":while(l=l.previousSibling)if(l.nodeType===1)return!1;if(k===\"first\")return!0;l=a;case\"last\":while(l=l.nextSibling)if(l.nodeType===1)return!1;return!0;case\"nth\":c=b[2],e=b[3];if(c===1&&e===0)return!0;f=b[0],g=a.parentNode;if(g&&(g[d]!==f||!a.nodeIndex)){i=0;for(l=g.firstChild;l;l=l.nextSibling)l.nodeType===1&&(l.nodeIndex=++i);g[d]=f}j=a.nodeIndex-e;return c===0?j===0:j%c===0&&j/c>=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute(\"id\")===b},TAG:function(a,b){return b===\"*\"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(\" \"+(a.className||a.getAttribute(\"class\"))+\" \").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+\"\",f=b[2],g=b[4];return d==null?f===\"!=\":!f&&m.attr?d!=null:f===\"=\"?e===g:f===\"*=\"?e.indexOf(g)>=0:f===\"~=\"?(\" \"+e+\" \").indexOf(g)>=0:g?f===\"!=\"?e!==g:f===\"^=\"?e.indexOf(g)===0:f===\"$=\"?e.substr(e.length-g.length)===g:f===\"|=\"?e===g||e.substr(0,g.length+1)===g+\"-\":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return\"\\\\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\\[]*\\])(?![^\\(]*\\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\\r|\\n)*?)/.source+o.match[r].source.replace(/\\\\(\\d+)/g,q));var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)===\"[object Array]\")Array.prototype.push.apply(d,a);else if(typeof a.length==\"number\")for(var e=a.length;c<e;c++)d.push(a[c]);else for(;a[c];c++)d.push(a[c]);return d}}var u,v;c.documentElement.compareDocumentPosition?u=function(a,b){if(a===b){h=!0;return 0}if(!a.compareDocumentPosition||!b.compareDocumentPosition)return a.compareDocumentPosition?-1:1;return a.compareDocumentPosition(b)&4?-1:1}:(u=function(a,b){if(a===b){h=!0;return 0}if(a.sourceIndex&&b.sourceIndex)return a.sourceIndex-b.sourceIndex;var c,d,e=[],f=[],g=a.parentNode,i=b.parentNode,j=g;if(g===i)return v(a,b);if(!g)return-1;if(!i)return 1;while(j)e.unshift(j),j=j.parentNode;j=i;while(j)f.unshift(j),j=j.parentNode;c=e.length,d=f.length;for(var k=0;k<c&&k<d;k++)if(e[k]!==f[k])return v(e[k],f[k]);return k===c?v(a,f[k],-1):v(e[k],b,1)},v=function(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}),function(){var a=c.createElement(\"div\"),d=\"script\"+(new Date).getTime(),e=c.documentElement;a.innerHTML=\"<a name='\"+d+\"'/>\",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!=\"undefined\"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!=\"undefined\"&&e.getAttributeNode(\"id\").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!=\"undefined\"&&a.getAttributeNode(\"id\");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement(\"div\");a.appendChild(c.createComment(\"\")),a.getElementsByTagName(\"*\").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]===\"*\"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML=\"<a href='#'></a>\",a.firstChild&&typeof a.firstChild.getAttribute!=\"undefined\"&&a.firstChild.getAttribute(\"href\")!==\"#\"&&(o.attrHandle.href=function(a){return a.getAttribute(\"href\",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement(\"div\"),d=\"__sizzle__\";b.innerHTML=\"<p class='TEST'></p>\";if(!b.querySelectorAll||b.querySelectorAll(\".TEST\").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\\w+$)|^\\.([\\w\\-]+$)|^#([\\w\\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b===\"body\"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!==\"object\"){var k=e,l=e.getAttribute(\"id\"),n=l||d,p=e.parentNode,q=/^\\s*[+~]/.test(b);l?n=n.replace(/'/g,\"\\\\$&\"):e.setAttribute(\"id\",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll(\"[id='\"+n+\"'] \"+b),f)}catch(r){}finally{l||k.removeAttribute(\"id\")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement(\"div\"),\"div\"),e=!1;try{b.call(c.documentElement,\"[test!='']:sizzle\")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\\=\\s*([^'\"\\]]*)\\s*\\]/g,\"='$1']\");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement(\"div\");a.innerHTML=\"<div class='test e'></div><div class='test'></div>\";if(!!a.getElementsByClassName&&a.getElementsByClassName(\"e\").length!==0){a.lastChild.className=\"e\";if(a.getElementsByClassName(\"e\").length===1)return;o.order.splice(1,0,\"CLASS\"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!=\"undefined\"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!==\"HTML\":!1};var y=function(a,b,c){var d,e=[],f=\"\",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,\"\");a=o.relative[a]?a+\"*\":a;for(var h=0,i=g.length;h<i;h++)m(a,g[h],e,c);return m.filter(f,e)};m.attr=f.attr,m.selectors.attrMap={},f.find=m,f.expr=m.selectors,f.expr[\":\"]=f.expr.filters,f.unique=m.uniqueSort,f.text=m.getText,f.isXMLDoc=m.isXML,f.contains=m.contains}();var L=/Until$/,M=/^(?:parents|prevUntil|prevAll)/,N=/,/,O=/^.[^:#\\[\\.,]*$/,P=Array.prototype.slice,Q=f.expr.match.POS,R={children:!0,contents:!0,next:!0,prev:!0};f.fn.extend({find:function(a){var b=this,c,d;if(typeof a!=\"string\")return f(a).filter(function(){for(c=0,d=b.length;c<d;c++)if(f.contains(b[c],this))return!0});var e=this.pushStack(\"\",\"find\",a),g,h,i;for(c=0,d=this.length;c<d;c++){g=e.length,f.find(a,this[c],e);if(c>0)for(h=g;h<e.length;h++)for(i=0;i<g;i++)if(e[i]===e[h]){e.splice(h--,1);break}}return e},has:function(a){var b=f(a);return this.filter(function(){for(var a=0,c=b.length;a<c;a++)if(f.contains(this,b[a]))return!0})},not:function(a){return this.pushStack(T(this,a,!1),\"not\",a)},filter:function(a){return this.pushStack(T(this,a,!0),\"filter\",a)},is:function(a){return!!a&&(typeof a==\"string\"?Q.test(a)?f(a,this.context).index(this[0])>=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d<a.length;d++)f(g).is(a[d])&&c.push({selector:a[d],elem:g,level:h});g=g.parentNode,h++}return c}var i=Q.test(a)||typeof a!=\"string\"?f(a,b||this.context):0;for(d=0,e=this.length;d<e;d++){g=this[d];while(g){if(i?i.index(g)>-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,\"closest\",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a==\"string\")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a==\"string\"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,\"parentNode\")},parentsUntil:function(a,b,c){return f.dir(a,\"parentNode\",c)},next:function(a){return f.nth(a,2,\"nextSibling\")},prev:function(a){return f.nth(a,2,\"previousSibling\")},nextAll:function(a){return f.dir(a,\"nextSibling\")},prevAll:function(a){return f.dir(a,\"previousSibling\")},nextUntil:function(a,b,c){return f.dir(a,\"nextSibling\",c)},prevUntil:function(a,b,c){return f.dir(a,\"previousSibling\",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,\"iframe\")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)||(d=c),d&&typeof d==\"string\"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(\",\"))}}),f.extend({filter:function(a,b,c){c&&(a=\":not(\"+a+\")\");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var V=\"abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video\",W=/ jQuery\\d+=\"(?:\\d+|null)\"/g,X=/^\\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\\w:]+)[^>]*)\\/>/ig,Z=/<([\\w:]+)/,$=/<tbody/i,_=/<|&#?\\w+;/,ba=/<(?:script|style)/i,bb=/<(?:script|object|embed|option|style)/i,bc=new RegExp(\"<(?:\"+V+\")\",\"i\"),bd=/checked\\s*(?:[^=]|=\\s*.checked.)/i,be=/\\/(java|ecma)script/i,bf=/^\\s*<!(?:\\[CDATA\\[|\\-\\-)/,bg={option:[1,\"<select multiple='multiple'>\",\"</select>\"],legend:[1,\"<fieldset>\",\"</fieldset>\"],thead:[1,\"<table>\",\"</table>\"],tr:[2,\"<table><tbody>\",\"</tbody></table>\"],td:[3,\"<table><tbody><tr>\",\"</tr></tbody></table>\"],col:[2,\"<table><tbody></tbody><colgroup>\",\"</colgroup></table>\"],area:[1,\"<map>\",\"</map>\"],_default:[0,\"\",\"\"]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,\"div<div>\",\"</div>\"]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!=\"object\"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,\"body\")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f.clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,\"before\",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,\"after\",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName(\"*\")),\n"
-"f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function()\n"
+"}b.event.add(this,\"click._submit keypress._submit\",function(bx){var bw=bx.target,bv=b.nodeName(bw,\"input\")||b.nodeName(bw,\"button\")?bw.form:L;if(bv&&!bv._submit_attached){b.event.add(bv,\"submit._submit\",function(e){if(this.parentNode&&!e.isTrigger){b.event.simulate(\"submit\",this.parentNode,e,true)}});bv._submit_attached=true}})},teardown:function(){if(b.nodeName(this,\"form\")){return false}b.event.remove(this,\"._submit\")}}}if(!b.support.changeBubbles){b.event.special.change={setup:function(){if(bd.test(this.nodeName)){if(this.type===\"checkbox\"||this.type===\"radio\"){b.event.add(this,\"propertychange._change\",function(e){if(e.originalEvent.propertyName===\"checked\"){this._just_changed=true}});b.event.add(this,\"click._change\",function(e){if(this._just_changed&&!e.isTrigger){this._just_changed=false;b.event.simulate(\"change\",this,e,true)}})}return false}b.event.add(this,\"beforeactivate._change\",function(bw){var bv=bw.target;if(bd.test(bv.nodeName)&&!bv._change_attached){b.event.add(bv,\"change._change\",function(e){if(this.parentNode&&!e.isSimulated&&!e.isTrigger){b.event.simulate(\"change\",this.parentNode,e,true)}});bv._change_attached=true}})},handle:function(bv){var e=bv.target;if(this!==e||bv.isSimulated||bv.isTrigger||(e.type!==\"radio\"&&e.type!==\"checkbox\")){return bv.handleObj.handler.apply(this,arguments)}},teardown:function(){b.event.remove(this,\"._change\");return bd.test(this.nodeName)}}}if(!b.support.focusinBubbles){b.each({focus:\"focusin\",blur:\"focusout\"},function(bx,e){var bv=0,bw=function(by){b.event.simulate(e,by.target,b.event.fix(by),true)};b.event.special[e]={setup:function(){if(bv++===0){av.addEventListener(bx,bw,true)}},teardown:function(){if(--bv===0){av.removeEventListener(bx,bw,true)}}}})}b.fn.extend({on:function(bw,e,bz,by,bv){var bA,bx;if(typeof bw===\"object\"){if(typeof e!==\"string\"){bz=e;e=L}for(bx in bw){this.on(bx,e,bz,bw[bx],bv)}return this}if(bz==null&&by==null){by=e;bz=e=L}else{if(by==null){if(typeof e===\"string\"){by=bz;bz=L}else{by=bz;bz=e;e=L}}}if(by===false){by=bk}else{if(!by){return this}}if(bv===1){bA=by;by=function(bB){b().off(bB);return bA.apply(this,arguments)};by.guid=bA.guid||(bA.guid=b.guid++)}return this.each(function(){b.event.add(this,bw,by,bz,e)})},one:function(bv,e,bx,bw){return this.on.call(this,bv,e,bx,bw,1)},off:function(bw,e,by){if(bw&&bw.preventDefault&&bw.handleObj){var bv=bw.handleObj;b(bw.delegateTarget).off(bv.namespace?bv.type+\".\"+bv.namespace:bv.type,bv.selector,bv.handler);return this}if(typeof bw===\"object\"){for(var bx in bw){this.off(bx,e,bw[bx])}return this}if(e===false||typeof e===\"function\"){by=e;e=L}if(by===false){by=bk}return this.each(function(){b.event.remove(this,bw,by,e)})},bind:function(e,bw,bv){return this.on(e,null,bw,bv)},unbind:function(e,bv){return this.off(e,null,bv)},live:function(e,bw,bv){b(this.context).on(e,this.selector,bw,bv);return this},die:function(e,bv){b(this.context).off(e,this.selector||\"**\",bv);return this},delegate:function(e,bv,bx,bw){return this.on(bv,e,bx,bw)},undelegate:function(e,bv,bw){return arguments.length==1?this.off(e,\"**\"):this.off(bv,e,bw)},trigger:function(e,bv){return this.each(function(){b.event.trigger(e,bv,this)})},triggerHandler:function(e,bv){if(this[0]){return b.event.trigger(e,bv,this[0],true)}},toggle:function(bx){var bv=arguments,e=bx.guid||b.guid++,bw=0,by=function(bz){var bA=(b._data(this,\"lastToggle\"+bx.guid)||0)%bw;b._data(this,\"lastToggle\"+bx.guid,bA+1);bz.preventDefault();return bv[bA].apply(this,arguments)||false};by.guid=e;while(bw<bv.length){bv[bw++].guid=e}return this.click(by)},hover:function(e,bv){return this.mouseenter(e).mouseleave(bv||e)}});b.each((\"blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu\").split(\" \"),function(bv,e){b.fn[e]=function(bx,bw){if(bw==null){bw=bx;bx=null}return arguments.length>0?this.on(e,null,bx,bw):this.trigger(e)};if(b.attrFn){b.attrFn[e]=true}if(aO.test(e)){b.event.fixHooks[e]=b.event.keyHooks}if(bf.test(e)){b.event.fixHooks[e]=b.event.mouseHooks}});\n"
+"/*!\n"
+" * Sizzle CSS Selector Engine\n"
+" *  Copyright 2011, The Dojo Foundation\n"
+" *  Released under the MIT, BSD, and GPL Licenses.\n"
+" *  More information: http://sizzlejs.com/\n"
+" */\n"
+"(function(){var bH=/((?:\\((?:\\([^()]+\\)|[^()]+)+\\)|\\[(?:\\[[^\\[\\]]*\\]|['\"][^'\"]*['\"]|[^\\[\\]'\"]+)+\\]|\\\\.|[^ >+~,(\\[\\\\]+)+|[>+~])(\\s*,\\s*)?((?:.|\\r|\\n)*)/g,bC=\"sizcache\"+(Math.random()+\"\").replace(\".\",\"\"),bI=0,bL=Object.prototype.toString,bB=false,bA=true,bK=/\\\\/g,bO=/\\r\\n/g,bQ=/\\W/;[0,0].sort(function(){bA=false;return 0});var by=function(bV,e,bY,bZ){bY=bY||[];e=e||av;var b1=e;if(e.nodeType!==1&&e.nodeType!==9){return[]}if(!bV||typeof bV!==\"string\"){return bY}var bS,b3,b6,bR,b2,b5,b4,bX,bU=true,bT=by.isXML(e),bW=[],b0=bV;do{bH.exec(\"\");bS=bH.exec(b0);if(bS){b0=bS[3];bW.push(bS[1]);if(bS[2]){bR=bS[3];break}}}while(bS);if(bW.length>1&&bD.exec(bV)){if(bW.length===2&&bE.relative[bW[0]]){b3=bM(bW[0]+bW[1],e,bZ)}else{b3=bE.relative[bW[0]]?[e]:by(bW.shift(),e);while(bW.length){bV=bW.shift();if(bE.relative[bV]){bV+=bW.shift()}b3=bM(bV,b3,bZ)}}}else{if(!bZ&&bW.length>1&&e.nodeType===9&&!bT&&bE.match.ID.test(bW[0])&&!bE.match.ID.test(bW[bW.length-1])){b2=by.find(bW.shift(),e,bT);e=b2.expr?by.filter(b2.expr,b2.set)[0]:b2.set[0]}if(e){b2=bZ?{expr:bW.pop(),set:bF(bZ)}:by.find(bW.pop(),bW.length===1&&(bW[0]===\"~\"||bW[0]===\"+\")&&e.parentNode?e.parentNode:e,bT);b3=b2.expr?by.filter(b2.expr,b2.set):b2.set;if(bW.length>0){b6=bF(b3)}else{bU=false}while(bW.length){b5=bW.pop();b4=b5;if(!bE.relative[b5]){b5=\"\"}else{b4=bW.pop()}if(b4==null){b4=e}bE.relative[b5](b6,b4,bT)}}else{b6=bW=[]}}if(!b6){b6=b3}if(!b6){by.error(b5||bV)}if(bL.call(b6)===\"[object Array]\"){if(!bU){bY.push.apply(bY,b6)}else{if(e&&e.nodeType===1){for(bX=0;b6[bX]!=null;bX++){if(b6[bX]&&(b6[bX]===true||b6[bX].nodeType===1&&by.contains(e,b6[bX]))){bY.push(b3[bX])}}}else{for(bX=0;b6[bX]!=null;bX++){if(b6[bX]&&b6[bX].nodeType===1){bY.push(b3[bX])}}}}}else{bF(b6,bY)}if(bR){by(bR,b1,bY,bZ);by.uniqueSort(bY)}return bY};by.uniqueSort=function(bR){if(bJ){bB=bA;bR.sort(bJ);if(bB){for(var e=1;e<bR.length;e++){if(bR[e]===bR[e-1]){bR.splice(e--,1)}}}}return bR};by.matches=function(e,bR){return by(e,null,null,bR)};by.matchesSelector=function(e,bR){return by(bR,null,null,[e]).length>0};by.find=function(bX,e,bY){var bW,bS,bU,bT,bV,bR;if(!bX){return[]}for(bS=0,bU=bE.order.length;bS<bU;bS++){bV=bE.order[bS];if((bT=bE.leftMatch[bV].exec(bX))){bR=bT[1];bT.splice(1,1);if(bR.substr(bR.length-1)!==\"\\\\\"){bT[1]=(bT[1]||\"\").replace(bK,\"\");bW=bE.find[bV](bT,e,bY);if(bW!=null){bX=bX.replace(bE.match[bV],\"\");break}}}}if(!bW){bW=typeof e.getElementsByTagName!==\"undefined\"?e.getElementsByTagName(\"*\"):[]}return{set:bW,expr:bX}};by.filter=function(b1,b0,b4,bU){var bW,e,bZ,b6,b3,bR,bT,bV,b2,bS=b1,b5=[],bY=b0,bX=b0&&b0[0]&&by.isXML(b0[0]);while(b1&&b0.length){for(bZ in bE.filter){if((bW=bE.leftMatch[bZ].exec(b1))!=null&&bW[2]){bR=bE.filter[bZ];bT=bW[1];e=false;bW.splice(1,1);if(bT.substr(bT.length-1)===\"\\\\\"){continue}if(bY===b5){b5=[]}if(bE.preFilter[bZ]){bW=bE.preFilter[bZ](bW,bY,b4,b5,bU,bX);if(!bW){e=b6=true}else{if(bW===true){continue}}}if(bW){for(bV=0;(b3=bY[bV])!=null;bV++){if(b3){b6=bR(b3,bW,bV,bY);b2=bU^b6;if(b4&&b6!=null){if(b2){e=true}else{bY[bV]=false}}else{if(b2){b5.push(b3);e=true}}}}}if(b6!==L){if(!b4){bY=b5}b1=b1.replace(bE.match[bZ],\"\");if(!e){return[]}break}}}if(b1===bS){if(e==null){by.error(b1)}else{break}}bS=b1}return bY};by.error=function(e){throw new Error(\"Syntax error, unrecognized expression: \"+e)};var bw=by.getText=function(bU){var bS,bT,e=bU.nodeType,bR=\"\";if(e){if(e===1||e===9){if(typeof bU.textContent===\"string\"){return bU.textContent}else{if(typeof bU.innerText===\"string\"){return bU.innerText.replace(bO,\"\")}else{for(bU=bU.firstChild;bU;bU=bU.nextSibling){bR+=bw(bU)}}}}else{if(e===3||e===4){return bU.nodeValue}}}else{for(bS=0;(bT=bU[bS]);bS++){if(bT.nodeType!==8){bR+=bw(bT)}}}return bR};var bE=by.selectors={order:[\"ID\",\"NAME\",\"TAG\"],match:{ID:/#((?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)+)/,CLASS:/\\.((?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)+)/,NAME:/\\[name=['\"]*((?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)+)['\"]*\\]/,ATTR:/\\[\\s*((?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)+)\\s*(?:(\\S?=)\\s*(?:(['\"])(.*?)\\3|(#?(?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)*)|)|)\\s*\\]/,TAG:/^((?:[\\w\\u00c0-\\uFFFF\\*\\-]|\\\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\\(\\s*(even|odd|(?:[+\\-]?\\d+|(?:[+\\-]?\\d*)?n\\s*(?:[+\\-]\\s*\\d+)?))\\s*\\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\\((\\d*)\\))?(?=[^\\-]|$)/,PSEUDO:/:((?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)+)(?:\\((['\"]?)((?:\\([^\\)]+\\)|[^\\(\\)]*)+)\\2\\))?/},leftMatch:{},attrMap:{\"class\":\"className\",\"for\":\"htmlFor\"},attrHandle:{href:function(e){return e.getAttribute(\"href\")},type:function(e){return e.getAttribute(\"type\")}},relative:{\"+\":function(bW,bR){var bT=typeof bR===\"string\",bV=bT&&!bQ.test(bR),bX=bT&&!bV;if(bV){bR=bR.toLowerCase()}for(var bS=0,e=bW.length,bU;bS<e;bS++){if((bU=bW[bS])){while((bU=bU.previousSibling)&&bU.nodeType!==1){}bW[bS]=bX||bU&&bU.nodeName.toLowerCase()===bR?bU||false:bU===bR}}if(bX){by.filter(bR,bW,true)}},\">\":function(bW,bR){var bV,bU=typeof bR===\"string\",bS=0,e=bW.length;if(bU&&!bQ.test(bR)){bR=bR.toLowerCase();for(;bS<e;bS++){bV=bW[bS];if(bV){var bT=bV.parentNode;bW[bS]=bT.nodeName.toLowerCase()===bR?bT:false}}}else{for(;bS<e;bS++){bV=bW[bS];if(bV){bW[bS]=bU?bV.parentNode:bV.parentNode===bR}}if(bU){by.filter(bR,bW,true)}}},\"\":function(bT,bR,bV){var bU,bS=bI++,e=bN;if(typeof bR===\"string\"&&!bQ.test(bR)){bR=bR.toLowerCase();bU=bR;e=bv}e(\"parentNode\",bR,bS,bT,bU,bV)},\"~\":function(bT,bR,bV){var bU,bS=bI++,e=bN;if(typeof bR===\"string\"&&!bQ.test(bR)){bR=bR.toLowerCase();bU=bR;e=bv}e(\"previousSibling\",bR,bS,bT,bU,bV)}},find:{ID:function(bR,bS,bT){if(typeof bS.getElementById!==\"undefined\"&&!bT){var e=bS.getElementById(bR[1]);return e&&e.parentNode?[e]:[]}},NAME:function(bS,bV){if(typeof bV.getElementsByName!==\"undefined\"){var bR=[],bU=bV.getElementsByName(bS[1]);for(var bT=0,e=bU.length;bT<e;bT++){if(bU[bT].getAttribute(\"name\")===bS[1]){bR.push(bU[bT])}}return bR.length===0?null:bR}},TAG:function(e,bR){if(typeof bR.getElementsByTagName!==\"undefined\"){return bR.getElementsByTagName(e[1])}}},preFilter:{CLASS:function(bT,bR,bS,e,bW,bX){bT=\" \"+bT[1].replace(bK,\"\")+\" \";if(bX){return bT}for(var bU=0,bV;(bV=bR[bU])!=null;bU++){if(bV){if(bW^(bV.className&&(\" \"+bV.className+\" \").replace(/[\\t\\n\\r]/g,\" \").indexOf(bT)>=0)){if(!bS){e.push(bV)}}else{if(bS){bR[bU]=false}}}}return false},ID:function(e){return e[1].replace(bK,\"\")},TAG:function(bR,e){return bR[1].replace(bK,\"\").toLowerCase()},CHILD:function(e){if(e[1]===\"nth\"){if(!e[2]){by.error(e[0])}e[2]=e[2].replace(/^\\+|\\s*/g,\"\");var bR=/(-?)(\\d*)(?:n([+\\-]?\\d*))?/.exec(e[2]===\"even\"&&\"2n\"||e[2]===\"odd\"&&\"2n+1\"||!/\\D/.test(e[2])&&\"0n+\"+e[2]||e[2]);e[2]=(bR[1]+(bR[2]||1))-0;e[3]=bR[3]-0}else{if(e[2]){by.error(e[0])}}e[0]=bI++;return e},ATTR:function(bU,bR,bS,e,bV,bW){var bT=bU[1]=bU[1].replace(bK,\"\");if(!bW&&bE.attrMap[bT]){bU[1]=bE.attrMap[bT]}bU[4]=(bU[4]||bU[5]||\"\").replace(bK,\"\");if(bU[2]===\"~=\"){bU[4]=\" \"+bU[4]+\" \"}return bU},PSEUDO:function(bU,bR,bS,e,bV){if(bU[1]===\"not\"){if((bH.exec(bU[3])||\"\").length>1||/^\\w/.test(bU[3])){bU[3]=by(bU[3],null,null,bR)}else{var bT=by.filter(bU[3],bR,bS,true^bV);if(!bS){e.push.apply(e,bT)}return false}}else{if(bE.match.POS.test(bU[0])||bE.match.CHILD.test(bU[0])){return true}}return bU},POS:function(e){e.unshift(true);return e}},filters:{enabled:function(e){return e.disabled===false&&e.type!==\"hidden\"},disabled:function(e){return e.disabled===true},checked:function(e){return e.checked===true},selected:function(e){if(e.parentNode){e.parentNode.selectedIndex}return e.selected===true},parent:function(e){return !!e.firstChild},empty:function(e){return !e.firstChild},has:function(bS,bR,e){return !!by(e[3],bS).length},header:function(e){return(/h\\d/i).test(e.nodeName)},text:function(bS){var e=bS.getAttribute(\"type\"),bR=bS.type;return bS.nodeName.toLowerCase()===\"input\"&&\"text\"===bR&&(e===bR||e===null)},radio:function(e){return e.nodeName.toLowerCase()===\"input\"&&\"radio\"===e.type},checkbox:function(e){return e.nodeName.toLowerCase()===\"input\"&&\"checkbox\"===e.type},file:function(e){return e.nodeName.toLowerCase()===\"input\"&&\"file\"===e.type},password:function(e){return e.nodeName.toLowerCase()===\"input\"&&\"password\"===e.type},submit:function(bR){var e=bR.nodeName.toLowerCase();return(e===\"input\"||e===\"button\")&&\"submit\"===bR.type},image:function(e){return e.nodeName.toLowerCase()===\"input\"&&\"image\"===e.type},reset:function(bR){var e=bR.nodeName.toLowerCase();return(e===\"input\"||e===\"button\")&&\"reset\"===bR.type},button:function(bR){var e=bR.nodeName.toLowerCase();return e===\"input\"&&\"button\"===bR.type||e===\"button\"},input:function(e){return(/input|select|textarea|button/i).test(e.nodeName)},focus:function(e){return e===e.ownerDocument.activeElement}},setFilters:{first:function(bR,e){return e===0},last:function(bS,bR,e,bT){return bR===bT.length-1},even:function(bR,e){return e%2===0},odd:function(bR,e){return e%2===1\n"
+"},lt:function(bS,bR,e){return bR<e[3]-0},gt:function(bS,bR,e){return bR>e[3]-0},nth:function(bS,bR,e){return e[3]-0===bR},eq:function(bS,bR,e){return e[3]-0===bR}},filter:{PSEUDO:function(bS,bX,bW,bY){var e=bX[1],bR=bE.filters[e];if(bR){return bR(bS,bW,bX,bY)}else{if(e===\"contains\"){return(bS.textContent||bS.innerText||bw([bS])||\"\").indexOf(bX[3])>=0}else{if(e===\"not\"){var bT=bX[3];for(var bV=0,bU=bT.length;bV<bU;bV++){if(bT[bV]===bS){return false}}return true}else{by.error(e)}}}},CHILD:function(bS,bU){var bT,b0,bW,bZ,e,bV,bY,bX=bU[1],bR=bS;switch(bX){case\"only\":case\"first\":while((bR=bR.previousSibling)){if(bR.nodeType===1){return false}}if(bX===\"first\"){return true}bR=bS;case\"last\":while((bR=bR.nextSibling)){if(bR.nodeType===1){return false}}return true;case\"nth\":bT=bU[2];b0=bU[3];if(bT===1&&b0===0){return true}bW=bU[0];bZ=bS.parentNode;if(bZ&&(bZ[bC]!==bW||!bS.nodeIndex)){bV=0;for(bR=bZ.firstChild;bR;bR=bR.nextSibling){if(bR.nodeType===1){bR.nodeIndex=++bV}}bZ[bC]=bW}bY=bS.nodeIndex-b0;if(bT===0){return bY===0}else{return(bY%bT===0&&bY/bT>=0)}}},ID:function(bR,e){return bR.nodeType===1&&bR.getAttribute(\"id\")===e},TAG:function(bR,e){return(e===\"*\"&&bR.nodeType===1)||!!bR.nodeName&&bR.nodeName.toLowerCase()===e},CLASS:function(bR,e){return(\" \"+(bR.className||bR.getAttribute(\"class\"))+\" \").indexOf(e)>-1},ATTR:function(bV,bT){var bS=bT[1],e=by.attr?by.attr(bV,bS):bE.attrHandle[bS]?bE.attrHandle[bS](bV):bV[bS]!=null?bV[bS]:bV.getAttribute(bS),bW=e+\"\",bU=bT[2],bR=bT[4];return e==null?bU===\"!=\":!bU&&by.attr?e!=null:bU===\"=\"?bW===bR:bU===\"*=\"?bW.indexOf(bR)>=0:bU===\"~=\"?(\" \"+bW+\" \").indexOf(bR)>=0:!bR?bW&&e!==false:bU===\"!=\"?bW!==bR:bU===\"^=\"?bW.indexOf(bR)===0:bU===\"$=\"?bW.substr(bW.length-bR.length)===bR:bU===\"|=\"?bW===bR||bW.substr(0,bR.length+1)===bR+\"-\":false},POS:function(bU,bR,bS,bV){var e=bR[2],bT=bE.setFilters[e];if(bT){return bT(bU,bS,bR,bV)}}}};var bD=bE.match.POS,bx=function(bR,e){return\"\\\\\"+(e-0+1)};for(var bz in bE.match){bE.match[bz]=new RegExp(bE.match[bz].source+(/(?![^\\[]*\\])(?![^\\(]*\\))/.source));bE.leftMatch[bz]=new RegExp(/(^(?:.|\\r|\\n)*?)/.source+bE.match[bz].source.replace(/\\\\(\\d+)/g,bx))}var bF=function(bR,e){bR=Array.prototype.slice.call(bR,0);if(e){e.push.apply(e,bR);return e}return bR};try{Array.prototype.slice.call(av.documentElement.childNodes,0)[0].nodeType}catch(bP){bF=function(bU,bT){var bS=0,bR=bT||[];if(bL.call(bU)===\"[object Array]\"){Array.prototype.push.apply(bR,bU)}else{if(typeof bU.length===\"number\"){for(var e=bU.length;bS<e;bS++){bR.push(bU[bS])}}else{for(;bU[bS];bS++){bR.push(bU[bS])}}}return bR}}var bJ,bG;if(av.documentElement.compareDocumentPosition){bJ=function(bR,e){if(bR===e){bB=true;return 0}if(!bR.compareDocumentPosition||!e.compareDocumentPosition){return bR.compareDocumentPosition?-1:1}return bR.compareDocumentPosition(e)&4?-1:1}}else{bJ=function(bY,bX){if(bY===bX){bB=true;return 0}else{if(bY.sourceIndex&&bX.sourceIndex){return bY.sourceIndex-bX.sourceIndex}}var bV,bR,bS=[],e=[],bU=bY.parentNode,bW=bX.parentNode,bZ=bU;if(bU===bW){return bG(bY,bX)}else{if(!bU){return -1}else{if(!bW){return 1}}}while(bZ){bS.unshift(bZ);bZ=bZ.parentNode}bZ=bW;while(bZ){e.unshift(bZ);bZ=bZ.parentNode}bV=bS.length;bR=e.length;for(var bT=0;bT<bV&&bT<bR;bT++){if(bS[bT]!==e[bT]){return bG(bS[bT],e[bT])}}return bT===bV?bG(bY,e[bT],-1):bG(bS[bT],bX,1)};bG=function(bR,e,bS){if(bR===e){return bS}var bT=bR.nextSibling;while(bT){if(bT===e){return -1}bT=bT.nextSibling}return 1}}(function(){var bR=av.createElement(\"div\"),bS=\"script\"+(new Date()).getTime(),e=av.documentElement;bR.innerHTML=\"<a name='\"+bS+\"'/>\";e.insertBefore(bR,e.firstChild);if(av.getElementById(bS)){bE.find.ID=function(bU,bV,bW){if(typeof bV.getElementById!==\"undefined\"&&!bW){var bT=bV.getElementById(bU[1]);return bT?bT.id===bU[1]||typeof bT.getAttributeNode!==\"undefined\"&&bT.getAttributeNode(\"id\").nodeValue===bU[1]?[bT]:L:[]}};bE.filter.ID=function(bV,bT){var bU=typeof bV.getAttributeNode!==\"undefined\"&&bV.getAttributeNode(\"id\");return bV.nodeType===1&&bU&&bU.nodeValue===bT}}e.removeChild(bR);e=bR=null})();(function(){var e=av.createElement(\"div\");e.appendChild(av.createComment(\"\"));if(e.getElementsByTagName(\"*\").length>0){bE.find.TAG=function(bR,bV){var bU=bV.getElementsByTagName(bR[1]);if(bR[1]===\"*\"){var bT=[];for(var bS=0;bU[bS];bS++){if(bU[bS].nodeType===1){bT.push(bU[bS])}}bU=bT}return bU}}e.innerHTML=\"<a href='#'></a>\";if(e.firstChild&&typeof e.firstChild.getAttribute!==\"undefined\"&&e.firstChild.getAttribute(\"href\")!==\"#\"){bE.attrHandle.href=function(bR){return bR.getAttribute(\"href\",2)}}e=null})();if(av.querySelectorAll){(function(){var e=by,bT=av.createElement(\"div\"),bS=\"__sizzle__\";bT.innerHTML=\"<p class='TEST'></p>\";if(bT.querySelectorAll&&bT.querySelectorAll(\".TEST\").length===0){return}by=function(b4,bV,bZ,b3){bV=bV||av;if(!b3&&!by.isXML(bV)){var b2=/^(\\w+$)|^\\.([\\w\\-]+$)|^#([\\w\\-]+$)/.exec(b4);if(b2&&(bV.nodeType===1||bV.nodeType===9)){if(b2[1]){return bF(bV.getElementsByTagName(b4),bZ)}else{if(b2[2]&&bE.find.CLASS&&bV.getElementsByClassName){return bF(bV.getElementsByClassName(b2[2]),bZ)}}}if(bV.nodeType===9){if(b4===\"body\"&&bV.body){return bF([bV.body],bZ)}else{if(b2&&b2[3]){var bY=bV.getElementById(b2[3]);if(bY&&bY.parentNode){if(bY.id===b2[3]){return bF([bY],bZ)}}else{return bF([],bZ)}}}try{return bF(bV.querySelectorAll(b4),bZ)}catch(b0){}}else{if(bV.nodeType===1&&bV.nodeName.toLowerCase()!==\"object\"){var bW=bV,bX=bV.getAttribute(\"id\"),bU=bX||bS,b6=bV.parentNode,b5=/^\\s*[+~]/.test(b4);if(!bX){bV.setAttribute(\"id\",bU)}else{bU=bU.replace(/'/g,\"\\\\$&\")}if(b5&&b6){bV=bV.parentNode}try{if(!b5||b6){return bF(bV.querySelectorAll(\"[id='\"+bU+\"'] \"+b4),bZ)}}catch(b1){}finally{if(!bX){bW.removeAttribute(\"id\")}}}}}return e(b4,bV,bZ,b3)};for(var bR in e){by[bR]=e[bR]}bT=null})()}(function(){var e=av.documentElement,bS=e.matchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.msMatchesSelector;if(bS){var bU=!bS.call(av.createElement(\"div\"),\"div\"),bR=false;try{bS.call(av.documentElement,\"[test!='']:sizzle\")}catch(bT){bR=true}by.matchesSelector=function(bW,bY){bY=bY.replace(/\\=\\s*([^'\"\\]]*)\\s*\\]/g,\"='$1']\");if(!by.isXML(bW)){try{if(bR||!bE.match.PSEUDO.test(bY)&&!/!=/.test(bY)){var bV=bS.call(bW,bY);if(bV||!bU||bW.document&&bW.document.nodeType!==11){return bV}}}catch(bX){}}return by(bY,null,null,[bW]).length>0}}})();(function(){var e=av.createElement(\"div\");e.innerHTML=\"<div class='test e'></div><div class='test'></div>\";if(!e.getElementsByClassName||e.getElementsByClassName(\"e\").length===0){return}e.lastChild.className=\"e\";if(e.getElementsByClassName(\"e\").length===1){return}bE.order.splice(1,0,\"CLASS\");bE.find.CLASS=function(bR,bS,bT){if(typeof bS.getElementsByClassName!==\"undefined\"&&!bT){return bS.getElementsByClassName(bR[1])}};e=null})();function bv(bR,bW,bV,bZ,bX,bY){for(var bT=0,bS=bZ.length;bT<bS;bT++){var e=bZ[bT];if(e){var bU=false;e=e[bR];while(e){if(e[bC]===bV){bU=bZ[e.sizset];break}if(e.nodeType===1&&!bY){e[bC]=bV;e.sizset=bT}if(e.nodeName.toLowerCase()===bW){bU=e;break}e=e[bR]}bZ[bT]=bU}}}function bN(bR,bW,bV,bZ,bX,bY){for(var bT=0,bS=bZ.length;bT<bS;bT++){var e=bZ[bT];if(e){var bU=false;e=e[bR];while(e){if(e[bC]===bV){bU=bZ[e.sizset];break}if(e.nodeType===1){if(!bY){e[bC]=bV;e.sizset=bT}if(typeof bW!==\"string\"){if(e===bW){bU=true;break}}else{if(by.filter(bW,[e]).length>0){bU=e;break}}}e=e[bR]}bZ[bT]=bU}}}if(av.documentElement.contains){by.contains=function(bR,e){return bR!==e&&(bR.contains?bR.contains(e):true)}}else{if(av.documentElement.compareDocumentPosition){by.contains=function(bR,e){return !!(bR.compareDocumentPosition(e)&16)}}else{by.contains=function(){return false}}}by.isXML=function(e){var bR=(e?e.ownerDocument||e:0).documentElement;return bR?bR.nodeName!==\"HTML\":false};var bM=function(bS,e,bW){var bV,bX=[],bU=\"\",bY=e.nodeType?[e]:e;while((bV=bE.match.PSEUDO.exec(bS))){bU+=bV[0];bS=bS.replace(bE.match.PSEUDO,\"\")}bS=bE.relative[bS]?bS+\"*\":bS;for(var bT=0,bR=bY.length;bT<bR;bT++){by(bS,bY[bT],bX,bW)}return by.filter(bU,bX)};by.attr=b.attr;by.selectors.attrMap={};b.find=by;b.expr=by.selectors;b.expr[\":\"]=b.expr.filters;b.unique=by.uniqueSort;b.text=by.getText;b.isXMLDoc=by.isXML;b.contains=by.contains})();var ab=/Until$/,aq=/^(?:parents|prevUntil|prevAll)/,a9=/,/,bp=/^.[^:#\\[\\.,]*$/,P=Array.prototype.slice,H=b.expr.match.POS,ay={children:true,contents:true,next:true,prev:true};b.fn.extend({find:function(e){var bw=this,by,bv;if(typeof e!==\"string\"){return b(e).filter(function(){for(by=0,bv=bw.length;by<bv;by++){if(b.contains(bw[by],this)){return true}}})}var bx=this.pushStack(\"\",\"find\",e),bA,bB,bz;for(by=0,bv=this.length;by<bv;by++){bA=bx.length;b.find(e,this[by],bx);if(by>0){for(bB=bA;bB<bx.length;bB++){for(bz=0;bz<bA;bz++){if(bx[bz]===bx[bB]){bx.splice(bB--,1);break}}}}}return bx},has:function(bv){var e=b(bv);return this.filter(function(){for(var bx=0,bw=e.length;bx<bw;bx++){if(b.contains(this,e[bx])){return true}}})},not:function(e){return this.pushStack(aG(this,e,false),\"not\",e)},filter:function(e){return this.pushStack(aG(this,e,true),\"filter\",e)},is:function(e){return !!e&&(typeof e===\"string\"?H.test(e)?b(e,this.context).index(this[0])>=0:b.filter(e,this).length>0:this.filter(e).length>0)},closest:function(by,bx){var bv=[],bw,e,bz=this[0];if(b.isArray(by)){var bB=1;while(bz&&bz.ownerDocument&&bz!==bx){for(bw=0;bw<by.length;bw++){if(b(bz).is(by[bw])){bv.push({selector:by[bw],elem:bz,level:bB})}}bz=bz.parentNode;bB++}return bv}var bA=H.test(by)||typeof by!==\"string\"?b(by,bx||this.context):0;for(bw=0,e=this.length;bw<e;bw++){bz=this[bw];while(bz){if(bA?bA.index(bz)>-1:b.find.matchesSelector(bz,by)){bv.push(bz);break}else{bz=bz.parentNode;if(!bz||!bz.ownerDocument||bz===bx||bz.nodeType===11){break}}}}bv=bv.length>1?b.unique(bv):bv;return this.pushStack(bv,\"closest\",by)},index:function(e){if(!e){return(this[0]&&this[0].parentNode)?this.prevAll().length:-1}if(typeof e===\"string\"){return b.inArray(this[0],b(e))}return b.inArray(e.jquery?e[0]:e,this)},add:function(e,bv){var bx=typeof e===\"string\"?b(e,bv):b.makeArray(e&&e.nodeType?[e]:e),bw=b.merge(this.get(),bx);return this.pushStack(C(bx[0])||C(bw[0])?bw:b.unique(bw))},andSelf:function(){return this.add(this.prevObject)}});function C(e){return !e||!e.parentNode||e.parentNode.nodeType===11}b.each({parent:function(bv){var e=bv.parentNode;return e&&e.nodeType!==11?e:null},parents:function(e){return b.dir(e,\"parentNode\")},parentsUntil:function(bv,e,bw){return b.dir(bv,\"parentNode\",bw)},next:function(e){return b.nth(e,2,\"nextSibling\")},prev:function(e){return b.nth(e,2,\"previousSibling\")},nextAll:function(e){return b.dir(e,\"nextSibling\")},prevAll:function(e){return b.dir(e,\"previousSibling\")},nextUntil:function(bv,e,bw){return b.dir(bv,\"nextSibling\",bw)},prevUntil:function(bv,e,bw){return b.dir(bv,\"previousSibling\",bw)},siblings:function(e){return b.sibling(e.parentNode.firstChild,e)},children:function(e){return b.sibling(e.firstChild)},contents:function(e){return b.nodeName(e,\"iframe\")?e.contentDocument||e.contentWindow.document:b.makeArray(e.childNodes)}},function(e,bv){b.fn[e]=function(by,bw){var bx=b.map(this,bv,by);if(!ab.test(e)){bw=by}if(bw&&typeof bw===\"string\"){bx=b.filter(bw,bx)}bx=this.length>1&&!ay[e]?b.unique(bx):bx;if((this.length>1||a9.test(bw))&&aq.test(e)){bx=bx.reverse()}return this.pushStack(bx,e,P.call(arguments).join(\",\"))}});b.extend({filter:function(bw,e,bv){if(bv){bw=\":not(\"+bw+\")\"}return e.length===1?b.find.matchesSelector(e[0],bw)?[e[0]]:[]:b.find.matches(bw,e)},dir:function(bw,bv,by){var e=[],bx=bw[bv];while(bx&&bx.nodeType!==9&&(by===L||bx.nodeType!==1||!b(bx).is(by))){if(bx.nodeType===1){e.push(bx)}bx=bx[bv]}return e},nth:function(by,e,bw,bx){e=e||1;var bv=0;for(;by;by=by[bw]){if(by.nodeType===1&&++bv===e){break}}return by},sibling:function(bw,bv){var e=[];for(;bw;bw=bw.nextSibling){if(bw.nodeType===1&&bw!==bv){e.push(bw)}}return e}});function aG(bx,bw,e){bw=bw||0;if(b.isFunction(bw)){return b.grep(bx,function(bz,by){var bA=!!bw.call(bz,by,bz);return bA===e})}else{if(bw.nodeType){return b.grep(bx,function(bz,by){return(bz===bw)===e})}else{if(typeof bw===\"string\"){var bv=b.grep(bx,function(by){return by.nodeType===1});if(bp.test(bw)){return b.filter(bw,bv,!e)}else{bw=b.filter(bw,bv)}}}}return b.grep(bx,function(bz,by){return(b.inArray(bz,bw)>=0)===e})}function a(e){var bw=aR.split(\"|\"),bv=e.createDocumentFragment();if(bv.createElement){while(bw.length){bv.createElement(bw.pop())}}return bv}var aR=\"abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video\",ag=/ jQuery\\d+=\"(?:\\d+|null)\"/g,ar=/^\\s+/,R=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\\w:]+)[^>]*)\\/>/ig,d=/<([\\w:]+)/,w=/<tbody/i,W=/<|&#?\\w+;/,ae=/<(?:script|style)/i,O=/<(?:script|object|embed|option|style)/i,ah=new RegExp(\"<(?:\"+aR+\")\",\"i\"),o=/checked\\s*(?:[^=]|=\\s*.checked.)/i,bm=/\\/(java|ecma)script/i,aN=/^\\s*<!(?:\\[CDATA\\[|\\-\\-)/,ax={option:[1,\"<select multiple='multiple'>\",\"</select>\"],legend:[1,\"<fieldset>\",\"</fieldset>\"],thead:[1,\"<table>\",\"</table>\"],tr:[2,\"<table><tbody>\",\"</tbody></table>\"],td:[3,\"<table><tbody><tr>\",\"</tr></tbody></table>\"],col:[2,\"<table><tbody></tbody><colgroup>\",\"</colgroup></table>\"],area:[1,\"<map>\",\"</map>\"],_default:[0,\"\",\"\"]},ac=a(av);\n"
+"ax.optgroup=ax.option;ax.tbody=ax.tfoot=ax.colgroup=ax.caption=ax.thead;ax.th=ax.td;if(!b.support.htmlSerialize){ax._default=[1,\"div<div>\",\"</div>\"]}b.fn.extend({text:function(e){if(b.isFunction(e)){return this.each(function(bw){var bv=b(this);bv.text(e.call(this,bw,bv.text()))})}if(typeof e!==\"object\"&&e!==L){return this.empty().append((this[0]&&this[0].ownerDocument||av).createTextNode(e))}return b.text(this)},wrapAll:function(e){if(b.isFunction(e)){return this.each(function(bw){b(this).wrapAll(e.call(this,bw))})}if(this[0]){var bv=b(e,this[0].ownerDocument).eq(0).clone(true);if(this[0].parentNode){bv.insertBefore(this[0])}bv.map(function(){var bw=this;while(bw.firstChild&&bw.firstChild.nodeType===1){bw=bw.firstChild}return bw}).append(this)}return this},wrapInner:function(e){if(b.isFunction(e)){return this.each(function(bv){b(this).wrapInner(e.call(this,bv))})}return this.each(function(){var bv=b(this),bw=bv.contents();if(bw.length){bw.wrapAll(e)}else{bv.append(e)}})},wrap:function(e){var bv=b.isFunction(e);return this.each(function(bw){b(this).wrapAll(bv?e.call(this,bw):e)})},unwrap:function(){return this.parent().each(function(){if(!b.nodeName(this,\"body\")){b(this).replaceWith(this.childNodes)}}).end()},append:function(){return this.domManip(arguments,true,function(e){if(this.nodeType===1){this.appendChild(e)}})},prepend:function(){return this.domManip(arguments,true,function(e){if(this.nodeType===1){this.insertBefore(e,this.firstChild)}})},before:function(){if(this[0]&&this[0].parentNode){return this.domManip(arguments,false,function(bv){this.parentNode.insertBefore(bv,this)})}else{if(arguments.length){var e=b.clean(arguments);e.push.apply(e,this.toArray());return this.pushStack(e,\"before\",arguments)}}},after:function(){if(this[0]&&this[0].parentNode){return this.domManip(arguments,false,function(bv){this.parentNode.insertBefore(bv,this.nextSibling)})}else{if(arguments.length){var e=this.pushStack(this,\"after\",arguments);e.push.apply(e,b.clean(arguments));return e}}},remove:function(e,bx){for(var bv=0,bw;(bw=this[bv])!=null;bv++){if(!e||b.filter(e,[bw]).length){if(!bx&&bw.nodeType===1){b.cleanData(bw.getElementsByTagName(\"*\"));b.cleanData([bw])}if(bw.parentNode){bw.parentNode.removeChild(bw)}}}return this},empty:function(){for(var e=0,bv;(bv=this[e])!=null;e++){if(bv.nodeType===1){b.cleanData(bv.getElementsByTagName(\"*\"))}while(bv.firstChild){bv.removeChild(bv.firstChild)}}return this},clone:function(bv,e){bv=bv==null?false:bv;e=e==null?bv:e;return this.map(function(){return b.clone(this,bv,e)})},html:function(bx){if(bx===L){return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(ag,\"\"):null}else{if(typeof bx===\"string\"&&!ae.test(bx)&&(b.support.leadingWhitespace||!ar.test(bx))&&!ax[(d.exec(bx)||[\"\",\"\"])[1].toLowerCase()]){bx=bx.replace(R,\"<$1></$2>\");try{for(var bw=0,bv=this.length;bw<bv;bw++){if(this[bw].nodeType===1){b.cleanData(this[bw].getElementsByTagName(\"*\"));this[bw].innerHTML=bx}}}catch(by){this.empty().append(bx)}}else{if(b.isFunction(bx)){this.each(function(bz){var e=b(this);e.html(bx.call(this,bz,e.html()))})}else{this.empty().append(bx)}}}return this},replaceWith:function(e){if(this[0]&&this[0].parentNode){if(b.isFunction(e)){return this.each(function(bx){var bw=b(this),bv=bw.html();bw.replaceWith(e.call(this,bx,bv))})}if(typeof e!==\"string\"){e=b(e).detach()}return this.each(function(){var bw=this.nextSibling,bv=this.parentNode;b(this).remove();if(bw){b(bw).before(e)}else{b(bv).append(e)}})}else{return this.length?this.pushStack(b(b.isFunction(e)?e():e),\"replaceWith\",e):this}},detach:function(e){return this.remove(e,true)},domManip:function(bB,bF,bE){var bx,by,bA,bD,bC=bB[0],bv=[];if(!b.support.checkClone&&arguments.length===3&&typeof bC===\"string\"&&o.test(bC)){return this.each(function(){b(this).domManip(bB,bF,bE,true)})}if(b.isFunction(bC)){return this.each(function(bH){var bG=b(this);bB[0]=bC.call(this,bH,bF?bG.html():L);bG.domManip(bB,bF,bE)})}if(this[0]){bD=bC&&bC.parentNode;if(b.support.parentNode&&bD&&bD.nodeType===11&&bD.childNodes.length===this.length){bx={fragment:bD}}else{bx=b.buildFragment(bB,this,bv)}bA=bx.fragment;if(bA.childNodes.length===1){by=bA=bA.firstChild}else{by=bA.firstChild}if(by){bF=bF&&b.nodeName(by,\"tr\");for(var bw=0,e=this.length,bz=e-1;bw<e;bw++){bE.call(bF?ba(this[bw],by):this[bw],bx.cacheable||(e>1&&bw<bz)?b.clone(bA,true,true):bA)}}if(bv.length){b.each(bv,bo)}}return this}});function ba(e,bv){return b.nodeName(e,\"table\")?(e.getElementsByTagName(\"tbody\")[0]||e.appendChild(e.ownerDocument.createElement(\"tbody\"))):e}function t(bB,bv){if(bv.nodeType!==1||!b.hasData(bB)){return}var by,bx,e,bA=b._data(bB),bz=b._data(bv,bA),bw=bA.events;if(bw){delete bz.handle;bz.events={};for(by in bw){for(bx=0,e=bw[by].length;bx<e;bx++){b.event.add(bv,by+(bw[by][bx].namespace?\".\":\"\")+bw[by][bx].namespace,bw[by][bx],bw[by][bx].data)}}}if(bz.data){bz.data=b.extend({},bz.data)}}function ai(bv,e){var bw;if(e.nodeType!==1){return}if(e.clearAttributes){e.clearAttributes()}if(e.mergeAttributes){e.mergeAttributes(bv)}bw=e.nodeName.toLowerCase();if(bw===\"object\"){e.outerHTML=bv.outerHTML}else{if(bw===\"input\"&&(bv.type===\"checkbox\"||bv.type===\"radio\")){if(bv.checked){e.defaultChecked=e.checked=bv.checked}if(e.value!==bv.value){e.value=bv.value}}else{if(bw===\"option\"){e.selected=bv.defaultSelected}else{if(bw===\"input\"||bw===\"textarea\"){e.defaultValue=bv.defaultValue}}}}e.removeAttribute(b.expando)}b.buildFragment=function(bz,bx,bv){var by,e,bw,bA,bB=bz[0];if(bx&&bx[0]){bA=bx[0].ownerDocument||bx[0]}if(!bA.createDocumentFragment){bA=av}if(bz.length===1&&typeof bB===\"string\"&&bB.length<512&&bA===av&&bB.charAt(0)===\"<\"&&!O.test(bB)&&(b.support.checkClone||!o.test(bB))&&(b.support.html5Clone||!ah.test(bB))){e=true;bw=b.fragments[bB];if(bw&&bw!==1){by=bw}}if(!by){by=bA.createDocumentFragment();b.clean(bz,bA,by,bv)}if(e){b.fragments[bB]=bw?by:1}return{fragment:by,cacheable:e}};b.fragments={};b.each({appendTo:\"append\",prependTo:\"prepend\",insertBefore:\"before\",insertAfter:\"after\",replaceAll:\"replaceWith\"},function(e,bv){b.fn[e]=function(bw){var bz=[],bC=b(bw),bB=this.length===1&&this[0].parentNode;if(bB&&bB.nodeType===11&&bB.childNodes.length===1&&bC.length===1){bC[bv](this[0]);return this}else{for(var bA=0,bx=bC.length;bA<bx;bA++){var by=(bA>0?this.clone(true):this).get();b(bC[bA])[bv](by);bz=bz.concat(by)}return this.pushStack(bz,e,bC.selector)}}});function bg(e){if(typeof e.getElementsByTagName!==\"undefined\"){return e.getElementsByTagName(\"*\")}else{if(typeof e.querySelectorAll!==\"undefined\"){return e.querySelectorAll(\"*\")}else{return[]}}}function az(e){if(e.type===\"checkbox\"||e.type===\"radio\"){e.defaultChecked=e.checked}}function E(e){var bv=(e.nodeName||\"\").toLowerCase();if(bv===\"input\"){az(e)}else{if(bv!==\"script\"&&typeof e.getElementsByTagName!==\"undefined\"){b.grep(e.getElementsByTagName(\"input\"),az)}}}function al(e){var bv=av.createElement(\"div\");ac.appendChild(bv);bv.innerHTML=e.outerHTML;return bv.firstChild}b.extend({clone:function(by,bA,bw){var e,bv,bx,bz=b.support.html5Clone||!ah.test(\"<\"+by.nodeName)?by.cloneNode(true):al(by);if((!b.support.noCloneEvent||!b.support.noCloneChecked)&&(by.nodeType===1||by.nodeType===11)&&!b.isXMLDoc(by)){ai(by,bz);e=bg(by);bv=bg(bz);for(bx=0;e[bx];++bx){if(bv[bx]){ai(e[bx],bv[bx])}}}if(bA){t(by,bz);if(bw){e=bg(by);bv=bg(bz);for(bx=0;e[bx];++bx){t(e[bx],bv[bx])}}}e=bv=null;return bz},clean:function(bw,by,bH,bA){var bF;by=by||av;if(typeof by.createElement===\"undefined\"){by=by.ownerDocument||by[0]&&by[0].ownerDocument||av}var bI=[],bB;for(var bE=0,bz;(bz=bw[bE])!=null;bE++){if(typeof bz===\"number\"){bz+=\"\"}if(!bz){continue}if(typeof bz===\"string\"){if(!W.test(bz)){bz=by.createTextNode(bz)}else{bz=bz.replace(R,\"<$1></$2>\");var bK=(d.exec(bz)||[\"\",\"\"])[1].toLowerCase(),bx=ax[bK]||ax._default,bD=bx[0],bv=by.createElement(\"div\");if(by===av){ac.appendChild(bv)}else{a(by).appendChild(bv)}bv.innerHTML=bx[1]+bz+bx[2];while(bD--){bv=bv.lastChild}if(!b.support.tbody){var e=w.test(bz),bC=bK===\"table\"&&!e?bv.firstChild&&bv.firstChild.childNodes:bx[1]===\"<table>\"&&!e?bv.childNodes:[];for(bB=bC.length-1;bB>=0;--bB){if(b.nodeName(bC[bB],\"tbody\")&&!bC[bB].childNodes.length){bC[bB].parentNode.removeChild(bC[bB])}}}if(!b.support.leadingWhitespace&&ar.test(bz)){bv.insertBefore(by.createTextNode(ar.exec(bz)[0]),bv.firstChild)}bz=bv.childNodes}}var bG;if(!b.support.appendChecked){if(bz[0]&&typeof(bG=bz.length)===\"number\"){for(bB=0;bB<bG;bB++){E(bz[bB])}}else{E(bz)}}if(bz.nodeType){bI.push(bz)}else{bI=b.merge(bI,bz)}}if(bH){bF=function(bL){return !bL.type||bm.test(bL.type)};for(bE=0;bI[bE];bE++){if(bA&&b.nodeName(bI[bE],\"script\")&&(!bI[bE].type||bI[bE].type.toLowerCase()===\"text/javascript\")){bA.push(bI[bE].parentNode?bI[bE].parentNode.removeChild(bI[bE]):bI[bE])}else{if(bI[bE].nodeType===1){var bJ=b.grep(bI[bE].getElementsByTagName(\"script\"),bF);bI.splice.apply(bI,[bE+1,0].concat(bJ))}bH.appendChild(bI[bE])}}}return bI},cleanData:function(bv){var by,bw,e=b.cache,bB=b.event.special,bA=b.support.deleteExpando;for(var bz=0,bx;(bx=bv[bz])!=null;bz++){if(bx.nodeName&&b.noData[bx.nodeName.toLowerCase()]){continue}bw=bx[b.expando];if(bw){by=e[bw];if(by&&by.events){for(var bC in by.events){if(bB[bC]){b.event.remove(bx,bC)}else{b.removeEvent(bx,bC,by.handle)}}if(by.handle){by.handle.elem=null}}if(bA){delete bx[b.expando]}else{if(bx.removeAttribute){bx.removeAttribute(b.expando)}}delete e[bw]}}}});function bo(e,bv){if(bv.src){b.ajax({url:bv.src,async:false,dataType:\"script\"})}else{b.globalEval((bv.text||bv.textContent||bv.innerHTML||\"\").replace(aN,\"/*$0*/\"))}if(bv.parentNode){bv.parentNode.removeChild(bv)}}var ak=/alpha\\([^)]*\\)/i,au=/opacity=([^)]*)/,z=/([A-Z]|^ms)/g,bc=/^-?\\d+(?:px)?$/i,bn=/^-?\\d/,I=/^([\\-+])=([\\-+.\\de]+)/,a7={position:\"absolute\",visibility:\"hidden\",display:\"block\"},an=[\"Left\",\"Right\"],a1=[\"Top\",\"Bottom\"],Z,aI,aX;b.fn.css=function(e,bv){if(arguments.length===2&&bv===L){return this}return b.access(this,e,bv,true,function(bx,bw,by){return by!==L?b.style(bx,bw,by):b.css(bx,bw)})};b.extend({cssHooks:{opacity:{get:function(bw,bv){if(bv){var e=Z(bw,\"opacity\",\"opacity\");return e===\"\"?\"1\":e}else{return bw.style.opacity}}}},cssNumber:{fillOpacity:true,fontWeight:true,lineHeight:true,opacity:true,orphans:true,widows:true,zIndex:true,zoom:true},cssProps:{\"float\":b.support.cssFloat?\"cssFloat\":\"styleFloat\"},style:function(bx,bw,bD,by){if(!bx||bx.nodeType===3||bx.nodeType===8||!bx.style){return}var bB,bC,bz=b.camelCase(bw),bv=bx.style,bE=b.cssHooks[bz];bw=b.cssProps[bz]||bz;if(bD!==L){bC=typeof bD;if(bC===\"string\"&&(bB=I.exec(bD))){bD=(+(bB[1]+1)*+bB[2])+parseFloat(b.css(bx,bw));bC=\"number\"}if(bD==null||bC===\"number\"&&isNaN(bD)){return}if(bC===\"number\"&&!b.cssNumber[bz]){bD+=\"px\"}if(!bE||!(\"set\" in bE)||(bD=bE.set(bx,bD))!==L){try{bv[bw]=bD}catch(bA){}}}else{if(bE&&\"get\" in bE&&(bB=bE.get(bx,false,by))!==L){return bB}return bv[bw]}},css:function(by,bx,bv){var bw,e;bx=b.camelCase(bx);e=b.cssHooks[bx];bx=b.cssProps[bx]||bx;if(bx===\"cssFloat\"){bx=\"float\"}if(e&&\"get\" in e&&(bw=e.get(by,true,bv))!==L){return bw}else{if(Z){return Z(by,bx)}}},swap:function(bx,bw,by){var e={};for(var bv in bw){e[bv]=bx.style[bv];bx.style[bv]=bw[bv]}by.call(bx);for(bv in bw){bx.style[bv]=e[bv]}}});b.curCSS=b.css;b.each([\"height\",\"width\"],function(bv,e){b.cssHooks[e]={get:function(by,bx,bw){var bz;if(bx){if(by.offsetWidth!==0){return p(by,e,bw)}else{b.swap(by,a7,function(){bz=p(by,e,bw)})}return bz}},set:function(bw,bx){if(bc.test(bx)){bx=parseFloat(bx);if(bx>=0){return bx+\"px\"}}else{return bx}}}});if(!b.support.opacity){b.cssHooks.opacity={get:function(bv,e){return au.test((e&&bv.currentStyle?bv.currentStyle.filter:bv.style.filter)||\"\")?(parseFloat(RegExp.$1)/100)+\"\":e?\"1\":\"\"},set:function(by,bz){var bx=by.style,bv=by.currentStyle,e=b.isNumeric(bz)?\"alpha(opacity=\"+bz*100+\")\":\"\",bw=bv&&bv.filter||bx.filter||\"\";bx.zoom=1;if(bz>=1&&b.trim(bw.replace(ak,\"\"))===\"\"){bx.removeAttribute(\"filter\");if(bv&&!bv.filter){return}}bx.filter=ak.test(bw)?bw.replace(ak,e):bw+\" \"+e}}}b(function(){if(!b.support.reliableMarginRight){b.cssHooks.marginRight={get:function(bw,bv){var e;b.swap(bw,{display:\"inline-block\"},function(){if(bv){e=Z(bw,\"margin-right\",\"marginRight\")}else{e=bw.style.marginRight}});return e}}}});if(av.defaultView&&av.defaultView.getComputedStyle){aI=function(by,bw){var bv,bx,e;bw=bw.replace(z,\"-$1\").toLowerCase();if((bx=by.ownerDocument.defaultView)&&(e=bx.getComputedStyle(by,null))){bv=e.getPropertyValue(bw);if(bv===\"\"&&!b.contains(by.ownerDocument.documentElement,by)){bv=b.style(by,bw)}}return bv}}if(av.documentElement.currentStyle){aX=function(bz,bw){var bA,e,by,bv=bz.currentStyle&&bz.currentStyle[bw],bx=bz.style;if(bv===null&&bx&&(by=bx[bw])){bv=by}if(!bc.test(bv)&&bn.test(bv)){bA=bx.left;e=bz.runtimeStyle&&bz.runtimeStyle.left;if(e){bz.runtimeStyle.left=bz.currentStyle.left}bx.left=bw===\"fontSize\"?\"1em\":(bv||0);bv=bx.pixelLeft+\"px\";bx.left=bA;if(e){bz.runtimeStyle.left=e}}return bv===\"\"?\"auto\":bv}}Z=aI||aX;function p(by,bw,bv){var bA=bw===\"width\"?by.offsetWidth:by.offsetHeight,bz=bw===\"width\"?an:a1,bx=0,e=bz.length;\n"
index 3635172..c0f18ce 100644 (file)
@@ -1,2 +1,3 @@
-{for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1></$2>");try{for(var c=0,d=this.length;c<d;c++)this[c].nodeType===1&&(f.cleanData(this[c].getElementsByTagName("*")),this[c].innerHTML=a)}catch(e){this.empty().append(a)}}else f.isFunction(a)?this.each(function(b){var c=f(this);c.html(a.call(this,b,c.html()))}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(f.isFunction(a))return this.each(function(b){var c=f(this),d=c.html();c.replaceWith(a.call(this,b,d))});typeof a!="string"&&(a=f(a).detach());return this.each(function(){var b=this.nextSibling,c=this.parentNode;f(this).remove(),b?f(b).before(a):f(c).append(a)})}return this.length?this.pushStack(f(f.isFunction(a)?a():a),"replaceWith",a):this},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,d){var e,g,h,i,j=a[0],k=[];if(!f.support.checkClone&&arguments.length===3&&typeof j=="string"&&bd.test(j))return this.each(function(){f(this).domManip(a,c,d,!0)});if(f.isFunction(j))return this.each(function(e){var g=f(this);a[0]=j.call(this,e,c?g.html():b),g.domManip(a,c,d)});if(this[0]){i=j&&j.parentNode,f.support.parentNode&&i&&i.nodeType===11&&i.childNodes.length===this.length?e={fragment:i}:e=f.buildFragment(a,this,k),h=e.fragment,h.childNodes.length===1?g=h=h.firstChild:g=h.firstChild;if(g){c=c&&f.nodeName(g,"tr");for(var l=0,m=this.length,n=m-1;l<m;l++)d.call(c?bi(this[l],g):this[l],e.cacheable||m>1&&l<n?f.clone(h,!0,!0):h)}k.length&&f.each(k,bp)}return this}}),f.buildFragment=function(a,b,d){var e,g,h,i,j=a[0];b&&b[0]&&(i=b[0].ownerDocument||b[0]),i.createDocumentFragment||(i=c),a.length===1&&typeof j=="string"&&j.length<512&&i===c&&j.charAt(0)==="<"&&!bb.test(j)&&(f.support.checkClone||!bd.test(j))&&(f.support.html5Clone||!bc.test(j))&&(g=!0,h=f.fragments[j],h&&h!==1&&(e=h)),e||(e=i.createDocumentFragment(),f.clean(a,i,e,d)),g&&(f.fragments[j]=h?e:1);return{fragment:e,cacheable:g}},f.fragments={},f.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){f.fn[a]=function(c){var d=[],e=f(c),g=this.length===1&&this[0].parentNode;if(g&&g.nodeType===11&&g.childNodes.length===1&&e.length===1){e[b](this[0]);return this}for(var h=0,i=e.length;h<i;h++){var j=(h>0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||!bc.test("<"+a.nodeName)?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!_.test(k))k=b.createTextNode(k);else{k=k.replace(Y,"<$1></$2>");var l=(Z.exec(k)||["",""])[1].toLowerCase(),m=bg[l]||bg._default,n=m[0],o=b.createElement("div");b===c?bh.appendChild(o):U(b).appendChild(o),o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=$.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]==="<table>"&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&X.test(k)&&o.insertBefore(b.createTextNode(X.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i<r;i++)bn(k[i]);else bn(k);k.nodeType?h.push(k):h=f.merge(h,k)}if(d){g=function(a){return!a.type||be.test(a.type)};for(j=0;h[j];j++)if(e&&f.nodeName(h[j],"script")&&(!h[j].type||h[j].type.toLowerCase()==="text/javascript"))e.push(h[j].parentNode?h[j].parentNode.removeChild(h[j]):h[j]);else{if(h[j].nodeType===1){var s=f.grep(h[j].getElementsByTagName("script"),g);h.splice.apply(h,[j+1,0].concat(s))}d.appendChild(h[j])}}return h},cleanData:function(a){var b,c,d=f.cache,e=f.event.special,g=f.support.deleteExpando;for(var h=0,i;(i=a[h])!=null;h++){if(i.nodeName&&f.noData[i.nodeName.toLowerCase()])continue;c=i[f.expando];if(c){b=d[c];if(b&&b.events){for(var j in b.events)e[j]?f.event.remove(i,j):f.removeEvent(i,j,b.handle);b.handle&&(b.handle.elem=null)}g?delete i[f.expando]:i.removeAttribute&&i.removeAttribute(f.expando),delete d[c]}}}});var bq=/alpha\([^)]*\)/i,br=/opacity=([^)]*)/,bs=/([A-Z]|^ms)/g,bt=/^-?\d+(?:px)?$/i,bu=/^-?\d/,bv=/^([\-+])=([\-+.\de]+)/,bw={position:"absolute",visibility:"hidden",display:"block"},bx=["Left","Right"],by=["Top","Bottom"],bz,bA,bB;f.fn.css=function(a,c){if(arguments.length===2&&c===b)return this;return f.access(this,a,c,!0,function(a,c,d){return d!==b?f.style(a,c,d):f.css(a,c)})},f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=bz(a,"opacity","opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":f.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCase(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&"get"in k&&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d,h==="string"&&(g=bv.exec(d))&&(d=+(g[1]+1)*+g[2]+parseFloat(f.css(a,c)),h="number");if(d==null||h==="number"&&isNaN(d))return;h==="number"&&!f.cssNumber[i]&&(d+="px");if(!k||!("set"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c==="cssFloat"&&(c="float");if(g&&"get"in g&&(e=g.get(a,!0,d))!==b)return e;if(bz)return bz(a,c)},swap:function(a,b,c){var d={};for(var e in b)d[e]=a.style[e],a.style[e]=b[e];c.call(a);for(e in b)a.style[e]=d[e]}}),f.curCSS=f.css,f.each(["height","width"],function(a,b){f.cssHooks[b]={get:function(a,c,d){var e;if(c){if(a.offsetWidth!==0)return bC(a,b,d);f.swap(a,bw,function(){e=bC(a,b,d)});return e}},set:function(a,b){if(!bt.test(b))return b;b=parseFloat(b);if(b>=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return br.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bq,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bq.test(g)?g.replace(bq,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bz(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bA=function(a,b){var c,d,e;b=b.replace(bs,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b)));return c}),c.documentElement.currentStyle&&(bB=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f===null&&g&&(e=g[b])&&(f=e),!bt.test(f)&&bu.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f||0,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),bz=bA||bB,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bD=/%20/g,bE=/\[\]$/,bF=/\r?\n/g,bG=/#.*$/,bH=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bI=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bJ=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bK=/^(?:GET|HEAD)$/,bL=/^\/\//,bM=/\?/,bN=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,bO=/^(?:select|textarea)/i,bP=/\s+/,bQ=/([?&])_=[^&]*/,bR=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bS=f.fn.load,bT={},bU={},bV,bW,bX=["*/"]+["*"];try{bV=e.href}catch(bY){bV=c.createElement("a"),bV.href="",bV=bV.href}bW=bR.exec(bV.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bS)return bS.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("<div>").append(c.replace(bN,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bO.test(this.nodeName)||bI.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bF,"\r\n")}}):{name:b.name,value:c.replace(bF,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?b_(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b_(a,b);return a},ajaxSettings:{url:bV,isLocal:bJ.test(bW[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bX},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bZ(bT),ajaxTransport:bZ(bU),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?cb(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=cc(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bH.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bG,"").replace(bL,bW[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bP),d.crossDomain==null&&(r=bR.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bW[1]&&r[2]==bW[2]&&(r[3]||(r[1]==="http:"?80:443))==(bW[3]||(bW[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),b$(bT,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bK.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bM.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bQ,"$1_="+x);d.url=y+(y===d.url?(bM.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bX+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=b$(bU,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2)w(-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)ca(g,a[g],c,e);return d.join("&").replace(bD,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cd=f.now(),ce=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cd++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ce.test(b.url)||e&&ce.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ce,l),b.url===j&&(e&&(k=k.replace(ce,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cf=a.ActiveXObject?function(){for(var a in ch)ch[a](0,1)}:!1,cg=0,ch;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ci()||cj()}:ci,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c)
-{if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cf&&delete ch[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cg,cf&&(ch||(ch={},f(a).unload(cf)),ch[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var ck={},cl,cm,cn=/^(?:toggle|show|hide)$/,co=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cp,cq=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cr;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cu("show",3),a,b,c);for(var g=0,h=this.length;g<h;g++)d=this[g],d.style&&(e=d.style.display,!f._data(d,"olddisplay")&&e==="none"&&(e=d.style.display=""),e===""&&f.css(d,"display")==="none"&&f._data(d,"olddisplay",cv(d.nodeName)));for(g=0;g<h;g++){d=this[g];if(d.style){e=d.style.display;if(e===""||e==="none")d.style.display=f._data(d,"olddisplay")||""}}return this},hide:function(a,b,c){if(a||a===0)return this.animate(cu("hide",3),a,b,c);var d,e,g=0,h=this.length;for(;g<h;g++)d=this[g],d.style&&(e=f.css(d,"display"),e!=="none"&&!f._data(d,"olddisplay")&&f._data(d,"olddisplay",e));for(g=0;g<h;g++)this[g].style&&(this[g].style.display="none");return this},_toggle:f.fn.toggle,toggle:function(a,b,c){var d=typeof a=="boolean";f.isFunction(a)&&f.isFunction(b)?this._toggle.apply(this,arguments):a==null||d?this.each(function(){var b=d?a:f(this).is(":hidden");f(this)[b?"show":"hide"]()}):this.animate(cu("toggle",3),a,b,c);return this},fadeTo:function(a,b,c,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){function g(){e.queue===!1&&f._mark(this);var b=f.extend({},e),c=this.nodeType===1,d=c&&f(this).is(":hidden"),g,h,i,j,k,l,m,n,o;b.animatedProperties={};for(i in a){g=f.camelCase(i),i!==g&&(a[g]=a[i],delete a[i]),h=a[g],f.isArray(h)?(b.animatedProperties[g]=h[1],h=a[g]=h[0]):b.animatedProperties[g]=b.specialEasing&&b.specialEasing[g]||b.easing||"swing";if(h==="hide"&&d||h==="show"&&!d)return b.complete.call(this);c&&(g==="height"||g==="width")&&(b.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY],f.css(this,"display")==="inline"&&f.css(this,"float")==="none"&&(!f.support.inlineBlockNeedsLayout||cv(this.nodeName)==="inline"?this.style.display="inline-block":this.style.zoom=1))}b.overflow!=null&&(this.style.overflow="hidden");for(i in a)j=new f.fx(this,b,i),h=a[i],cn.test(h)?(o=f._data(this,"toggle"+i)||(h==="toggle"?d?"show":"hide":0),o?(f._data(this,"toggle"+i,o==="show"?"hide":"show"),j[o]()):j[h]()):(k=co.exec(h),l=j.cur(),k?(m=parseFloat(k[2]),n=k[3]||(f.cssNumber[i]?"":"px"),n!=="px"&&(f.style(this,i,(m||1)+n),l=(m||1)/j.cur()*l,f.style(this,i,l+n)),k[1]&&(m=(k[1]==="-="?-1:1)*m+l),j.custom(l,m,n)):j.custom(l,h,""));return!0}var e=f.speed(b,c,d);if(f.isEmptyObject(a))return this.each(e.complete,[!1]);a=f.extend({},a);return e.queue===!1?this.each(g):this.queue(e.queue,g)},stop:function(a,c,d){typeof a!="string"&&(d=c,c=a,a=b),c&&a!==!1&&this.queue(a||"fx",[]);return this.each(function(){function h(a,b,c){var e=b[c];f.removeData(a,c,!0),e.stop(d)}var b,c=!1,e=f.timers,g=f._data(this);d||f._unmark(!0,this);if(a==null)for(b in g)g[b]&&g[b].stop&&b.indexOf(".run")===b.length-4&&h(this,g,b);else g[b=a+".run"]&&g[b].stop&&h(this,g,b);for(b=e.length;b--;)e[b].elem===this&&(a==null||e[b].queue===a)&&(d?e[b](!0):e[b].saveState(),c=!0,e.splice(b,1));(!d||!c)&&f.dequeue(this,a)})}}),f.each({slideDown:cu("show",1),slideUp:cu("hide",1),slideToggle:cu("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){f.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),f.extend({speed:function(a,b,c){var d=a&&typeof a=="object"?f.extend({},a):{complete:c||!c&&b||f.isFunction(a)&&a,duration:a,easing:c&&b||b&&!f.isFunction(b)&&b};d.duration=f.fx.off?0:typeof d.duration=="number"?d.duration:d.duration in f.fx.speeds?f.fx.speeds[d.duration]:f.fx.speeds._default;if(d.queue==null||d.queue===!0)d.queue="fx";d.old=d.complete,d.complete=function(a){f.isFunction(d.old)&&d.old.call(this),d.queue?f.dequeue(this,d.queue):a!==!1&&f._unmark(this)};return d},easing:{linear:function(a,b,c,d){return c+d*a},swing:function(a,b,c,d){return(-Math.cos(a*Math.PI)/2+.5)*d+c}},timers:[],fx:function(a,b,c){this.options=b,this.elem=a,this.prop=c,b.orig=b.orig||{}}}),f.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this),(f.fx.step[this.prop]||f.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a,b=f.css(this.elem,this.prop);return isNaN(a=parseFloat(b))?!b||b==="auto"?0:b:a},custom:function(a,c,d){function h(a){return e.step(a)}var e=this,g=f.fx;this.startTime=cr||cs(),this.end=c,this.now=this.start=a,this.pos=this.state=0,this.unit=d||this.unit||(f.cssNumber[this.prop]?"":"px"),h.queue=this.options.queue,h.elem=this.elem,h.saveState=function(){e.options.hide&&f._data(e.elem,"fxshow"+e.prop)===b&&f._data(e.elem,"fxshow"+e.prop,e.start)},h()&&f.timers.push(h)&&!cp&&(cp=setInterval(g.tick,g.interval))},show:function(){var a=f._data(this.elem,"fxshow"+this.prop);this.options.orig[this.prop]=a||f.style(this.elem,this.prop),this.options.show=!0,a!==b?this.custom(this.cur(),a):this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur()),f(this.elem).show()},hide:function(){this.options.orig[this.prop]=f._data(this.elem,"fxshow"+this.prop)||f.style(this.elem,this.prop),this.options.hide=!0,this.custom(this.cur(),0)},step:function(a){var b,c,d,e=cr||cs(),g=!0,h=this.elem,i=this.options;if(a||e>=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c<b.length;c++)a=b[c],!a()&&b[c]===a&&b.splice(c--,1);b.length||f.fx.stop()},interval:13,stop:function(){clearInterval(cp),cp=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){f.style(a.elem,"opacity",a.now)},_default:function(a){a.elem.style&&a.elem.style[a.prop]!=null?a.elem.style[a.prop]=a.now+a.unit:a.elem[a.prop]=a.now}}}),f.each(["width","height"],function(a,b){f.fx.step[b]=function(a){f.style(a.elem,b,Math.max(0,a.now)+a.unit)}}),f.expr&&f.expr.filters&&(f.expr.filters.animated=function(a){return f.grep(f.timers,function(b){return a===b.elem}).length});var cw=/^t(?:able|d|h)$/i,cx=/^(?:body|html)$/i;"getBoundingClientRect"in c.documentElement?f.fn.offset=function(a){var b=this[0],c;if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);try{c=b.getBoundingClientRect()}catch(d){}var e=b.ownerDocument,g=e.documentElement;if(!c||!f.contains(g,b))return c?{top:c.top,left:c.left}:{top:0,left:0};var h=e.body,i=cy(e),j=g.clientTop||h.clientTop||0,k=g.clientLeft||h.clientLeft||0,l=i.pageYOffset||f.support.boxModel&&g.scrollTop||h.scrollTop,m=i.pageXOffset||f.support.boxModel&&g.scrollLeft||h.scrollLeft,n=c.top+l-j,o=c.left+m-k;return{top:n,left:o}}:f.fn.offset=function(a){var b=this[0];if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);var c,d=b.offsetParent,e=b,g=b.ownerDocument,h=g.documentElement,i=g.body,j=g.defaultView,k=j?j.getComputedStyle(b,null):b.currentStyle,l=b.offsetTop,m=b.offsetLeft;while((b=b.parentNode)&&b!==i&&b!==h){if(f.support.fixedPosition&&k.position==="fixed")break;c=j?j.getComputedStyle(b,null):b.currentStyle,l-=b.scrollTop,m-=b.scrollLeft,b===d&&(l+=b.offsetTop,m+=b.offsetLeft,f.support.doesNotAddBorder&&(!f.support.doesAddBorderForTableAndCells||!cw.test(b.nodeName))&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),e=d,d=b.offsetParent),f.support.subtractsBorderForOverflowNotVisible&&c.overflow!=="visible"&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),k=c}if(k.position==="relative"||k.position==="static")l+=i.offsetTop,m+=i.offsetLeft;f.support.fixedPosition&&k.position==="fixed"&&(l+=Math.max(h.scrollTop,i.scrollTop),m+=Math.max(h.scrollLeft,i.scrollLeft));return{top:l,left:m}},f.offset={bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.support.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,"marginTop"))||0,c+=parseFloat(f.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,"position");d==="static"&&(a.style.position="relative");var e=f(a),g=e.offset(),h=f.css(a,"top"),i=f.css(a,"left"),j=(d==="absolute"||d==="fixed")&&f.inArray("auto",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cy(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cy(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,d,"padding")):this[d]():null},f.fn["outer"+c]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,d,a?"margin":"border")):this[d]():null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c],h=e.document.body;return e.document.compatMode==="CSS1Compat"&&g||h&&h["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var i=f.css(e,d),j=parseFloat(i);return f.isNumeric(j)?j:i}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return f})})(window);
+if(bA>0){if(bv!=="border"){for(;bx<e;bx++){if(!bv){bA-=parseFloat(b.css(by,"padding"+bz[bx]))||0}if(bv==="margin"){bA+=parseFloat(b.css(by,bv+bz[bx]))||0}else{bA-=parseFloat(b.css(by,"border"+bz[bx]+"Width"))||0}}}return bA+"px"}bA=Z(by,bw,bw);if(bA<0||bA==null){bA=by.style[bw]||0}bA=parseFloat(bA)||0;if(bv){for(;bx<e;bx++){bA+=parseFloat(b.css(by,"padding"+bz[bx]))||0;if(bv!=="padding"){bA+=parseFloat(b.css(by,"border"+bz[bx]+"Width"))||0}if(bv==="margin"){bA+=parseFloat(b.css(by,bv+bz[bx]))||0}}}return bA+"px"}if(b.expr&&b.expr.filters){b.expr.filters.hidden=function(bw){var bv=bw.offsetWidth,e=bw.offsetHeight;return(bv===0&&e===0)||(!b.support.reliableHiddenOffsets&&((bw.style&&bw.style.display)||b.css(bw,"display"))==="none")};b.expr.filters.visible=function(e){return !b.expr.filters.hidden(e)}}var k=/%20/g,ap=/\[\]$/,bs=/\r?\n/g,bq=/#.*$/,aD=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,aZ=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,aM=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,aQ=/^(?:GET|HEAD)$/,c=/^\/\//,M=/\?/,a6=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,q=/^(?:select|textarea)/i,h=/\s+/,br=/([?&])_=[^&]*/,K=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,A=b.fn.load,aa={},r={},aE,s,aV=["*/"]+["*"];try{aE=bl.href}catch(aw){aE=av.createElement("a");aE.href="";aE=aE.href}s=K.exec(aE.toLowerCase())||[];function f(e){return function(by,bA){if(typeof by!=="string"){bA=by;by="*"}if(b.isFunction(bA)){var bx=by.toLowerCase().split(h),bw=0,bz=bx.length,bv,bB,bC;for(;bw<bz;bw++){bv=bx[bw];bC=/^\+/.test(bv);if(bC){bv=bv.substr(1)||"*"}bB=e[bv]=e[bv]||[];bB[bC?"unshift":"push"](bA)}}}}function aW(bv,bE,bz,bD,bB,bx){bB=bB||bE.dataTypes[0];bx=bx||{};bx[bB]=true;var bA=bv[bB],bw=0,e=bA?bA.length:0,by=(bv===aa),bC;for(;bw<e&&(by||!bC);bw++){bC=bA[bw](bE,bz,bD);if(typeof bC==="string"){if(!by||bx[bC]){bC=L}else{bE.dataTypes.unshift(bC);bC=aW(bv,bE,bz,bD,bC,bx)}}}if((by||!bC)&&!bx["*"]){bC=aW(bv,bE,bz,bD,"*",bx)}return bC}function am(bw,bx){var bv,e,by=b.ajaxSettings.flatOptions||{};for(bv in bx){if(bx[bv]!==L){(by[bv]?bw:(e||(e={})))[bv]=bx[bv]}}if(e){b.extend(true,bw,e)}}b.fn.extend({load:function(bw,bz,bA){if(typeof bw!=="string"&&A){return A.apply(this,arguments)}else{if(!this.length){return this}}var by=bw.indexOf(" ");if(by>=0){var e=bw.slice(by,bw.length);bw=bw.slice(0,by)}var bx="GET";if(bz){if(b.isFunction(bz)){bA=bz;bz=L}else{if(typeof bz==="object"){bz=b.param(bz,b.ajaxSettings.traditional);bx="POST"}}}var bv=this;b.ajax({url:bw,type:bx,dataType:"html",data:bz,complete:function(bC,bB,bD){bD=bC.responseText;if(bC.isResolved()){bC.done(function(bE){bD=bE});bv.html(e?b("<div>").append(bD.replace(a6,"")).find(e):bD)}if(bA){bv.each(bA,[bD,bB,bC])}}});return this},serialize:function(){return b.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?b.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||q.test(this.nodeName)||aZ.test(this.type))}).map(function(e,bv){var bw=b(this).val();return bw==null?null:b.isArray(bw)?b.map(bw,function(by,bx){return{name:bv.name,value:by.replace(bs,"\r\n")}}):{name:bv.name,value:bw.replace(bs,"\r\n")}}).get()}});b.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(e,bv){b.fn[bv]=function(bw){return this.on(bv,bw)}});b.each(["get","post"],function(e,bv){b[bv]=function(bw,by,bz,bx){if(b.isFunction(by)){bx=bx||bz;bz=by;by=L}return b.ajax({type:bv,url:bw,data:by,success:bz,dataType:bx})}});b.extend({getScript:function(e,bv){return b.get(e,L,bv,"script")},getJSON:function(e,bv,bw){return b.get(e,bv,bw,"json")},ajaxSetup:function(bv,e){if(e){am(bv,b.ajaxSettings)}else{e=bv;bv=b.ajaxSettings}am(bv,e);return bv},ajaxSettings:{url:aE,isLocal:aM.test(s[1]),global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":aV},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":bb.String,"text html":true,"text json":b.parseJSON,"text xml":b.parseXML},flatOptions:{context:true,url:true}},ajaxPrefilter:f(aa),ajaxTransport:f(r),ajax:function(bz,bx){if(typeof bz==="object"){bx=bz;bz=L}bx=bx||{};var bD=b.ajaxSetup({},bx),bS=bD.context||bD,bG=bS!==bD&&(bS.nodeType||bS instanceof b)?b(bS):b.event,bR=b.Deferred(),bN=b.Callbacks("once memory"),bB=bD.statusCode||{},bC,bH={},bO={},bQ,by,bL,bE,bI,bA=0,bw,bK,bJ={readyState:0,setRequestHeader:function(bT,bU){if(!bA){var e=bT.toLowerCase();bT=bO[e]=bO[e]||bT;bH[bT]=bU}return this},getAllResponseHeaders:function(){return bA===2?bQ:null},getResponseHeader:function(bT){var e;if(bA===2){if(!by){by={};while((e=aD.exec(bQ))){by[e[1].toLowerCase()]=e[2]}}e=by[bT.toLowerCase()]}return e===L?null:e},overrideMimeType:function(e){if(!bA){bD.mimeType=e}return this},abort:function(e){e=e||"abort";if(bL){bL.abort(e)}bF(0,e);return this}};function bF(bZ,bU,b0,bW){if(bA===2){return}bA=2;if(bE){clearTimeout(bE)}bL=L;bQ=bW||"";bJ.readyState=bZ>0?4:0;var bT,b4,b3,bX=bU,bY=b0?bj(bD,bJ,b0):L,bV,b2;if(bZ>=200&&bZ<300||bZ===304){if(bD.ifModified){if((bV=bJ.getResponseHeader("Last-Modified"))){b.lastModified[bC]=bV}if((b2=bJ.getResponseHeader("Etag"))){b.etag[bC]=b2}}if(bZ===304){bX="notmodified";bT=true}else{try{b4=G(bD,bY);bX="success";bT=true}catch(b1){bX="parsererror";b3=b1}}}else{b3=bX;if(!bX||bZ){bX="error";if(bZ<0){bZ=0}}}bJ.status=bZ;bJ.statusText=""+(bU||bX);if(bT){bR.resolveWith(bS,[b4,bX,bJ])}else{bR.rejectWith(bS,[bJ,bX,b3])}bJ.statusCode(bB);bB=L;if(bw){bG.trigger("ajax"+(bT?"Success":"Error"),[bJ,bD,bT?b4:b3])}bN.fireWith(bS,[bJ,bX]);if(bw){bG.trigger("ajaxComplete",[bJ,bD]);if(!(--b.active)){b.event.trigger("ajaxStop")}}}bR.promise(bJ);bJ.success=bJ.done;bJ.error=bJ.fail;bJ.complete=bN.add;bJ.statusCode=function(bT){if(bT){var e;if(bA<2){for(e in bT){bB[e]=[bB[e],bT[e]]}}else{e=bT[bJ.status];bJ.then(e,e)}}return this};bD.url=((bz||bD.url)+"").replace(bq,"").replace(c,s[1]+"//");bD.dataTypes=b.trim(bD.dataType||"*").toLowerCase().split(h);if(bD.crossDomain==null){bI=K.exec(bD.url.toLowerCase());bD.crossDomain=!!(bI&&(bI[1]!=s[1]||bI[2]!=s[2]||(bI[3]||(bI[1]==="http:"?80:443))!=(s[3]||(s[1]==="http:"?80:443))))}if(bD.data&&bD.processData&&typeof bD.data!=="string"){bD.data=b.param(bD.data,bD.traditional)}aW(aa,bD,bx,bJ);if(bA===2){return false}bw=bD.global;bD.type=bD.type.toUpperCase();bD.hasContent=!aQ.test(bD.type);if(bw&&b.active++===0){b.event.trigger("ajaxStart")}if(!bD.hasContent){if(bD.data){bD.url+=(M.test(bD.url)?"&":"?")+bD.data;delete bD.data}bC=bD.url;if(bD.cache===false){var bv=b.now(),bP=bD.url.replace(br,"$1_="+bv);bD.url=bP+((bP===bD.url)?(M.test(bD.url)?"&":"?")+"_="+bv:"")}}if(bD.data&&bD.hasContent&&bD.contentType!==false||bx.contentType){bJ.setRequestHeader("Content-Type",bD.contentType)}if(bD.ifModified){bC=bC||bD.url;if(b.lastModified[bC]){bJ.setRequestHeader("If-Modified-Since",b.lastModified[bC])}if(b.etag[bC]){bJ.setRequestHeader("If-None-Match",b.etag[bC])}}bJ.setRequestHeader("Accept",bD.dataTypes[0]&&bD.accepts[bD.dataTypes[0]]?bD.accepts[bD.dataTypes[0]]+(bD.dataTypes[0]!=="*"?", "+aV+"; q=0.01":""):bD.accepts["*"]);for(bK in bD.headers){bJ.setRequestHeader(bK,bD.headers[bK])}if(bD.beforeSend&&(bD.beforeSend.call(bS,bJ,bD)===false||bA===2)){bJ.abort();return false}for(bK in {success:1,error:1,complete:1}){bJ[bK](bD[bK])}bL=aW(r,bD,bx,bJ);if(!bL){bF(-1,"No Transport")}else{bJ.readyState=1;if(bw){bG.trigger("ajaxSend",[bJ,bD])}if(bD.async&&bD.timeout>0){bE=setTimeout(function(){bJ.abort("timeout")},bD.timeout)}try{bA=1;bL.send(bH,bF)}catch(bM){if(bA<2){bF(-1,bM)}else{throw bM}}}return bJ},param:function(e,bw){var bv=[],by=function(bz,bA){bA=b.isFunction(bA)?bA():bA;bv[bv.length]=encodeURIComponent(bz)+"="+encodeURIComponent(bA)};if(bw===L){bw=b.ajaxSettings.traditional}if(b.isArray(e)||(e.jquery&&!b.isPlainObject(e))){b.each(e,function(){by(this.name,this.value)})}else{for(var bx in e){v(bx,e[bx],bw,by)}}return bv.join("&").replace(k,"+")}});function v(bw,by,bv,bx){if(b.isArray(by)){b.each(by,function(bA,bz){if(bv||ap.test(bw)){bx(bw,bz)}else{v(bw+"["+(typeof bz==="object"||b.isArray(bz)?bA:"")+"]",bz,bv,bx)}})}else{if(!bv&&by!=null&&typeof by==="object"){for(var e in by){v(bw+"["+e+"]",by[e],bv,bx)}}else{bx(bw,by)}}}b.extend({active:0,lastModified:{},etag:{}});function bj(bD,bC,bz){var bv=bD.contents,bB=bD.dataTypes,bw=bD.responseFields,by,bA,bx,e;for(bA in bw){if(bA in bz){bC[bw[bA]]=bz[bA]}}while(bB[0]==="*"){bB.shift();if(by===L){by=bD.mimeType||bC.getResponseHeader("content-type")}}if(by){for(bA in bv){if(bv[bA]&&bv[bA].test(by)){bB.unshift(bA);break}}}if(bB[0] in bz){bx=bB[0]}else{for(bA in bz){if(!bB[0]||bD.converters[bA+" "+bB[0]]){bx=bA;break}if(!e){e=bA}}bx=bx||e}if(bx){if(bx!==bB[0]){bB.unshift(bx)}return bz[bx]}}function G(bH,bz){if(bH.dataFilter){bz=bH.dataFilter(bz,bH.dataType)}var bD=bH.dataTypes,bG={},bA,bE,bw=bD.length,bB,bC=bD[0],bx,by,bF,bv,e;for(bA=1;bA<bw;bA++){if(bA===1){for(bE in bH.converters){if(typeof bE==="string"){bG[bE.toLowerCase()]=bH.converters[bE]}}}bx=bC;bC=bD[bA];if(bC==="*"){bC=bx}else{if(bx!=="*"&&bx!==bC){by=bx+" "+bC;bF=bG[by]||bG["* "+bC];if(!bF){e=L;for(bv in bG){bB=bv.split(" ");if(bB[0]===bx||bB[0]==="*"){e=bG[bB[1]+" "+bC];if(e){bv=bG[bv];if(bv===true){bF=e}else{if(e===true){bF=bv}}break}}}}if(!(bF||e)){b.error("No conversion from "+by.replace(" "," to "))}if(bF!==true){bz=bF?bF(bz):e(bv(bz))}}}}return bz}var aC=b.now(),u=/(\=)\?(&|$)|\?\?/i;b.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return b.expando+"_"+(aC++)}});b.ajaxPrefilter("json jsonp",function(bD,bA,bC){var bx=bD.contentType==="application/x-www-form-urlencoded"&&(typeof bD.data==="string");if(bD.dataTypes[0]==="jsonp"||bD.jsonp!==false&&(u.test(bD.url)||bx&&u.test(bD.data))){var bB,bw=bD.jsonpCallback=b.isFunction(bD.jsonpCallback)?bD.jsonpCallback():bD.jsonpCallback,bz=bb[bw],e=bD.url,by=bD.data,bv="$1"+bw+"$2";if(bD.jsonp!==false){e=e.replace(u,bv);if(bD.url===e){if(bx){by=by.replace(u,bv)}if(bD.data===by){e+=(/\?/.test(e)?"&":"?")+bD.jsonp+"="+bw}}}bD.url=e;bD.data=by;bb[bw]=function(bE){bB=[bE]};bC.always(function(){bb[bw]=bz;if(bB&&b.isFunction(bz)){bb[bw](bB[0])}});bD.converters["script json"]=function(){if(!bB){b.error(bw+" was not called")}return bB[0]};bD.dataTypes[0]="json";return"script"}});b.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(e){b.globalEval(e);return e}}});b.ajaxPrefilter("script",function(e){if(e.cache===L){e.cache=false}if(e.crossDomain){e.type="GET";e.global=false}});b.ajaxTransport("script",function(bw){if(bw.crossDomain){var e,bv=av.head||av.getElementsByTagName("head")[0]||av.documentElement;return{send:function(bx,by){e=av.createElement("script");e.async="async";if(bw.scriptCharset){e.charset=bw.scriptCharset}e.src=bw.url;e.onload=e.onreadystatechange=function(bA,bz){if(bz||!e.readyState||/loaded|complete/.test(e.readyState)){e.onload=e.onreadystatechange=null;if(bv&&e.parentNode){bv.removeChild(e)}e=L;if(!bz){by(200,"success")}}};bv.insertBefore(e,bv.firstChild)},abort:function(){if(e){e.onload(0,1)}}}}});var B=bb.ActiveXObject?function(){for(var e in N){N[e](0,1)}}:false,y=0,N;function aL(){try{return new bb.XMLHttpRequest()}catch(bv){}}function aj(){try{return new bb.ActiveXObject("Microsoft.XMLHTTP")}catch(bv){}}b.ajaxSettings.xhr=bb.ActiveXObject?function(){return !this.isLocal&&aL()||aj()}:aL;(function(e){b.extend(b.support,{ajax:!!e,cors:!!e&&("withCredentials" in e)})})(b.ajaxSettings.xhr());if(b.support.ajax){b.ajaxTransport(function(e){if(!e.crossDomain||b.support.cors){var bv;return{send:function(bB,bw){var bA=e.xhr(),bz,by;if(e.username){bA.open(e.type,e.url,e.async,e.username,e.password)}else{bA.open(e.type,e.url,e.async)}if(e.xhrFields){for(by in e.xhrFields){bA[by]=e.xhrFields[by]}}if(e.mimeType&&bA.overrideMimeType){bA.overrideMimeType(e.mimeType)}if(!e.crossDomain&&!bB["X-Requested-With"]){bB["X-Requested-With"]="XMLHttpRequest"}try{for(by in bB){bA.setRequestHeader(by,bB[by])}}catch(bx){}bA.send((e.hasContent&&e.data)||null);bv=function(bK,bE){var bF,bD,bC,bI,bH;try{if(bv&&(bE||bA.readyState===4)){bv=L;if(bz){bA.onreadystatechange=b.noop;if(B){delete N[bz]}}if(bE){if(bA.readyState!==4){bA.abort()}}else{bF=bA.status;bC=bA.getAllResponseHeaders();bI={};bH=bA.responseXML;if(bH&&bH.documentElement){bI.xml=bH}bI.text=bA.responseText;try{bD=bA.statusText}catch(bJ){bD=""}if(!bF&&e.isLocal&&!e.crossDomain){bF=bI.text?200:404}else{if(bF===1223){bF=204}}}}}catch(bG){if(!bE){bw(-1,bG)}}if(bI){bw(bF,bD,bI,bC)}};if(!e.async||bA.readyState===4){bv()}else{bz=++y;if(B){if(!N){N={};b(bb).unload(B)}N[bz]=bv}bA.onreadystatechange=bv}},abort:function(){if(bv){bv(0,1)
+}}}}})}var Q={},a8,m,aB=/^(?:toggle|show|hide)$/,aT=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,a3,aH=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],a4;b.fn.extend({show:function(bx,bA,bz){var bw,by;if(bx||bx===0){return this.animate(a0("show",3),bx,bA,bz)}else{for(var bv=0,e=this.length;bv<e;bv++){bw=this[bv];if(bw.style){by=bw.style.display;if(!b._data(bw,"olddisplay")&&by==="none"){by=bw.style.display=""}if(by===""&&b.css(bw,"display")==="none"){b._data(bw,"olddisplay",x(bw.nodeName))}}}for(bv=0;bv<e;bv++){bw=this[bv];if(bw.style){by=bw.style.display;if(by===""||by==="none"){bw.style.display=b._data(bw,"olddisplay")||""}}}return this}},hide:function(bx,bA,bz){if(bx||bx===0){return this.animate(a0("hide",3),bx,bA,bz)}else{var bw,by,bv=0,e=this.length;for(;bv<e;bv++){bw=this[bv];if(bw.style){by=b.css(bw,"display");if(by!=="none"&&!b._data(bw,"olddisplay")){b._data(bw,"olddisplay",by)}}}for(bv=0;bv<e;bv++){if(this[bv].style){this[bv].style.display="none"}}return this}},_toggle:b.fn.toggle,toggle:function(bw,bv,bx){var e=typeof bw==="boolean";if(b.isFunction(bw)&&b.isFunction(bv)){this._toggle.apply(this,arguments)}else{if(bw==null||e){this.each(function(){var by=e?bw:b(this).is(":hidden");b(this)[by?"show":"hide"]()})}else{this.animate(a0("toggle",3),bw,bv,bx)}}return this},fadeTo:function(e,bx,bw,bv){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:bx},e,bw,bv)},animate:function(bz,bw,by,bx){var e=b.speed(bw,by,bx);if(b.isEmptyObject(bz)){return this.each(e.complete,[false])}bz=b.extend({},bz);function bv(){if(e.queue===false){b._mark(this)}var bE=b.extend({},e),bK=this.nodeType===1,bI=bK&&b(this).is(":hidden"),bB,bF,bD,bJ,bH,bC,bG,bL,bA;bE.animatedProperties={};for(bD in bz){bB=b.camelCase(bD);if(bD!==bB){bz[bB]=bz[bD];delete bz[bD]}bF=bz[bB];if(b.isArray(bF)){bE.animatedProperties[bB]=bF[1];bF=bz[bB]=bF[0]}else{bE.animatedProperties[bB]=bE.specialEasing&&bE.specialEasing[bB]||bE.easing||"swing"}if(bF==="hide"&&bI||bF==="show"&&!bI){return bE.complete.call(this)}if(bK&&(bB==="height"||bB==="width")){bE.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY];if(b.css(this,"display")==="inline"&&b.css(this,"float")==="none"){if(!b.support.inlineBlockNeedsLayout||x(this.nodeName)==="inline"){this.style.display="inline-block"}else{this.style.zoom=1}}}}if(bE.overflow!=null){this.style.overflow="hidden"}for(bD in bz){bJ=new b.fx(this,bE,bD);bF=bz[bD];if(aB.test(bF)){bA=b._data(this,"toggle"+bD)||(bF==="toggle"?bI?"show":"hide":0);if(bA){b._data(this,"toggle"+bD,bA==="show"?"hide":"show");bJ[bA]()}else{bJ[bF]()}}else{bH=aT.exec(bF);bC=bJ.cur();if(bH){bG=parseFloat(bH[2]);bL=bH[3]||(b.cssNumber[bD]?"":"px");if(bL!=="px"){b.style(this,bD,(bG||1)+bL);bC=((bG||1)/bJ.cur())*bC;b.style(this,bD,bC+bL)}if(bH[1]){bG=((bH[1]==="-="?-1:1)*bG)+bC}bJ.custom(bC,bG,bL)}else{bJ.custom(bC,bF,"")}}}return true}return e.queue===false?this.each(bv):this.queue(e.queue,bv)},stop:function(bw,bv,e){if(typeof bw!=="string"){e=bv;bv=bw;bw=L}if(bv&&bw!==false){this.queue(bw||"fx",[])}return this.each(function(){var bx,by=false,bA=b.timers,bz=b._data(this);if(!e){b._unmark(true,this)}function bB(bE,bF,bD){var bC=bF[bD];b.removeData(bE,bD,true);bC.stop(e)}if(bw==null){for(bx in bz){if(bz[bx]&&bz[bx].stop&&bx.indexOf(".run")===bx.length-4){bB(this,bz,bx)}}}else{if(bz[bx=bw+".run"]&&bz[bx].stop){bB(this,bz,bx)}}for(bx=bA.length;bx--;){if(bA[bx].elem===this&&(bw==null||bA[bx].queue===bw)){if(e){bA[bx](true)}else{bA[bx].saveState()}by=true;bA.splice(bx,1)}}if(!(e&&by)){b.dequeue(this,bw)}})}});function bh(){setTimeout(at,0);return(a4=b.now())}function at(){a4=L}function a0(bv,e){var bw={};b.each(aH.concat.apply([],aH.slice(0,e)),function(){bw[this]=bv});return bw}b.each({slideDown:a0("show",1),slideUp:a0("hide",1),slideToggle:a0("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,bv){b.fn[e]=function(bw,by,bx){return this.animate(bv,bw,by,bx)}});b.extend({speed:function(bw,bx,bv){var e=bw&&typeof bw==="object"?b.extend({},bw):{complete:bv||!bv&&bx||b.isFunction(bw)&&bw,duration:bw,easing:bv&&bx||bx&&!b.isFunction(bx)&&bx};e.duration=b.fx.off?0:typeof e.duration==="number"?e.duration:e.duration in b.fx.speeds?b.fx.speeds[e.duration]:b.fx.speeds._default;if(e.queue==null||e.queue===true){e.queue="fx"}e.old=e.complete;e.complete=function(by){if(b.isFunction(e.old)){e.old.call(this)}if(e.queue){b.dequeue(this,e.queue)}else{if(by!==false){b._unmark(this)}}};return e},easing:{linear:function(bw,bx,e,bv){return e+bv*bw},swing:function(bw,bx,e,bv){return((-Math.cos(bw*Math.PI)/2)+0.5)*bv+e}},timers:[],fx:function(bv,e,bw){this.options=e;this.elem=bv;this.prop=bw;e.orig=e.orig||{}}});b.fx.prototype={update:function(){if(this.options.step){this.options.step.call(this.elem,this.now,this)}(b.fx.step[this.prop]||b.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null)){return this.elem[this.prop]}var e,bv=b.css(this.elem,this.prop);return isNaN(e=parseFloat(bv))?!bv||bv==="auto"?0:bv:e},custom:function(bz,by,bx){var e=this,bw=b.fx;this.startTime=a4||bh();this.end=by;this.now=this.start=bz;this.pos=this.state=0;this.unit=bx||this.unit||(b.cssNumber[this.prop]?"":"px");function bv(bA){return e.step(bA)}bv.queue=this.options.queue;bv.elem=this.elem;bv.saveState=function(){if(e.options.hide&&b._data(e.elem,"fxshow"+e.prop)===L){b._data(e.elem,"fxshow"+e.prop,e.start)}};if(bv()&&b.timers.push(bv)&&!a3){a3=setInterval(bw.tick,bw.interval)}},show:function(){var e=b._data(this.elem,"fxshow"+this.prop);this.options.orig[this.prop]=e||b.style(this.elem,this.prop);this.options.show=true;if(e!==L){this.custom(this.cur(),e)}else{this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur())}b(this.elem).show()},hide:function(){this.options.orig[this.prop]=b._data(this.elem,"fxshow"+this.prop)||b.style(this.elem,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(by){var bA,bB,bv,bx=a4||bh(),e=true,bz=this.elem,bw=this.options;if(by||bx>=bw.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();bw.animatedProperties[this.prop]=true;for(bA in bw.animatedProperties){if(bw.animatedProperties[bA]!==true){e=false}}if(e){if(bw.overflow!=null&&!b.support.shrinkWrapBlocks){b.each(["","X","Y"],function(bC,bD){bz.style["overflow"+bD]=bw.overflow[bC]})}if(bw.hide){b(bz).hide()}if(bw.hide||bw.show){for(bA in bw.animatedProperties){b.style(bz,bA,bw.orig[bA]);b.removeData(bz,"fxshow"+bA,true);b.removeData(bz,"toggle"+bA,true)}}bv=bw.complete;if(bv){bw.complete=false;bv.call(bz)}}return false}else{if(bw.duration==Infinity){this.now=bx}else{bB=bx-this.startTime;this.state=bB/bw.duration;this.pos=b.easing[bw.animatedProperties[this.prop]](this.state,bB,0,1,bw.duration);this.now=this.start+((this.end-this.start)*this.pos)}this.update()}return true}};b.extend(b.fx,{tick:function(){var bw,bv=b.timers,e=0;for(;e<bv.length;e++){bw=bv[e];if(!bw()&&bv[e]===bw){bv.splice(e--,1)}}if(!bv.length){b.fx.stop()}},interval:13,stop:function(){clearInterval(a3);a3=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(e){b.style(e.elem,"opacity",e.now)},_default:function(e){if(e.elem.style&&e.elem.style[e.prop]!=null){e.elem.style[e.prop]=e.now+e.unit}else{e.elem[e.prop]=e.now}}}});b.each(["width","height"],function(e,bv){b.fx.step[bv]=function(bw){b.style(bw.elem,bv,Math.max(0,bw.now)+bw.unit)}});if(b.expr&&b.expr.filters){b.expr.filters.animated=function(e){return b.grep(b.timers,function(bv){return e===bv.elem}).length}}function x(bx){if(!Q[bx]){var e=av.body,bv=b("<"+bx+">").appendTo(e),bw=bv.css("display");bv.remove();if(bw==="none"||bw===""){if(!a8){a8=av.createElement("iframe");a8.frameBorder=a8.width=a8.height=0}e.appendChild(a8);if(!m||!a8.createElement){m=(a8.contentWindow||a8.contentDocument).document;m.write((av.compatMode==="CSS1Compat"?"<!doctype html>":"")+"<html><body>");m.close()}bv=m.createElement(bx);m.body.appendChild(bv);bw=b.css(bv,"display");e.removeChild(a8)}Q[bx]=bw}return Q[bx]}var V=/^t(?:able|d|h)$/i,ad=/^(?:body|html)$/i;if("getBoundingClientRect" in av.documentElement){b.fn.offset=function(bI){var by=this[0],bB;if(bI){return this.each(function(e){b.offset.setOffset(this,bI,e)})}if(!by||!by.ownerDocument){return null}if(by===by.ownerDocument.body){return b.offset.bodyOffset(by)}try{bB=by.getBoundingClientRect()}catch(bF){}var bH=by.ownerDocument,bw=bH.documentElement;if(!bB||!b.contains(bw,by)){return bB?{top:bB.top,left:bB.left}:{top:0,left:0}}var bC=bH.body,bD=aK(bH),bA=bw.clientTop||bC.clientTop||0,bE=bw.clientLeft||bC.clientLeft||0,bv=bD.pageYOffset||b.support.boxModel&&bw.scrollTop||bC.scrollTop,bz=bD.pageXOffset||b.support.boxModel&&bw.scrollLeft||bC.scrollLeft,bG=bB.top+bv-bA,bx=bB.left+bz-bE;return{top:bG,left:bx}}}else{b.fn.offset=function(bF){var bz=this[0];if(bF){return this.each(function(bG){b.offset.setOffset(this,bF,bG)})}if(!bz||!bz.ownerDocument){return null}if(bz===bz.ownerDocument.body){return b.offset.bodyOffset(bz)}var bC,bw=bz.offsetParent,bv=bz,bE=bz.ownerDocument,bx=bE.documentElement,bA=bE.body,bB=bE.defaultView,e=bB?bB.getComputedStyle(bz,null):bz.currentStyle,bD=bz.offsetTop,by=bz.offsetLeft;while((bz=bz.parentNode)&&bz!==bA&&bz!==bx){if(b.support.fixedPosition&&e.position==="fixed"){break}bC=bB?bB.getComputedStyle(bz,null):bz.currentStyle;bD-=bz.scrollTop;by-=bz.scrollLeft;if(bz===bw){bD+=bz.offsetTop;by+=bz.offsetLeft;if(b.support.doesNotAddBorder&&!(b.support.doesAddBorderForTableAndCells&&V.test(bz.nodeName))){bD+=parseFloat(bC.borderTopWidth)||0;by+=parseFloat(bC.borderLeftWidth)||0}bv=bw;bw=bz.offsetParent}if(b.support.subtractsBorderForOverflowNotVisible&&bC.overflow!=="visible"){bD+=parseFloat(bC.borderTopWidth)||0;by+=parseFloat(bC.borderLeftWidth)||0}e=bC}if(e.position==="relative"||e.position==="static"){bD+=bA.offsetTop;by+=bA.offsetLeft}if(b.support.fixedPosition&&e.position==="fixed"){bD+=Math.max(bx.scrollTop,bA.scrollTop);by+=Math.max(bx.scrollLeft,bA.scrollLeft)}return{top:bD,left:by}}}b.offset={bodyOffset:function(e){var bw=e.offsetTop,bv=e.offsetLeft;if(b.support.doesNotIncludeMarginInBodyOffset){bw+=parseFloat(b.css(e,"marginTop"))||0;bv+=parseFloat(b.css(e,"marginLeft"))||0}return{top:bw,left:bv}},setOffset:function(bx,bG,bA){var bB=b.css(bx,"position");if(bB==="static"){bx.style.position="relative"}var bz=b(bx),bv=bz.offset(),e=b.css(bx,"top"),bE=b.css(bx,"left"),bF=(bB==="absolute"||bB==="fixed")&&b.inArray("auto",[e,bE])>-1,bD={},bC={},bw,by;if(bF){bC=bz.position();bw=bC.top;by=bC.left}else{bw=parseFloat(e)||0;by=parseFloat(bE)||0}if(b.isFunction(bG)){bG=bG.call(bx,bA,bv)}if(bG.top!=null){bD.top=(bG.top-bv.top)+bw}if(bG.left!=null){bD.left=(bG.left-bv.left)+by}if("using" in bG){bG.using.call(bx,bD)}else{bz.css(bD)}}};b.fn.extend({position:function(){if(!this[0]){return null}var bw=this[0],bv=this.offsetParent(),bx=this.offset(),e=ad.test(bv[0].nodeName)?{top:0,left:0}:bv.offset();bx.top-=parseFloat(b.css(bw,"marginTop"))||0;bx.left-=parseFloat(b.css(bw,"marginLeft"))||0;e.top+=parseFloat(b.css(bv[0],"borderTopWidth"))||0;e.left+=parseFloat(b.css(bv[0],"borderLeftWidth"))||0;return{top:bx.top-e.top,left:bx.left-e.left}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||av.body;while(e&&(!ad.test(e.nodeName)&&b.css(e,"position")==="static")){e=e.offsetParent}return e})}});b.each(["Left","Top"],function(bv,e){var bw="scroll"+e;b.fn[bw]=function(bz){var bx,by;if(bz===L){bx=this[0];if(!bx){return null}by=aK(bx);return by?("pageXOffset" in by)?by[bv?"pageYOffset":"pageXOffset"]:b.support.boxModel&&by.document.documentElement[bw]||by.document.body[bw]:bx[bw]}return this.each(function(){by=aK(this);if(by){by.scrollTo(!bv?bz:b(by).scrollLeft(),bv?bz:b(by).scrollTop())}else{this[bw]=bz}})}});function aK(e){return b.isWindow(e)?e:e.nodeType===9?e.defaultView||e.parentWindow:false}b.each(["Height","Width"],function(bv,e){var bw=e.toLowerCase();b.fn["inner"+e]=function(){var bx=this[0];return bx?bx.style?parseFloat(b.css(bx,bw,"padding")):this[bw]():null};b.fn["outer"+e]=function(by){var bx=this[0];return bx?bx.style?parseFloat(b.css(bx,bw,by?"margin":"border")):this[bw]():null};b.fn[bw]=function(bz){var bA=this[0];if(!bA){return bz==null?null:this}if(b.isFunction(bz)){return this.each(function(bE){var bD=b(this);bD[bw](bz.call(this,bE,bD[bw]()))})}if(b.isWindow(bA)){var bB=bA.document.documentElement["client"+e],bx=bA.document.body;return bA.document.compatMode==="CSS1Compat"&&bB||bx&&bx["client"+e]||bB}else{if(bA.nodeType===9){return Math.max(bA.documentElement["client"+e],bA.body["scroll"+e],bA.documentElement["scroll"+e],bA.body["offset"+e],bA.documentElement["offset"+e])}else{if(bz===L){var bC=b.css(bA,bw),by=parseFloat(bC);return b.isNumeric(by)?by:bC}else{return this.css(bw,typeof bz==="string"?bz:bz+"px")}}}}});bb.jQuery=bb.$=b;if(typeof define==="function"&&define.amd&&define.amd.jQuery){define("jquery",[],function(){return b
+})}})(window);
\ No newline at end of file
index 9fe869c..880da7f 100644 (file)
@@ -1,2 +1,3 @@
-"{for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName(\"*\"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(W,\"\"):null;if(typeof a==\"string\"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||[\"\",\"\"])[1].toLowerCase()]){a=a.replace(Y,\"<$1></$2>\");try{for(var c=0,d=this.length;c<d;c++)this[c].nodeType===1&&(f.cleanData(this[c].getElementsByTagName(\"*\")),this[c].innerHTML=a)}catch(e){this.empty().append(a)}}else f.isFunction(a)?this.each(function(b){var c=f(this);c.html(a.call(this,b,c.html()))}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(f.isFunction(a))return this.each(function(b){var c=f(this),d=c.html();c.replaceWith(a.call(this,b,d))});typeof a!=\"string\"&&(a=f(a).detach());return this.each(function(){var b=this.nextSibling,c=this.parentNode;f(this).remove(),b?f(b).before(a):f(c).append(a)})}return this.length?this.pushStack(f(f.isFunction(a)?a():a),\"replaceWith\",a):this},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,d){var e,g,h,i,j=a[0],k=[];if(!f.support.checkClone&&arguments.length===3&&typeof j==\"string\"&&bd.test(j))return this.each(function(){f(this).domManip(a,c,d,!0)});if(f.isFunction(j))return this.each(function(e){var g=f(this);a[0]=j.call(this,e,c?g.html():b),g.domManip(a,c,d)});if(this[0]){i=j&&j.parentNode,f.support.parentNode&&i&&i.nodeType===11&&i.childNodes.length===this.length?e={fragment:i}:e=f.buildFragment(a,this,k),h=e.fragment,h.childNodes.length===1?g=h=h.firstChild:g=h.firstChild;if(g){c=c&&f.nodeName(g,\"tr\");for(var l=0,m=this.length,n=m-1;l<m;l++)d.call(c?bi(this[l],g):this[l],e.cacheable||m>1&&l<n?f.clone(h,!0,!0):h)}k.length&&f.each(k,bp)}return this}}),f.buildFragment=function(a,b,d){var e,g,h,i,j=a[0];b&&b[0]&&(i=b[0].ownerDocument||b[0]),i.createDocumentFragment||(i=c),a.length===1&&typeof j==\"string\"&&j.length<512&&i===c&&j.charAt(0)===\"<\"&&!bb.test(j)&&(f.support.checkClone||!bd.test(j))&&(f.support.html5Clone||!bc.test(j))&&(g=!0,h=f.fragments[j],h&&h!==1&&(e=h)),e||(e=i.createDocumentFragment(),f.clean(a,i,e,d)),g&&(f.fragments[j]=h?e:1);return{fragment:e,cacheable:g}},f.fragments={},f.each({appendTo:\"append\",prependTo:\"prepend\",insertBefore:\"before\",insertAfter:\"after\",replaceAll:\"replaceWith\"},function(a,b){f.fn[a]=function(c){var d=[],e=f(c),g=this.length===1&&this[0].parentNode;if(g&&g.nodeType===11&&g.childNodes.length===1&&e.length===1){e[b](this[0]);return this}for(var h=0,i=e.length;h<i;h++){var j=(h>0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||!bc.test(\"<\"+a.nodeName)?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement==\"undefined\"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k==\"number\"&&(k+=\"\");if(!k)continue;if(typeof k==\"string\")if(!_.test(k))k=b.createTextNode(k);else{k=k.replace(Y,\"<$1></$2>\");var l=(Z.exec(k)||[\"\",\"\"])[1].toLowerCase(),m=bg[l]||bg._default,n=m[0],o=b.createElement(\"div\");b===c?bh.appendChild(o):U(b).appendChild(o),o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=$.test(k),q=l===\"table\"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]===\"<table>\"&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],\"tbody\")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&X.test(k)&&o.insertBefore(b.createTextNode(X.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)==\"number\")for(i=0;i<r;i++)bn(k[i]);else bn(k);k.nodeType?h.push(k):h=f.merge(h,k)}if(d){g=function(a){return!a.type||be.test(a.type)};for(j=0;h[j];j++)if(e&&f.nodeName(h[j],\"script\")&&(!h[j].type||h[j].type.toLowerCase()===\"text/javascript\"))e.push(h[j].parentNode?h[j].parentNode.removeChild(h[j]):h[j]);else{if(h[j].nodeType===1){var s=f.grep(h[j].getElementsByTagName(\"script\"),g);h.splice.apply(h,[j+1,0].concat(s))}d.appendChild(h[j])}}return h},cleanData:function(a){var b,c,d=f.cache,e=f.event.special,g=f.support.deleteExpando;for(var h=0,i;(i=a[h])!=null;h++){if(i.nodeName&&f.noData[i.nodeName.toLowerCase()])continue;c=i[f.expando];if(c){b=d[c];if(b&&b.events){for(var j in b.events)e[j]?f.event.remove(i,j):f.removeEvent(i,j,b.handle);b.handle&&(b.handle.elem=null)}g?delete i[f.expando]:i.removeAttribute&&i.removeAttribute(f.expando),delete d[c]}}}});var bq=/alpha\\([^)]*\\)/i,br=/opacity=([^)]*)/,bs=/([A-Z]|^ms)/g,bt=/^-?\\d+(?:px)?$/i,bu=/^-?\\d/,bv=/^([\\-+])=([\\-+.\\de]+)/,bw={position:\"absolute\",visibility:\"hidden\",display:\"block\"},bx=[\"Left\",\"Right\"],by=[\"Top\",\"Bottom\"],bz,bA,bB;f.fn.css=function(a,c){if(arguments.length===2&&c===b)return this;return f.access(this,a,c,!0,function(a,c,d){return d!==b?f.style(a,c,d):f.css(a,c)})},f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=bz(a,\"opacity\",\"opacity\");return c===\"\"?\"1\":c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{\"float\":f.support.cssFloat?\"cssFloat\":\"styleFloat\"},style:function(a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCase(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&\"get\"in k&&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d,h===\"string\"&&(g=bv.exec(d))&&(d=+(g[1]+1)*+g[2]+parseFloat(f.css(a,c)),h=\"number\");if(d==null||h===\"number\"&&isNaN(d))return;h===\"number\"&&!f.cssNumber[i]&&(d+=\"px\");if(!k||!(\"set\"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c===\"cssFloat\"&&(c=\"float\");if(g&&\"get\"in g&&(e=g.get(a,!0,d))!==b)return e;if(bz)return bz(a,c)},swap:function(a,b,c){var d={};for(var e in b)d[e]=a.style[e],a.style[e]=b[e];c.call(a);for(e in b)a.style[e]=d[e]}}),f.curCSS=f.css,f.each([\"height\",\"width\"],function(a,b){f.cssHooks[b]={get:function(a,c,d){var e;if(c){if(a.offsetWidth!==0)return bC(a,b,d);f.swap(a,bw,function(){e=bC(a,b,d)});return e}},set:function(a,b){if(!bt.test(b))return b;b=parseFloat(b);if(b>=0)return b+\"px\"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return br.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||\"\")?parseFloat(RegExp.$1)/100+\"\":b?\"1\":\"\"},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?\"alpha(opacity=\"+b*100+\")\":\"\",g=d&&d.filter||c.filter||\"\";c.zoom=1;if(b>=1&&f.trim(g.replace(bq,\"\"))===\"\"){c.removeAttribute(\"filter\");if(d&&!d.filter)return}c.filter=bq.test(g)?g.replace(bq,e):g+\" \"+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:\"inline-block\"},function(){b?c=bz(a,\"margin-right\",\"marginRight\"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bA=function(a,b){var c,d,e;b=b.replace(bs,\"-$1\").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===\"\"&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b)));return c}),c.documentElement.currentStyle&&(bB=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f===null&&g&&(e=g[b])&&(f=e),!bt.test(f)&&bu.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b===\"fontSize\"?\"1em\":f||0,f=g.pixelLeft+\"px\",g.left=c,d&&(a.runtimeStyle.left=d));return f===\"\"?\"auto\":f}),bz=bA||bB,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,\"display\"))===\"none\"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bD=/%20/g,bE=/\\[\\]$/,bF=/\\r?\\n/g,bG=/#.*$/,bH=/^(.*?):[ \\t]*([^\\r\\n]*)\\r?$/mg,bI=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bJ=/^(?:about|app|app\\-storage|.+\\-extension|file|res|widget):$/,bK=/^(?:GET|HEAD)$/,bL=/^\\/\\//,bM=/\\?/,bN=/<script\\b[^<]*(?:(?!<\\/script>)<[^<]*)*<\\/script>/gi,bO=/^(?:select|textarea)/i,bP=/\\s+/,bQ=/([?&])_=[^&]*/,bR=/^([\\w\\+\\.\\-]+:)(?:\\/\\/([^\\/?#:]*)(?::(\\d+))?)?/,bS=f.fn.load,bT={},bU={},bV,bW,bX=[\"*/\"]+[\"*\"];try{bV=e.href}catch(bY){bV=c.createElement(\"a\"),bV.href=\"\",bV=bV.href}bW=bR.exec(bV.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!=\"string\"&&bS)return bS.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(\" \");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h=\"GET\";c&&(f.isFunction(c)?(d=c,c=b):typeof c==\"object\"&&(c=f.param(c,f.ajaxSettings.traditional),h=\"POST\"));var i=this;f.ajax({url:a,type:h,dataType:\"html\",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f(\"<div>\").append(c.replace(bN,\"\")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bO.test(this.nodeName)||bI.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bF,\"\\r\\n\")}}):{name:b.name,value:c.replace(bF,\"\\r\\n\")}}).get()}}),f.each(\"ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend\".split(\" \"),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each([\"get\",\"post\"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,\"script\")},getJSON:function(a,b,c){return f.get(a,b,c,\"json\")},ajaxSetup:function(a,b){b?b_(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b_(a,b);return a},ajaxSettings:{url:bV,isLocal:bJ.test(bW[1]),global:!0,type:\"GET\",contentType:\"application/x-www-form-urlencoded\",processData:!0,async:!0,accepts:{xml:\"application/xml, text/xml\",html:\"text/html\",text:\"text/plain\",json:\"application/json, text/javascript\",\"*\":bX},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:\"responseXML\",text:\"responseText\"},converters:{\"* text\":a.String,\"text html\":!0,\"text json\":f.parseJSON,\"text xml\":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bZ(bT),ajaxTransport:bZ(bU),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||\"\",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?cb(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader(\"Last-Modified\"))f.lastModified[k]=y;if(z=v.getResponseHeader(\"Etag\"))f.etag[k]=z}if(a===304)w=\"notmodified\",o=!0;else try{r=cc(d,x),w=\"success\",o=!0}catch(A){w=\"parsererror\",u=A}}else{u=w;if(!w||a)w=\"error\",a<0&&(a=0)}v.status=a,v.statusText=\"\"+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger(\"ajax\"+(o?\"Success\":\"Error\"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger(\"ajaxComplete\",[v,d]),--f.active||f.event.trigger(\"ajaxStop\"))}}typeof a==\"object\"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks(\"once memory\"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bH.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||\"abort\",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+\"\").replace(bG,\"\").replace(bL,bW[1]+\"//\"),d.dataTypes=f.trim(d.dataType||\"*\").toLowerCase().split(bP),d.crossDomain==null&&(r=bR.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bW[1]&&r[2]==bW[2]&&(r[3]||(r[1]===\"http:\"?80:443))==(bW[3]||(bW[1]===\"http:\"?80:443)))),d.data&&d.processData&&typeof d.data!=\"string\"&&(d.data=f.param(d.data,d.traditional)),b$(bT,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bK.test(d.type),t&&f.active++===0&&f.event.trigger(\"ajaxStart\");if(!d.hasContent){d.data&&(d.url+=(bM.test(d.url)?\"&\":\"?\")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bQ,\"$1_=\"+x);d.url=y+(y===d.url?(bM.test(d.url)?\"&\":\"?\")+\"_=\"+x:\"\")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader(\"Content-Type\",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader(\"If-Modified-Since\",f.lastModified[k]),f.etag[k]&&v.setRequestHeader(\"If-None-Match\",f.etag[k])),v.setRequestHeader(\"Accept\",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!==\"*\"?\", \"+bX+\"; q=0.01\":\"\"):d.accepts[\"*\"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=b$(bU,d,c,v);if(!p)w(-1,\"No Transport\");else{v.readyState=1,t&&g.trigger(\"ajaxSend\",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort(\"timeout\")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2)w(-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+\"=\"+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)ca(g,a[g],c,e);return d.join(\"&\").replace(bD,\"+\")}}),f.extend({active:0,lastModified:{},etag:{}});var cd=f.now(),ce=/(\\=)\\?(&|$)|\\?\\?/i;f.ajaxSetup({jsonp:\"callback\",jsonpCallback:function(){return f.expando+\"_\"+cd++}}),f.ajaxPrefilter(\"json jsonp\",function(b,c,d){var e=b.contentType===\"application/x-www-form-urlencoded\"&&typeof b.data==\"string\";if(b.dataTypes[0]===\"jsonp\"||b.jsonp!==!1&&(ce.test(b.url)||e&&ce.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l=\"$1\"+h+\"$2\";b.jsonp!==!1&&(j=j.replace(ce,l),b.url===j&&(e&&(k=k.replace(ce,l)),b.data===k&&(j+=(/\\?/.test(j)?\"&\":\"?\")+b.jsonp+\"=\"+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters[\"script json\"]=function(){g||f.error(h+\" was not called\");return g[0]},b.dataTypes[0]=\"json\";return\"script\"}}),f.ajaxSetup({accepts:{script:\"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript\"},contents:{script:/javascript|ecmascript/},converters:{\"text script\":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter(\"script\",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type=\"GET\",a.global=!1)}),f.ajaxTransport(\"script\",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName(\"head\")[0]||c.documentElement;return{send:function(f,g){d=c.createElement(\"script\"),d.async=\"async\",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,\"success\")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cf=a.ActiveXObject?function(){for(var a in ch)ch[a](0,1)}:!1,cg=0,ch;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ci()||cj()}:ci,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&\"withCredentials\"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c)\n"
-"{if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e[\"X-Requested-With\"]&&(e[\"X-Requested-With\"]=\"XMLHttpRequest\");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cf&&delete ch[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=\"\"}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cg,cf&&(ch||(ch={},f(a).unload(cf)),ch[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var ck={},cl,cm,cn=/^(?:toggle|show|hide)$/,co=/^([+\\-]=)?([\\d+.\\-]+)([a-z%]*)$/i,cp,cq=[[\"height\",\"marginTop\",\"marginBottom\",\"paddingTop\",\"paddingBottom\"],[\"width\",\"marginLeft\",\"marginRight\",\"paddingLeft\",\"paddingRight\"],[\"opacity\"]],cr;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cu(\"show\",3),a,b,c);for(var g=0,h=this.length;g<h;g++)d=this[g],d.style&&(e=d.style.display,!f._data(d,\"olddisplay\")&&e===\"none\"&&(e=d.style.display=\"\"),e===\"\"&&f.css(d,\"display\")===\"none\"&&f._data(d,\"olddisplay\",cv(d.nodeName)));for(g=0;g<h;g++){d=this[g];if(d.style){e=d.style.display;if(e===\"\"||e===\"none\")d.style.display=f._data(d,\"olddisplay\")||\"\"}}return this},hide:function(a,b,c){if(a||a===0)return this.animate(cu(\"hide\",3),a,b,c);var d,e,g=0,h=this.length;for(;g<h;g++)d=this[g],d.style&&(e=f.css(d,\"display\"),e!==\"none\"&&!f._data(d,\"olddisplay\")&&f._data(d,\"olddisplay\",e));for(g=0;g<h;g++)this[g].style&&(this[g].style.display=\"none\");return this},_toggle:f.fn.toggle,toggle:function(a,b,c){var d=typeof a==\"boolean\";f.isFunction(a)&&f.isFunction(b)?this._toggle.apply(this,arguments):a==null||d?this.each(function(){var b=d?a:f(this).is(\":hidden\");f(this)[b?\"show\":\"hide\"]()}):this.animate(cu(\"toggle\",3),a,b,c);return this},fadeTo:function(a,b,c,d){return this.filter(\":hidden\").css(\"opacity\",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){function g(){e.queue===!1&&f._mark(this);var b=f.extend({},e),c=this.nodeType===1,d=c&&f(this).is(\":hidden\"),g,h,i,j,k,l,m,n,o;b.animatedProperties={};for(i in a){g=f.camelCase(i),i!==g&&(a[g]=a[i],delete a[i]),h=a[g],f.isArray(h)?(b.animatedProperties[g]=h[1],h=a[g]=h[0]):b.animatedProperties[g]=b.specialEasing&&b.specialEasing[g]||b.easing||\"swing\";if(h===\"hide\"&&d||h===\"show\"&&!d)return b.complete.call(this);c&&(g===\"height\"||g===\"width\")&&(b.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY],f.css(this,\"display\")===\"inline\"&&f.css(this,\"float\")===\"none\"&&(!f.support.inlineBlockNeedsLayout||cv(this.nodeName)===\"inline\"?this.style.display=\"inline-block\":this.style.zoom=1))}b.overflow!=null&&(this.style.overflow=\"hidden\");for(i in a)j=new f.fx(this,b,i),h=a[i],cn.test(h)?(o=f._data(this,\"toggle\"+i)||(h===\"toggle\"?d?\"show\":\"hide\":0),o?(f._data(this,\"toggle\"+i,o===\"show\"?\"hide\":\"show\"),j[o]()):j[h]()):(k=co.exec(h),l=j.cur(),k?(m=parseFloat(k[2]),n=k[3]||(f.cssNumber[i]?\"\":\"px\"),n!==\"px\"&&(f.style(this,i,(m||1)+n),l=(m||1)/j.cur()*l,f.style(this,i,l+n)),k[1]&&(m=(k[1]===\"-=\"?-1:1)*m+l),j.custom(l,m,n)):j.custom(l,h,\"\"));return!0}var e=f.speed(b,c,d);if(f.isEmptyObject(a))return this.each(e.complete,[!1]);a=f.extend({},a);return e.queue===!1?this.each(g):this.queue(e.queue,g)},stop:function(a,c,d){typeof a!=\"string\"&&(d=c,c=a,a=b),c&&a!==!1&&this.queue(a||\"fx\",[]);return this.each(function(){function h(a,b,c){var e=b[c];f.removeData(a,c,!0),e.stop(d)}var b,c=!1,e=f.timers,g=f._data(this);d||f._unmark(!0,this);if(a==null)for(b in g)g[b]&&g[b].stop&&b.indexOf(\".run\")===b.length-4&&h(this,g,b);else g[b=a+\".run\"]&&g[b].stop&&h(this,g,b);for(b=e.length;b--;)e[b].elem===this&&(a==null||e[b].queue===a)&&(d?e[b](!0):e[b].saveState(),c=!0,e.splice(b,1));(!d||!c)&&f.dequeue(this,a)})}}),f.each({slideDown:cu(\"show\",1),slideUp:cu(\"hide\",1),slideToggle:cu(\"toggle\",1),fadeIn:{opacity:\"show\"},fadeOut:{opacity:\"hide\"},fadeToggle:{opacity:\"toggle\"}},function(a,b){f.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),f.extend({speed:function(a,b,c){var d=a&&typeof a==\"object\"?f.extend({},a):{complete:c||!c&&b||f.isFunction(a)&&a,duration:a,easing:c&&b||b&&!f.isFunction(b)&&b};d.duration=f.fx.off?0:typeof d.duration==\"number\"?d.duration:d.duration in f.fx.speeds?f.fx.speeds[d.duration]:f.fx.speeds._default;if(d.queue==null||d.queue===!0)d.queue=\"fx\";d.old=d.complete,d.complete=function(a){f.isFunction(d.old)&&d.old.call(this),d.queue?f.dequeue(this,d.queue):a!==!1&&f._unmark(this)};return d},easing:{linear:function(a,b,c,d){return c+d*a},swing:function(a,b,c,d){return(-Math.cos(a*Math.PI)/2+.5)*d+c}},timers:[],fx:function(a,b,c){this.options=b,this.elem=a,this.prop=c,b.orig=b.orig||{}}}),f.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this),(f.fx.step[this.prop]||f.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a,b=f.css(this.elem,this.prop);return isNaN(a=parseFloat(b))?!b||b===\"auto\"?0:b:a},custom:function(a,c,d){function h(a){return e.step(a)}var e=this,g=f.fx;this.startTime=cr||cs(),this.end=c,this.now=this.start=a,this.pos=this.state=0,this.unit=d||this.unit||(f.cssNumber[this.prop]?\"\":\"px\"),h.queue=this.options.queue,h.elem=this.elem,h.saveState=function(){e.options.hide&&f._data(e.elem,\"fxshow\"+e.prop)===b&&f._data(e.elem,\"fxshow\"+e.prop,e.start)},h()&&f.timers.push(h)&&!cp&&(cp=setInterval(g.tick,g.interval))},show:function(){var a=f._data(this.elem,\"fxshow\"+this.prop);this.options.orig[this.prop]=a||f.style(this.elem,this.prop),this.options.show=!0,a!==b?this.custom(this.cur(),a):this.custom(this.prop===\"width\"||this.prop===\"height\"?1:0,this.cur()),f(this.elem).show()},hide:function(){this.options.orig[this.prop]=f._data(this.elem,\"fxshow\"+this.prop)||f.style(this.elem,this.prop),this.options.hide=!0,this.custom(this.cur(),0)},step:function(a){var b,c,d,e=cr||cs(),g=!0,h=this.elem,i=this.options;if(a||e>=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each([\"\",\"X\",\"Y\"],function(a,b){h.style[\"overflow\"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,\"fxshow\"+b,!0),f.removeData(h,\"toggle\"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c<b.length;c++)a=b[c],!a()&&b[c]===a&&b.splice(c--,1);b.length||f.fx.stop()},interval:13,stop:function(){clearInterval(cp),cp=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){f.style(a.elem,\"opacity\",a.now)},_default:function(a){a.elem.style&&a.elem.style[a.prop]!=null?a.elem.style[a.prop]=a.now+a.unit:a.elem[a.prop]=a.now}}}),f.each([\"width\",\"height\"],function(a,b){f.fx.step[b]=function(a){f.style(a.elem,b,Math.max(0,a.now)+a.unit)}}),f.expr&&f.expr.filters&&(f.expr.filters.animated=function(a){return f.grep(f.timers,function(b){return a===b.elem}).length});var cw=/^t(?:able|d|h)$/i,cx=/^(?:body|html)$/i;\"getBoundingClientRect\"in c.documentElement?f.fn.offset=function(a){var b=this[0],c;if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);try{c=b.getBoundingClientRect()}catch(d){}var e=b.ownerDocument,g=e.documentElement;if(!c||!f.contains(g,b))return c?{top:c.top,left:c.left}:{top:0,left:0};var h=e.body,i=cy(e),j=g.clientTop||h.clientTop||0,k=g.clientLeft||h.clientLeft||0,l=i.pageYOffset||f.support.boxModel&&g.scrollTop||h.scrollTop,m=i.pageXOffset||f.support.boxModel&&g.scrollLeft||h.scrollLeft,n=c.top+l-j,o=c.left+m-k;return{top:n,left:o}}:f.fn.offset=function(a){var b=this[0];if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);var c,d=b.offsetParent,e=b,g=b.ownerDocument,h=g.documentElement,i=g.body,j=g.defaultView,k=j?j.getComputedStyle(b,null):b.currentStyle,l=b.offsetTop,m=b.offsetLeft;while((b=b.parentNode)&&b!==i&&b!==h){if(f.support.fixedPosition&&k.position===\"fixed\")break;c=j?j.getComputedStyle(b,null):b.currentStyle,l-=b.scrollTop,m-=b.scrollLeft,b===d&&(l+=b.offsetTop,m+=b.offsetLeft,f.support.doesNotAddBorder&&(!f.support.doesAddBorderForTableAndCells||!cw.test(b.nodeName))&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),e=d,d=b.offsetParent),f.support.subtractsBorderForOverflowNotVisible&&c.overflow!==\"visible\"&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),k=c}if(k.position===\"relative\"||k.position===\"static\")l+=i.offsetTop,m+=i.offsetLeft;f.support.fixedPosition&&k.position===\"fixed\"&&(l+=Math.max(h.scrollTop,i.scrollTop),m+=Math.max(h.scrollLeft,i.scrollLeft));return{top:l,left:m}},f.offset={bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.support.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,\"marginTop\"))||0,c+=parseFloat(f.css(a,\"marginLeft\"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,\"position\");d===\"static\"&&(a.style.position=\"relative\");var e=f(a),g=e.offset(),h=f.css(a,\"top\"),i=f.css(a,\"left\"),j=(d===\"absolute\"||d===\"fixed\")&&f.inArray(\"auto\",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),\"using\"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,\"marginTop\"))||0,c.left-=parseFloat(f.css(a,\"marginLeft\"))||0,d.top+=parseFloat(f.css(b[0],\"borderTopWidth\"))||0,d.left+=parseFloat(f.css(b[0],\"borderLeftWidth\"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,\"position\")===\"static\")a=a.offsetParent;return a})}}),f.each([\"Left\",\"Top\"],function(a,c){var d=\"scroll\"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cy(e);return g?\"pageXOffset\"in g?g[a?\"pageYOffset\":\"pageXOffset\"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cy(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each([\"Height\",\"Width\"],function(a,c){var d=c.toLowerCase();f.fn[\"inner\"+c]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,d,\"padding\")):this[d]():null},f.fn[\"outer\"+c]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,d,a?\"margin\":\"border\")):this[d]():null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement[\"client\"+c],h=e.document.body;return e.document.compatMode===\"CSS1Compat\"&&g||h&&h[\"client\"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement[\"client\"+c],e.body[\"scroll\"+c],e.documentElement[\"scroll\"+c],e.body[\"offset\"+c],e.documentElement[\"offset\"+c]);if(a===b){var i=f.css(e,d),j=parseFloat(i);return f.isNumeric(j)?j:i}return this.css(d,typeof a==\"string\"?a:a+\"px\")}}),a.jQuery=a.$=f,typeof define==\"function\"&&define.amd&&define.amd.jQuery&&define(\"jquery\",[],function(){return f})})(window);\n"
+"if(bA>0){if(bv!==\"border\"){for(;bx<e;bx++){if(!bv){bA-=parseFloat(b.css(by,\"padding\"+bz[bx]))||0}if(bv===\"margin\"){bA+=parseFloat(b.css(by,bv+bz[bx]))||0}else{bA-=parseFloat(b.css(by,\"border\"+bz[bx]+\"Width\"))||0}}}return bA+\"px\"}bA=Z(by,bw,bw);if(bA<0||bA==null){bA=by.style[bw]||0}bA=parseFloat(bA)||0;if(bv){for(;bx<e;bx++){bA+=parseFloat(b.css(by,\"padding\"+bz[bx]))||0;if(bv!==\"padding\"){bA+=parseFloat(b.css(by,\"border\"+bz[bx]+\"Width\"))||0}if(bv===\"margin\"){bA+=parseFloat(b.css(by,bv+bz[bx]))||0}}}return bA+\"px\"}if(b.expr&&b.expr.filters){b.expr.filters.hidden=function(bw){var bv=bw.offsetWidth,e=bw.offsetHeight;return(bv===0&&e===0)||(!b.support.reliableHiddenOffsets&&((bw.style&&bw.style.display)||b.css(bw,\"display\"))===\"none\")};b.expr.filters.visible=function(e){return !b.expr.filters.hidden(e)}}var k=/%20/g,ap=/\\[\\]$/,bs=/\\r?\\n/g,bq=/#.*$/,aD=/^(.*?):[ \\t]*([^\\r\\n]*)\\r?$/mg,aZ=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,aM=/^(?:about|app|app\\-storage|.+\\-extension|file|res|widget):$/,aQ=/^(?:GET|HEAD)$/,c=/^\\/\\//,M=/\\?/,a6=/<script\\b[^<]*(?:(?!<\\/script>)<[^<]*)*<\\/script>/gi,q=/^(?:select|textarea)/i,h=/\\s+/,br=/([?&])_=[^&]*/,K=/^([\\w\\+\\.\\-]+:)(?:\\/\\/([^\\/?#:]*)(?::(\\d+))?)?/,A=b.fn.load,aa={},r={},aE,s,aV=[\"*/\"]+[\"*\"];try{aE=bl.href}catch(aw){aE=av.createElement(\"a\");aE.href=\"\";aE=aE.href}s=K.exec(aE.toLowerCase())||[];function f(e){return function(by,bA){if(typeof by!==\"string\"){bA=by;by=\"*\"}if(b.isFunction(bA)){var bx=by.toLowerCase().split(h),bw=0,bz=bx.length,bv,bB,bC;for(;bw<bz;bw++){bv=bx[bw];bC=/^\\+/.test(bv);if(bC){bv=bv.substr(1)||\"*\"}bB=e[bv]=e[bv]||[];bB[bC?\"unshift\":\"push\"](bA)}}}}function aW(bv,bE,bz,bD,bB,bx){bB=bB||bE.dataTypes[0];bx=bx||{};bx[bB]=true;var bA=bv[bB],bw=0,e=bA?bA.length:0,by=(bv===aa),bC;for(;bw<e&&(by||!bC);bw++){bC=bA[bw](bE,bz,bD);if(typeof bC===\"string\"){if(!by||bx[bC]){bC=L}else{bE.dataTypes.unshift(bC);bC=aW(bv,bE,bz,bD,bC,bx)}}}if((by||!bC)&&!bx[\"*\"]){bC=aW(bv,bE,bz,bD,\"*\",bx)}return bC}function am(bw,bx){var bv,e,by=b.ajaxSettings.flatOptions||{};for(bv in bx){if(bx[bv]!==L){(by[bv]?bw:(e||(e={})))[bv]=bx[bv]}}if(e){b.extend(true,bw,e)}}b.fn.extend({load:function(bw,bz,bA){if(typeof bw!==\"string\"&&A){return A.apply(this,arguments)}else{if(!this.length){return this}}var by=bw.indexOf(\" \");if(by>=0){var e=bw.slice(by,bw.length);bw=bw.slice(0,by)}var bx=\"GET\";if(bz){if(b.isFunction(bz)){bA=bz;bz=L}else{if(typeof bz===\"object\"){bz=b.param(bz,b.ajaxSettings.traditional);bx=\"POST\"}}}var bv=this;b.ajax({url:bw,type:bx,dataType:\"html\",data:bz,complete:function(bC,bB,bD){bD=bC.responseText;if(bC.isResolved()){bC.done(function(bE){bD=bE});bv.html(e?b(\"<div>\").append(bD.replace(a6,\"\")).find(e):bD)}if(bA){bv.each(bA,[bD,bB,bC])}}});return this},serialize:function(){return b.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?b.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||q.test(this.nodeName)||aZ.test(this.type))}).map(function(e,bv){var bw=b(this).val();return bw==null?null:b.isArray(bw)?b.map(bw,function(by,bx){return{name:bv.name,value:by.replace(bs,\"\\r\\n\")}}):{name:bv.name,value:bw.replace(bs,\"\\r\\n\")}}).get()}});b.each(\"ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend\".split(\" \"),function(e,bv){b.fn[bv]=function(bw){return this.on(bv,bw)}});b.each([\"get\",\"post\"],function(e,bv){b[bv]=function(bw,by,bz,bx){if(b.isFunction(by)){bx=bx||bz;bz=by;by=L}return b.ajax({type:bv,url:bw,data:by,success:bz,dataType:bx})}});b.extend({getScript:function(e,bv){return b.get(e,L,bv,\"script\")},getJSON:function(e,bv,bw){return b.get(e,bv,bw,\"json\")},ajaxSetup:function(bv,e){if(e){am(bv,b.ajaxSettings)}else{e=bv;bv=b.ajaxSettings}am(bv,e);return bv},ajaxSettings:{url:aE,isLocal:aM.test(s[1]),global:true,type:\"GET\",contentType:\"application/x-www-form-urlencoded\",processData:true,async:true,accepts:{xml:\"application/xml, text/xml\",html:\"text/html\",text:\"text/plain\",json:\"application/json, text/javascript\",\"*\":aV},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:\"responseXML\",text:\"responseText\"},converters:{\"* text\":bb.String,\"text html\":true,\"text json\":b.parseJSON,\"text xml\":b.parseXML},flatOptions:{context:true,url:true}},ajaxPrefilter:f(aa),ajaxTransport:f(r),ajax:function(bz,bx){if(typeof bz===\"object\"){bx=bz;bz=L}bx=bx||{};var bD=b.ajaxSetup({},bx),bS=bD.context||bD,bG=bS!==bD&&(bS.nodeType||bS instanceof b)?b(bS):b.event,bR=b.Deferred(),bN=b.Callbacks(\"once memory\"),bB=bD.statusCode||{},bC,bH={},bO={},bQ,by,bL,bE,bI,bA=0,bw,bK,bJ={readyState:0,setRequestHeader:function(bT,bU){if(!bA){var e=bT.toLowerCase();bT=bO[e]=bO[e]||bT;bH[bT]=bU}return this},getAllResponseHeaders:function(){return bA===2?bQ:null},getResponseHeader:function(bT){var e;if(bA===2){if(!by){by={};while((e=aD.exec(bQ))){by[e[1].toLowerCase()]=e[2]}}e=by[bT.toLowerCase()]}return e===L?null:e},overrideMimeType:function(e){if(!bA){bD.mimeType=e}return this},abort:function(e){e=e||\"abort\";if(bL){bL.abort(e)}bF(0,e);return this}};function bF(bZ,bU,b0,bW){if(bA===2){return}bA=2;if(bE){clearTimeout(bE)}bL=L;bQ=bW||\"\";bJ.readyState=bZ>0?4:0;var bT,b4,b3,bX=bU,bY=b0?bj(bD,bJ,b0):L,bV,b2;if(bZ>=200&&bZ<300||bZ===304){if(bD.ifModified){if((bV=bJ.getResponseHeader(\"Last-Modified\"))){b.lastModified[bC]=bV}if((b2=bJ.getResponseHeader(\"Etag\"))){b.etag[bC]=b2}}if(bZ===304){bX=\"notmodified\";bT=true}else{try{b4=G(bD,bY);bX=\"success\";bT=true}catch(b1){bX=\"parsererror\";b3=b1}}}else{b3=bX;if(!bX||bZ){bX=\"error\";if(bZ<0){bZ=0}}}bJ.status=bZ;bJ.statusText=\"\"+(bU||bX);if(bT){bR.resolveWith(bS,[b4,bX,bJ])}else{bR.rejectWith(bS,[bJ,bX,b3])}bJ.statusCode(bB);bB=L;if(bw){bG.trigger(\"ajax\"+(bT?\"Success\":\"Error\"),[bJ,bD,bT?b4:b3])}bN.fireWith(bS,[bJ,bX]);if(bw){bG.trigger(\"ajaxComplete\",[bJ,bD]);if(!(--b.active)){b.event.trigger(\"ajaxStop\")}}}bR.promise(bJ);bJ.success=bJ.done;bJ.error=bJ.fail;bJ.complete=bN.add;bJ.statusCode=function(bT){if(bT){var e;if(bA<2){for(e in bT){bB[e]=[bB[e],bT[e]]}}else{e=bT[bJ.status];bJ.then(e,e)}}return this};bD.url=((bz||bD.url)+\"\").replace(bq,\"\").replace(c,s[1]+\"//\");bD.dataTypes=b.trim(bD.dataType||\"*\").toLowerCase().split(h);if(bD.crossDomain==null){bI=K.exec(bD.url.toLowerCase());bD.crossDomain=!!(bI&&(bI[1]!=s[1]||bI[2]!=s[2]||(bI[3]||(bI[1]===\"http:\"?80:443))!=(s[3]||(s[1]===\"http:\"?80:443))))}if(bD.data&&bD.processData&&typeof bD.data!==\"string\"){bD.data=b.param(bD.data,bD.traditional)}aW(aa,bD,bx,bJ);if(bA===2){return false}bw=bD.global;bD.type=bD.type.toUpperCase();bD.hasContent=!aQ.test(bD.type);if(bw&&b.active++===0){b.event.trigger(\"ajaxStart\")}if(!bD.hasContent){if(bD.data){bD.url+=(M.test(bD.url)?\"&\":\"?\")+bD.data;delete bD.data}bC=bD.url;if(bD.cache===false){var bv=b.now(),bP=bD.url.replace(br,\"$1_=\"+bv);bD.url=bP+((bP===bD.url)?(M.test(bD.url)?\"&\":\"?\")+\"_=\"+bv:\"\")}}if(bD.data&&bD.hasContent&&bD.contentType!==false||bx.contentType){bJ.setRequestHeader(\"Content-Type\",bD.contentType)}if(bD.ifModified){bC=bC||bD.url;if(b.lastModified[bC]){bJ.setRequestHeader(\"If-Modified-Since\",b.lastModified[bC])}if(b.etag[bC]){bJ.setRequestHeader(\"If-None-Match\",b.etag[bC])}}bJ.setRequestHeader(\"Accept\",bD.dataTypes[0]&&bD.accepts[bD.dataTypes[0]]?bD.accepts[bD.dataTypes[0]]+(bD.dataTypes[0]!==\"*\"?\", \"+aV+\"; q=0.01\":\"\"):bD.accepts[\"*\"]);for(bK in bD.headers){bJ.setRequestHeader(bK,bD.headers[bK])}if(bD.beforeSend&&(bD.beforeSend.call(bS,bJ,bD)===false||bA===2)){bJ.abort();return false}for(bK in {success:1,error:1,complete:1}){bJ[bK](bD[bK])}bL=aW(r,bD,bx,bJ);if(!bL){bF(-1,\"No Transport\")}else{bJ.readyState=1;if(bw){bG.trigger(\"ajaxSend\",[bJ,bD])}if(bD.async&&bD.timeout>0){bE=setTimeout(function(){bJ.abort(\"timeout\")},bD.timeout)}try{bA=1;bL.send(bH,bF)}catch(bM){if(bA<2){bF(-1,bM)}else{throw bM}}}return bJ},param:function(e,bw){var bv=[],by=function(bz,bA){bA=b.isFunction(bA)?bA():bA;bv[bv.length]=encodeURIComponent(bz)+\"=\"+encodeURIComponent(bA)};if(bw===L){bw=b.ajaxSettings.traditional}if(b.isArray(e)||(e.jquery&&!b.isPlainObject(e))){b.each(e,function(){by(this.name,this.value)})}else{for(var bx in e){v(bx,e[bx],bw,by)}}return bv.join(\"&\").replace(k,\"+\")}});function v(bw,by,bv,bx){if(b.isArray(by)){b.each(by,function(bA,bz){if(bv||ap.test(bw)){bx(bw,bz)}else{v(bw+\"[\"+(typeof bz===\"object\"||b.isArray(bz)?bA:\"\")+\"]\",bz,bv,bx)}})}else{if(!bv&&by!=null&&typeof by===\"object\"){for(var e in by){v(bw+\"[\"+e+\"]\",by[e],bv,bx)}}else{bx(bw,by)}}}b.extend({active:0,lastModified:{},etag:{}});function bj(bD,bC,bz){var bv=bD.contents,bB=bD.dataTypes,bw=bD.responseFields,by,bA,bx,e;for(bA in bw){if(bA in bz){bC[bw[bA]]=bz[bA]}}while(bB[0]===\"*\"){bB.shift();if(by===L){by=bD.mimeType||bC.getResponseHeader(\"content-type\")}}if(by){for(bA in bv){if(bv[bA]&&bv[bA].test(by)){bB.unshift(bA);break}}}if(bB[0] in bz){bx=bB[0]}else{for(bA in bz){if(!bB[0]||bD.converters[bA+\" \"+bB[0]]){bx=bA;break}if(!e){e=bA}}bx=bx||e}if(bx){if(bx!==bB[0]){bB.unshift(bx)}return bz[bx]}}function G(bH,bz){if(bH.dataFilter){bz=bH.dataFilter(bz,bH.dataType)}var bD=bH.dataTypes,bG={},bA,bE,bw=bD.length,bB,bC=bD[0],bx,by,bF,bv,e;for(bA=1;bA<bw;bA++){if(bA===1){for(bE in bH.converters){if(typeof bE===\"string\"){bG[bE.toLowerCase()]=bH.converters[bE]}}}bx=bC;bC=bD[bA];if(bC===\"*\"){bC=bx}else{if(bx!==\"*\"&&bx!==bC){by=bx+\" \"+bC;bF=bG[by]||bG[\"* \"+bC];if(!bF){e=L;for(bv in bG){bB=bv.split(\" \");if(bB[0]===bx||bB[0]===\"*\"){e=bG[bB[1]+\" \"+bC];if(e){bv=bG[bv];if(bv===true){bF=e}else{if(e===true){bF=bv}}break}}}}if(!(bF||e)){b.error(\"No conversion from \"+by.replace(\" \",\" to \"))}if(bF!==true){bz=bF?bF(bz):e(bv(bz))}}}}return bz}var aC=b.now(),u=/(\\=)\\?(&|$)|\\?\\?/i;b.ajaxSetup({jsonp:\"callback\",jsonpCallback:function(){return b.expando+\"_\"+(aC++)}});b.ajaxPrefilter(\"json jsonp\",function(bD,bA,bC){var bx=bD.contentType===\"application/x-www-form-urlencoded\"&&(typeof bD.data===\"string\");if(bD.dataTypes[0]===\"jsonp\"||bD.jsonp!==false&&(u.test(bD.url)||bx&&u.test(bD.data))){var bB,bw=bD.jsonpCallback=b.isFunction(bD.jsonpCallback)?bD.jsonpCallback():bD.jsonpCallback,bz=bb[bw],e=bD.url,by=bD.data,bv=\"$1\"+bw+\"$2\";if(bD.jsonp!==false){e=e.replace(u,bv);if(bD.url===e){if(bx){by=by.replace(u,bv)}if(bD.data===by){e+=(/\\?/.test(e)?\"&\":\"?\")+bD.jsonp+\"=\"+bw}}}bD.url=e;bD.data=by;bb[bw]=function(bE){bB=[bE]};bC.always(function(){bb[bw]=bz;if(bB&&b.isFunction(bz)){bb[bw](bB[0])}});bD.converters[\"script json\"]=function(){if(!bB){b.error(bw+\" was not called\")}return bB[0]};bD.dataTypes[0]=\"json\";return\"script\"}});b.ajaxSetup({accepts:{script:\"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript\"},contents:{script:/javascript|ecmascript/},converters:{\"text script\":function(e){b.globalEval(e);return e}}});b.ajaxPrefilter(\"script\",function(e){if(e.cache===L){e.cache=false}if(e.crossDomain){e.type=\"GET\";e.global=false}});b.ajaxTransport(\"script\",function(bw){if(bw.crossDomain){var e,bv=av.head||av.getElementsByTagName(\"head\")[0]||av.documentElement;return{send:function(bx,by){e=av.createElement(\"script\");e.async=\"async\";if(bw.scriptCharset){e.charset=bw.scriptCharset}e.src=bw.url;e.onload=e.onreadystatechange=function(bA,bz){if(bz||!e.readyState||/loaded|complete/.test(e.readyState)){e.onload=e.onreadystatechange=null;if(bv&&e.parentNode){bv.removeChild(e)}e=L;if(!bz){by(200,\"success\")}}};bv.insertBefore(e,bv.firstChild)},abort:function(){if(e){e.onload(0,1)}}}}});var B=bb.ActiveXObject?function(){for(var e in N){N[e](0,1)}}:false,y=0,N;function aL(){try{return new bb.XMLHttpRequest()}catch(bv){}}function aj(){try{return new bb.ActiveXObject(\"Microsoft.XMLHTTP\")}catch(bv){}}b.ajaxSettings.xhr=bb.ActiveXObject?function(){return !this.isLocal&&aL()||aj()}:aL;(function(e){b.extend(b.support,{ajax:!!e,cors:!!e&&(\"withCredentials\" in e)})})(b.ajaxSettings.xhr());if(b.support.ajax){b.ajaxTransport(function(e){if(!e.crossDomain||b.support.cors){var bv;return{send:function(bB,bw){var bA=e.xhr(),bz,by;if(e.username){bA.open(e.type,e.url,e.async,e.username,e.password)}else{bA.open(e.type,e.url,e.async)}if(e.xhrFields){for(by in e.xhrFields){bA[by]=e.xhrFields[by]}}if(e.mimeType&&bA.overrideMimeType){bA.overrideMimeType(e.mimeType)}if(!e.crossDomain&&!bB[\"X-Requested-With\"]){bB[\"X-Requested-With\"]=\"XMLHttpRequest\"}try{for(by in bB){bA.setRequestHeader(by,bB[by])}}catch(bx){}bA.send((e.hasContent&&e.data)||null);bv=function(bK,bE){var bF,bD,bC,bI,bH;try{if(bv&&(bE||bA.readyState===4)){bv=L;if(bz){bA.onreadystatechange=b.noop;if(B){delete N[bz]}}if(bE){if(bA.readyState!==4){bA.abort()}}else{bF=bA.status;bC=bA.getAllResponseHeaders();bI={};bH=bA.responseXML;if(bH&&bH.documentElement){bI.xml=bH}bI.text=bA.responseText;try{bD=bA.statusText}catch(bJ){bD=\"\"}if(!bF&&e.isLocal&&!e.crossDomain){bF=bI.text?200:404}else{if(bF===1223){bF=204}}}}}catch(bG){if(!bE){bw(-1,bG)}}if(bI){bw(bF,bD,bI,bC)}};if(!e.async||bA.readyState===4){bv()}else{bz=++y;if(B){if(!N){N={};b(bb).unload(B)}N[bz]=bv}bA.onreadystatechange=bv}},abort:function(){if(bv){bv(0,1)\n"
+"}}}}})}var Q={},a8,m,aB=/^(?:toggle|show|hide)$/,aT=/^([+\\-]=)?([\\d+.\\-]+)([a-z%]*)$/i,a3,aH=[[\"height\",\"marginTop\",\"marginBottom\",\"paddingTop\",\"paddingBottom\"],[\"width\",\"marginLeft\",\"marginRight\",\"paddingLeft\",\"paddingRight\"],[\"opacity\"]],a4;b.fn.extend({show:function(bx,bA,bz){var bw,by;if(bx||bx===0){return this.animate(a0(\"show\",3),bx,bA,bz)}else{for(var bv=0,e=this.length;bv<e;bv++){bw=this[bv];if(bw.style){by=bw.style.display;if(!b._data(bw,\"olddisplay\")&&by===\"none\"){by=bw.style.display=\"\"}if(by===\"\"&&b.css(bw,\"display\")===\"none\"){b._data(bw,\"olddisplay\",x(bw.nodeName))}}}for(bv=0;bv<e;bv++){bw=this[bv];if(bw.style){by=bw.style.display;if(by===\"\"||by===\"none\"){bw.style.display=b._data(bw,\"olddisplay\")||\"\"}}}return this}},hide:function(bx,bA,bz){if(bx||bx===0){return this.animate(a0(\"hide\",3),bx,bA,bz)}else{var bw,by,bv=0,e=this.length;for(;bv<e;bv++){bw=this[bv];if(bw.style){by=b.css(bw,\"display\");if(by!==\"none\"&&!b._data(bw,\"olddisplay\")){b._data(bw,\"olddisplay\",by)}}}for(bv=0;bv<e;bv++){if(this[bv].style){this[bv].style.display=\"none\"}}return this}},_toggle:b.fn.toggle,toggle:function(bw,bv,bx){var e=typeof bw===\"boolean\";if(b.isFunction(bw)&&b.isFunction(bv)){this._toggle.apply(this,arguments)}else{if(bw==null||e){this.each(function(){var by=e?bw:b(this).is(\":hidden\");b(this)[by?\"show\":\"hide\"]()})}else{this.animate(a0(\"toggle\",3),bw,bv,bx)}}return this},fadeTo:function(e,bx,bw,bv){return this.filter(\":hidden\").css(\"opacity\",0).show().end().animate({opacity:bx},e,bw,bv)},animate:function(bz,bw,by,bx){var e=b.speed(bw,by,bx);if(b.isEmptyObject(bz)){return this.each(e.complete,[false])}bz=b.extend({},bz);function bv(){if(e.queue===false){b._mark(this)}var bE=b.extend({},e),bK=this.nodeType===1,bI=bK&&b(this).is(\":hidden\"),bB,bF,bD,bJ,bH,bC,bG,bL,bA;bE.animatedProperties={};for(bD in bz){bB=b.camelCase(bD);if(bD!==bB){bz[bB]=bz[bD];delete bz[bD]}bF=bz[bB];if(b.isArray(bF)){bE.animatedProperties[bB]=bF[1];bF=bz[bB]=bF[0]}else{bE.animatedProperties[bB]=bE.specialEasing&&bE.specialEasing[bB]||bE.easing||\"swing\"}if(bF===\"hide\"&&bI||bF===\"show\"&&!bI){return bE.complete.call(this)}if(bK&&(bB===\"height\"||bB===\"width\")){bE.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY];if(b.css(this,\"display\")===\"inline\"&&b.css(this,\"float\")===\"none\"){if(!b.support.inlineBlockNeedsLayout||x(this.nodeName)===\"inline\"){this.style.display=\"inline-block\"}else{this.style.zoom=1}}}}if(bE.overflow!=null){this.style.overflow=\"hidden\"}for(bD in bz){bJ=new b.fx(this,bE,bD);bF=bz[bD];if(aB.test(bF)){bA=b._data(this,\"toggle\"+bD)||(bF===\"toggle\"?bI?\"show\":\"hide\":0);if(bA){b._data(this,\"toggle\"+bD,bA===\"show\"?\"hide\":\"show\");bJ[bA]()}else{bJ[bF]()}}else{bH=aT.exec(bF);bC=bJ.cur();if(bH){bG=parseFloat(bH[2]);bL=bH[3]||(b.cssNumber[bD]?\"\":\"px\");if(bL!==\"px\"){b.style(this,bD,(bG||1)+bL);bC=((bG||1)/bJ.cur())*bC;b.style(this,bD,bC+bL)}if(bH[1]){bG=((bH[1]===\"-=\"?-1:1)*bG)+bC}bJ.custom(bC,bG,bL)}else{bJ.custom(bC,bF,\"\")}}}return true}return e.queue===false?this.each(bv):this.queue(e.queue,bv)},stop:function(bw,bv,e){if(typeof bw!==\"string\"){e=bv;bv=bw;bw=L}if(bv&&bw!==false){this.queue(bw||\"fx\",[])}return this.each(function(){var bx,by=false,bA=b.timers,bz=b._data(this);if(!e){b._unmark(true,this)}function bB(bE,bF,bD){var bC=bF[bD];b.removeData(bE,bD,true);bC.stop(e)}if(bw==null){for(bx in bz){if(bz[bx]&&bz[bx].stop&&bx.indexOf(\".run\")===bx.length-4){bB(this,bz,bx)}}}else{if(bz[bx=bw+\".run\"]&&bz[bx].stop){bB(this,bz,bx)}}for(bx=bA.length;bx--;){if(bA[bx].elem===this&&(bw==null||bA[bx].queue===bw)){if(e){bA[bx](true)}else{bA[bx].saveState()}by=true;bA.splice(bx,1)}}if(!(e&&by)){b.dequeue(this,bw)}})}});function bh(){setTimeout(at,0);return(a4=b.now())}function at(){a4=L}function a0(bv,e){var bw={};b.each(aH.concat.apply([],aH.slice(0,e)),function(){bw[this]=bv});return bw}b.each({slideDown:a0(\"show\",1),slideUp:a0(\"hide\",1),slideToggle:a0(\"toggle\",1),fadeIn:{opacity:\"show\"},fadeOut:{opacity:\"hide\"},fadeToggle:{opacity:\"toggle\"}},function(e,bv){b.fn[e]=function(bw,by,bx){return this.animate(bv,bw,by,bx)}});b.extend({speed:function(bw,bx,bv){var e=bw&&typeof bw===\"object\"?b.extend({},bw):{complete:bv||!bv&&bx||b.isFunction(bw)&&bw,duration:bw,easing:bv&&bx||bx&&!b.isFunction(bx)&&bx};e.duration=b.fx.off?0:typeof e.duration===\"number\"?e.duration:e.duration in b.fx.speeds?b.fx.speeds[e.duration]:b.fx.speeds._default;if(e.queue==null||e.queue===true){e.queue=\"fx\"}e.old=e.complete;e.complete=function(by){if(b.isFunction(e.old)){e.old.call(this)}if(e.queue){b.dequeue(this,e.queue)}else{if(by!==false){b._unmark(this)}}};return e},easing:{linear:function(bw,bx,e,bv){return e+bv*bw},swing:function(bw,bx,e,bv){return((-Math.cos(bw*Math.PI)/2)+0.5)*bv+e}},timers:[],fx:function(bv,e,bw){this.options=e;this.elem=bv;this.prop=bw;e.orig=e.orig||{}}});b.fx.prototype={update:function(){if(this.options.step){this.options.step.call(this.elem,this.now,this)}(b.fx.step[this.prop]||b.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null)){return this.elem[this.prop]}var e,bv=b.css(this.elem,this.prop);return isNaN(e=parseFloat(bv))?!bv||bv===\"auto\"?0:bv:e},custom:function(bz,by,bx){var e=this,bw=b.fx;this.startTime=a4||bh();this.end=by;this.now=this.start=bz;this.pos=this.state=0;this.unit=bx||this.unit||(b.cssNumber[this.prop]?\"\":\"px\");function bv(bA){return e.step(bA)}bv.queue=this.options.queue;bv.elem=this.elem;bv.saveState=function(){if(e.options.hide&&b._data(e.elem,\"fxshow\"+e.prop)===L){b._data(e.elem,\"fxshow\"+e.prop,e.start)}};if(bv()&&b.timers.push(bv)&&!a3){a3=setInterval(bw.tick,bw.interval)}},show:function(){var e=b._data(this.elem,\"fxshow\"+this.prop);this.options.orig[this.prop]=e||b.style(this.elem,this.prop);this.options.show=true;if(e!==L){this.custom(this.cur(),e)}else{this.custom(this.prop===\"width\"||this.prop===\"height\"?1:0,this.cur())}b(this.elem).show()},hide:function(){this.options.orig[this.prop]=b._data(this.elem,\"fxshow\"+this.prop)||b.style(this.elem,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(by){var bA,bB,bv,bx=a4||bh(),e=true,bz=this.elem,bw=this.options;if(by||bx>=bw.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();bw.animatedProperties[this.prop]=true;for(bA in bw.animatedProperties){if(bw.animatedProperties[bA]!==true){e=false}}if(e){if(bw.overflow!=null&&!b.support.shrinkWrapBlocks){b.each([\"\",\"X\",\"Y\"],function(bC,bD){bz.style[\"overflow\"+bD]=bw.overflow[bC]})}if(bw.hide){b(bz).hide()}if(bw.hide||bw.show){for(bA in bw.animatedProperties){b.style(bz,bA,bw.orig[bA]);b.removeData(bz,\"fxshow\"+bA,true);b.removeData(bz,\"toggle\"+bA,true)}}bv=bw.complete;if(bv){bw.complete=false;bv.call(bz)}}return false}else{if(bw.duration==Infinity){this.now=bx}else{bB=bx-this.startTime;this.state=bB/bw.duration;this.pos=b.easing[bw.animatedProperties[this.prop]](this.state,bB,0,1,bw.duration);this.now=this.start+((this.end-this.start)*this.pos)}this.update()}return true}};b.extend(b.fx,{tick:function(){var bw,bv=b.timers,e=0;for(;e<bv.length;e++){bw=bv[e];if(!bw()&&bv[e]===bw){bv.splice(e--,1)}}if(!bv.length){b.fx.stop()}},interval:13,stop:function(){clearInterval(a3);a3=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(e){b.style(e.elem,\"opacity\",e.now)},_default:function(e){if(e.elem.style&&e.elem.style[e.prop]!=null){e.elem.style[e.prop]=e.now+e.unit}else{e.elem[e.prop]=e.now}}}});b.each([\"width\",\"height\"],function(e,bv){b.fx.step[bv]=function(bw){b.style(bw.elem,bv,Math.max(0,bw.now)+bw.unit)}});if(b.expr&&b.expr.filters){b.expr.filters.animated=function(e){return b.grep(b.timers,function(bv){return e===bv.elem}).length}}function x(bx){if(!Q[bx]){var e=av.body,bv=b(\"<\"+bx+\">\").appendTo(e),bw=bv.css(\"display\");bv.remove();if(bw===\"none\"||bw===\"\"){if(!a8){a8=av.createElement(\"iframe\");a8.frameBorder=a8.width=a8.height=0}e.appendChild(a8);if(!m||!a8.createElement){m=(a8.contentWindow||a8.contentDocument).document;m.write((av.compatMode===\"CSS1Compat\"?\"<!doctype html>\":\"\")+\"<html><body>\");m.close()}bv=m.createElement(bx);m.body.appendChild(bv);bw=b.css(bv,\"display\");e.removeChild(a8)}Q[bx]=bw}return Q[bx]}var V=/^t(?:able|d|h)$/i,ad=/^(?:body|html)$/i;if(\"getBoundingClientRect\" in av.documentElement){b.fn.offset=function(bI){var by=this[0],bB;if(bI){return this.each(function(e){b.offset.setOffset(this,bI,e)})}if(!by||!by.ownerDocument){return null}if(by===by.ownerDocument.body){return b.offset.bodyOffset(by)}try{bB=by.getBoundingClientRect()}catch(bF){}var bH=by.ownerDocument,bw=bH.documentElement;if(!bB||!b.contains(bw,by)){return bB?{top:bB.top,left:bB.left}:{top:0,left:0}}var bC=bH.body,bD=aK(bH),bA=bw.clientTop||bC.clientTop||0,bE=bw.clientLeft||bC.clientLeft||0,bv=bD.pageYOffset||b.support.boxModel&&bw.scrollTop||bC.scrollTop,bz=bD.pageXOffset||b.support.boxModel&&bw.scrollLeft||bC.scrollLeft,bG=bB.top+bv-bA,bx=bB.left+bz-bE;return{top:bG,left:bx}}}else{b.fn.offset=function(bF){var bz=this[0];if(bF){return this.each(function(bG){b.offset.setOffset(this,bF,bG)})}if(!bz||!bz.ownerDocument){return null}if(bz===bz.ownerDocument.body){return b.offset.bodyOffset(bz)}var bC,bw=bz.offsetParent,bv=bz,bE=bz.ownerDocument,bx=bE.documentElement,bA=bE.body,bB=bE.defaultView,e=bB?bB.getComputedStyle(bz,null):bz.currentStyle,bD=bz.offsetTop,by=bz.offsetLeft;while((bz=bz.parentNode)&&bz!==bA&&bz!==bx){if(b.support.fixedPosition&&e.position===\"fixed\"){break}bC=bB?bB.getComputedStyle(bz,null):bz.currentStyle;bD-=bz.scrollTop;by-=bz.scrollLeft;if(bz===bw){bD+=bz.offsetTop;by+=bz.offsetLeft;if(b.support.doesNotAddBorder&&!(b.support.doesAddBorderForTableAndCells&&V.test(bz.nodeName))){bD+=parseFloat(bC.borderTopWidth)||0;by+=parseFloat(bC.borderLeftWidth)||0}bv=bw;bw=bz.offsetParent}if(b.support.subtractsBorderForOverflowNotVisible&&bC.overflow!==\"visible\"){bD+=parseFloat(bC.borderTopWidth)||0;by+=parseFloat(bC.borderLeftWidth)||0}e=bC}if(e.position===\"relative\"||e.position===\"static\"){bD+=bA.offsetTop;by+=bA.offsetLeft}if(b.support.fixedPosition&&e.position===\"fixed\"){bD+=Math.max(bx.scrollTop,bA.scrollTop);by+=Math.max(bx.scrollLeft,bA.scrollLeft)}return{top:bD,left:by}}}b.offset={bodyOffset:function(e){var bw=e.offsetTop,bv=e.offsetLeft;if(b.support.doesNotIncludeMarginInBodyOffset){bw+=parseFloat(b.css(e,\"marginTop\"))||0;bv+=parseFloat(b.css(e,\"marginLeft\"))||0}return{top:bw,left:bv}},setOffset:function(bx,bG,bA){var bB=b.css(bx,\"position\");if(bB===\"static\"){bx.style.position=\"relative\"}var bz=b(bx),bv=bz.offset(),e=b.css(bx,\"top\"),bE=b.css(bx,\"left\"),bF=(bB===\"absolute\"||bB===\"fixed\")&&b.inArray(\"auto\",[e,bE])>-1,bD={},bC={},bw,by;if(bF){bC=bz.position();bw=bC.top;by=bC.left}else{bw=parseFloat(e)||0;by=parseFloat(bE)||0}if(b.isFunction(bG)){bG=bG.call(bx,bA,bv)}if(bG.top!=null){bD.top=(bG.top-bv.top)+bw}if(bG.left!=null){bD.left=(bG.left-bv.left)+by}if(\"using\" in bG){bG.using.call(bx,bD)}else{bz.css(bD)}}};b.fn.extend({position:function(){if(!this[0]){return null}var bw=this[0],bv=this.offsetParent(),bx=this.offset(),e=ad.test(bv[0].nodeName)?{top:0,left:0}:bv.offset();bx.top-=parseFloat(b.css(bw,\"marginTop\"))||0;bx.left-=parseFloat(b.css(bw,\"marginLeft\"))||0;e.top+=parseFloat(b.css(bv[0],\"borderTopWidth\"))||0;e.left+=parseFloat(b.css(bv[0],\"borderLeftWidth\"))||0;return{top:bx.top-e.top,left:bx.left-e.left}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||av.body;while(e&&(!ad.test(e.nodeName)&&b.css(e,\"position\")===\"static\")){e=e.offsetParent}return e})}});b.each([\"Left\",\"Top\"],function(bv,e){var bw=\"scroll\"+e;b.fn[bw]=function(bz){var bx,by;if(bz===L){bx=this[0];if(!bx){return null}by=aK(bx);return by?(\"pageXOffset\" in by)?by[bv?\"pageYOffset\":\"pageXOffset\"]:b.support.boxModel&&by.document.documentElement[bw]||by.document.body[bw]:bx[bw]}return this.each(function(){by=aK(this);if(by){by.scrollTo(!bv?bz:b(by).scrollLeft(),bv?bz:b(by).scrollTop())}else{this[bw]=bz}})}});function aK(e){return b.isWindow(e)?e:e.nodeType===9?e.defaultView||e.parentWindow:false}b.each([\"Height\",\"Width\"],function(bv,e){var bw=e.toLowerCase();b.fn[\"inner\"+e]=function(){var bx=this[0];return bx?bx.style?parseFloat(b.css(bx,bw,\"padding\")):this[bw]():null};b.fn[\"outer\"+e]=function(by){var bx=this[0];return bx?bx.style?parseFloat(b.css(bx,bw,by?\"margin\":\"border\")):this[bw]():null};b.fn[bw]=function(bz){var bA=this[0];if(!bA){return bz==null?null:this}if(b.isFunction(bz)){return this.each(function(bE){var bD=b(this);bD[bw](bz.call(this,bE,bD[bw]()))})}if(b.isWindow(bA)){var bB=bA.document.documentElement[\"client\"+e],bx=bA.document.body;return bA.document.compatMode===\"CSS1Compat\"&&bB||bx&&bx[\"client\"+e]||bB}else{if(bA.nodeType===9){return Math.max(bA.documentElement[\"client\"+e],bA.body[\"scroll\"+e],bA.documentElement[\"scroll\"+e],bA.body[\"offset\"+e],bA.documentElement[\"offset\"+e])}else{if(bz===L){var bC=b.css(bA,bw),by=parseFloat(bC);return b.isNumeric(by)?by:bC}else{return this.css(bw,typeof bz===\"string\"?bz:bz+\"px\")}}}}});bb.jQuery=bb.$=b;if(typeof define===\"function\"&&define.amd&&define.amd.jQuery){define(\"jquery\",[],function(){return b\n"
+"})}})(window);\n"
index b705d2e..0ef321d 100644 (file)
@@ -7,8 +7,7 @@
  *
  * http://docs.jquery.com/UI
  */
-(function(a,b){function d(b){return!a(b).parents().andSelf().filter(function(){return a.curCSS(this,"visibility")==="hidden"||a.expr.filters.hidden(this)}).length}function c(b,c){var e=b.nodeName.toLowerCase();if("area"===e){var f=b.parentNode,g=f.name,h;if(!b.href||!g||f.nodeName.toLowerCase()!=="map")return!1;h=a("img[usemap=#"+g+"]")[0];return!!h&&d(h)}return(/input|select|textarea|button|object/.test(e)?!b.disabled:"a"==e?b.href||c:c)&&d(b)}a.ui=a.ui||{};a.ui.version||(a.extend(a.ui,{version:"1.8.18",keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}}),a.fn.extend({propAttr:a.fn.prop||a.fn.attr,_focus:a.fn.focus,focus:function(b,c){return typeof b=="number"?this.each(function(){var d=this;setTimeout(function(){a(d).focus(),c&&c.call(d)},b)}):this._focus.apply(this,arguments)},scrollParent:function(){var b;a.browser.msie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?b=this.parents().filter(function(){return/(relative|absolute|fixed)/.test(a.curCSS(this,"position",1))&&/(auto|scroll)/.test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0):b=this.parents().filter(function(){return/(auto|scroll)/.test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0);return/fixed/.test(this.css("position"))||!b.length?a(document):b},zIndex:function(c){if(c!==b)return this.css("zIndex",c);if(this.length){var d=a(this[0]),e,f;while(d.length&&d[0]!==document){e=d.css("position");if(e==="absolute"||e==="relative"||e==="fixed"){f=parseInt(d.css("zIndex"),10);if(!isNaN(f)&&f!==0)return f}d=d.parent()}}return 0},disableSelection:function(){return this.bind((a.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(a){a.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}}),a.each(["Width","Height"],function(c,d){function h(b,c,d,f){a.each(e,function(){c-=parseFloat(a.curCSS(b,"padding"+this,!0))||0,d&&(c-=parseFloat(a.curCSS(b,"border"+this+"Width",!0))||0),f&&(c-=parseFloat(a.curCSS(b,"margin"+this,!0))||0)});return c}var e=d==="Width"?["Left","Right"]:["Top","Bottom"],f=d.toLowerCase(),g={innerWidth:a.fn.innerWidth,innerHeight:a.fn.innerHeight,outerWidth:a.fn.outerWidth,outerHeight:a.fn.outerHeight};a.fn["inner"+d]=function(c){if(c===b)return g["inner"+d].call(this);return this.each(function(){a(this).css(f,h(this,c)+"px")})},a.fn["outer"+d]=function(b,c){if(typeof b!="number")return g["outer"+d].call(this,b);return this.each(function(){a(this).css(f,h(this,b,!0,c)+"px")})}}),a.extend(a.expr[":"],{data:function(b,c,d){return!!a.data(b,d[3])},focusable:function(b){return c(b,!isNaN(a.attr(b,"tabindex")))},tabbable:function(b){var d=a.attr(b,"tabindex"),e=isNaN(d);return(e||d>=0)&&c(b,!e)}}),a(function(){var b=document.body,c=b.appendChild(c=document.createElement("div"));c.offsetHeight,a.extend(c.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0}),a.support.minHeight=c.offsetHeight===100,a.support.selectstart="onselectstart"in c,b.removeChild(c).style.display="none"}),a.extend(a.ui,{plugin:{add:function(b,c,d){var e=a.ui[b].prototype;for(var f in d)e.plugins[f]=e.plugins[f]||[],e.plugins[f].push([c,d[f]])},call:function(a,b,c){var d=a.plugins[b];if(!!d&&!!a.element[0].parentNode)for(var e=0;e<d.length;e++)a.options[d[e][0]]&&d[e][1].apply(a.element,c)}},contains:function(a,b){return document.compareDocumentPosition?a.compareDocumentPosition(b)&16:a!==b&&a.contains(b)},hasScroll:function(b,c){if(a(b).css("overflow")==="hidden")return!1;var d=c&&c==="left"?"scrollLeft":"scrollTop",e=!1;if(b[d]>0)return!0;b[d]=1,e=b[d]>0,b[d]=0;return e},isOverAxis:function(a,b,c){return a>b&&a<b+c},isOver:function(b,c,d,e,f,g){return a.ui.isOverAxis(b,d,f)&&a.ui.isOverAxis(c,e,g)}}))})(jQuery);
-/*!
+(function(a,d){a.ui=a.ui||{};if(a.ui.version){return}a.extend(a.ui,{version:"1.8.18",keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}});a.fn.extend({propAttr:a.fn.prop||a.fn.attr,_focus:a.fn.focus,focus:function(e,f){return typeof e==="number"?this.each(function(){var g=this;setTimeout(function(){a(g).focus();if(f){f.call(g)}},e)}):this._focus.apply(this,arguments)},scrollParent:function(){var e;if((a.browser.msie&&(/(static|relative)/).test(this.css("position")))||(/absolute/).test(this.css("position"))){e=this.parents().filter(function(){return(/(relative|absolute|fixed)/).test(a.curCSS(this,"position",1))&&(/(auto|scroll)/).test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0)}else{e=this.parents().filter(function(){return(/(auto|scroll)/).test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0)}return(/fixed/).test(this.css("position"))||!e.length?a(document):e},zIndex:function(h){if(h!==d){return this.css("zIndex",h)}if(this.length){var f=a(this[0]),e,g;while(f.length&&f[0]!==document){e=f.css("position");if(e==="absolute"||e==="relative"||e==="fixed"){g=parseInt(f.css("zIndex"),10);if(!isNaN(g)&&g!==0){return g}}f=f.parent()}}return 0},disableSelection:function(){return this.bind((a.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(e){e.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}});a.each(["Width","Height"],function(g,e){var f=e==="Width"?["Left","Right"]:["Top","Bottom"],h=e.toLowerCase(),k={innerWidth:a.fn.innerWidth,innerHeight:a.fn.innerHeight,outerWidth:a.fn.outerWidth,outerHeight:a.fn.outerHeight};function j(m,l,i,n){a.each(f,function(){l-=parseFloat(a.curCSS(m,"padding"+this,true))||0;if(i){l-=parseFloat(a.curCSS(m,"border"+this+"Width",true))||0}if(n){l-=parseFloat(a.curCSS(m,"margin"+this,true))||0}});return l}a.fn["inner"+e]=function(i){if(i===d){return k["inner"+e].call(this)}return this.each(function(){a(this).css(h,j(this,i)+"px")})};a.fn["outer"+e]=function(i,l){if(typeof i!=="number"){return k["outer"+e].call(this,i)}return this.each(function(){a(this).css(h,j(this,i,true,l)+"px")})}});function c(g,e){var j=g.nodeName.toLowerCase();if("area"===j){var i=g.parentNode,h=i.name,f;if(!g.href||!h||i.nodeName.toLowerCase()!=="map"){return false}f=a("img[usemap=#"+h+"]")[0];return !!f&&b(f)}return(/input|select|textarea|button|object/.test(j)?!g.disabled:"a"==j?g.href||e:e)&&b(g)}function b(e){return !a(e).parents().andSelf().filter(function(){return a.curCSS(this,"visibility")==="hidden"||a.expr.filters.hidden(this)}).length}a.extend(a.expr[":"],{data:function(g,f,e){return !!a.data(g,e[3])},focusable:function(e){return c(e,!isNaN(a.attr(e,"tabindex")))},tabbable:function(g){var e=a.attr(g,"tabindex"),f=isNaN(e);return(f||e>=0)&&c(g,!f)}});a(function(){var e=document.body,f=e.appendChild(f=document.createElement("div"));f.offsetHeight;a.extend(f.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0});a.support.minHeight=f.offsetHeight===100;a.support.selectstart="onselectstart" in f;e.removeChild(f).style.display="none"});a.extend(a.ui,{plugin:{add:function(f,g,j){var h=a.ui[f].prototype;for(var e in j){h.plugins[e]=h.plugins[e]||[];h.plugins[e].push([g,j[e]])}},call:function(e,g,f){var j=e.plugins[g];if(!j||!e.element[0].parentNode){return}for(var h=0;h<j.length;h++){if(e.options[j[h][0]]){j[h][1].apply(e.element,f)}}}},contains:function(f,e){return document.compareDocumentPosition?f.compareDocumentPosition(e)&16:f!==e&&f.contains(e)},hasScroll:function(h,f){if(a(h).css("overflow")==="hidden"){return false}var e=(f&&f==="left")?"scrollLeft":"scrollTop",g=false;if(h[e]>0){return true}h[e]=1;g=(h[e]>0);h[e]=0;return g},isOverAxis:function(f,e,g){return(f>e)&&(f<(e+g))},isOver:function(j,f,i,h,e,g){return a.ui.isOverAxis(j,i,e)&&a.ui.isOverAxis(f,h,g)}})})(jQuery);/*!
  * jQuery UI Widget 1.8.18
  *
  * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
@@ -17,8 +16,7 @@
  *
  * http://docs.jquery.com/UI/Widget
  */
-(function(a,b){if(a.cleanData){var c=a.cleanData;a.cleanData=function(b){for(var d=0,e;(e=b[d])!=null;d++)try{a(e).triggerHandler("remove")}catch(f){}c(b)}}else{var d=a.fn.remove;a.fn.remove=function(b,c){return this.each(function(){c||(!b||a.filter(b,[this]).length)&&a("*",this).add([this]).each(function(){try{a(this).triggerHandler("remove")}catch(b){}});return d.call(a(this),b,c)})}}a.widget=function(b,c,d){var e=b.split(".")[0],f;b=b.split(".")[1],f=e+"-"+b,d||(d=c,c=a.Widget),a.expr[":"][f]=function(c){return!!a.data(c,b)},a[e]=a[e]||{},a[e][b]=function(a,b){arguments.length&&this._createWidget(a,b)};var g=new c;g.options=a.extend(!0,{},g.options),a[e][b].prototype=a.extend(!0,g,{namespace:e,widgetName:b,widgetEventPrefix:a[e][b].prototype.widgetEventPrefix||b,widgetBaseClass:f},d),a.widget.bridge(b,a[e][b])},a.widget.bridge=function(c,d){a.fn[c]=function(e){var f=typeof e=="string",g=Array.prototype.slice.call(arguments,1),h=this;e=!f&&g.length?a.extend.apply(null,[!0,e].concat(g)):e;if(f&&e.charAt(0)==="_")return h;f?this.each(function(){var d=a.data(this,c),f=d&&a.isFunction(d[e])?d[e].apply(d,g):d;if(f!==d&&f!==b){h=f;return!1}}):this.each(function(){var b=a.data(this,c);b?b.option(e||{})._init():a.data(this,c,new d(e,this))});return h}},a.Widget=function(a,b){arguments.length&&this._createWidget(a,b)},a.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",options:{disabled:!1},_createWidget:function(b,c){a.data(c,this.widgetName,this),this.element=a(c),this.options=a.extend(!0,{},this.options,this._getCreateOptions(),b);var d=this;this.element.bind("remove."+this.widgetName,function(){d.destroy()}),this._create(),this._trigger("create"),this._init()},_getCreateOptions:function(){return a.metadata&&a.metadata.get(this.element[0])[this.widgetName]},_create:function(){},_init:function(){},destroy:function(){this.element.unbind("."+this.widgetName).removeData(this.widgetName),this.widget().unbind("."+this.widgetName).removeAttr("aria-disabled").removeClass(this.widgetBaseClass+"-disabled "+"ui-state-disabled")},widget:function(){return this.element},option:function(c,d){var e=c;if(arguments.length===0)return a.extend({},this.options);if(typeof c=="string"){if(d===b)return this.options[c];e={},e[c]=d}this._setOptions(e);return this},_setOptions:function(b){var c=this;a.each(b,function(a,b){c._setOption(a,b)});return this},_setOption:function(a,b){this.options[a]=b,a==="disabled"&&this.widget()[b?"addClass":"removeClass"](this.widgetBaseClass+"-disabled"+" "+"ui-state-disabled").attr("aria-disabled",b);return this},enable:function(){return this._setOption("disabled",!1)},disable:function(){return this._setOption("disabled",!0)},_trigger:function(b,c,d){var e,f,g=this.options[b];d=d||{},c=a.Event(c),c.type=(b===this.widgetEventPrefix?b:this.widgetEventPrefix+b).toLowerCase(),c.target=this.element[0],f=c.originalEvent;if(f)for(e in f)e in c||(c[e]=f[e]);this.element.trigger(c,d);return!(a.isFunction(g)&&g.call(this.element[0],c,d)===!1||c.isDefaultPrevented())}}})(jQuery);
-/*!
+(function(b,d){if(b.cleanData){var c=b.cleanData;b.cleanData=function(f){for(var g=0,h;(h=f[g])!=null;g++){try{b(h).triggerHandler("remove")}catch(j){}}c(f)}}else{var a=b.fn.remove;b.fn.remove=function(e,f){return this.each(function(){if(!f){if(!e||b.filter(e,[this]).length){b("*",this).add([this]).each(function(){try{b(this).triggerHandler("remove")}catch(g){}})}}return a.call(b(this),e,f)})}}b.widget=function(f,h,e){var g=f.split(".")[0],j;f=f.split(".")[1];j=g+"-"+f;if(!e){e=h;h=b.Widget}b.expr[":"][j]=function(k){return !!b.data(k,f)};b[g]=b[g]||{};b[g][f]=function(k,l){if(arguments.length){this._createWidget(k,l)}};var i=new h();i.options=b.extend(true,{},i.options);b[g][f].prototype=b.extend(true,i,{namespace:g,widgetName:f,widgetEventPrefix:b[g][f].prototype.widgetEventPrefix||f,widgetBaseClass:j},e);b.widget.bridge(f,b[g][f])};b.widget.bridge=function(f,e){b.fn[f]=function(i){var g=typeof i==="string",h=Array.prototype.slice.call(arguments,1),j=this;i=!g&&h.length?b.extend.apply(null,[true,i].concat(h)):i;if(g&&i.charAt(0)==="_"){return j}if(g){this.each(function(){var k=b.data(this,f),l=k&&b.isFunction(k[i])?k[i].apply(k,h):k;if(l!==k&&l!==d){j=l;return false}})}else{this.each(function(){var k=b.data(this,f);if(k){k.option(i||{})._init()}else{b.data(this,f,new e(i,this))}})}return j}};b.Widget=function(e,f){if(arguments.length){this._createWidget(e,f)}};b.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",options:{disabled:false},_createWidget:function(f,g){b.data(g,this.widgetName,this);this.element=b(g);this.options=b.extend(true,{},this.options,this._getCreateOptions(),f);var e=this;this.element.bind("remove."+this.widgetName,function(){e.destroy()});this._create();this._trigger("create");this._init()},_getCreateOptions:function(){return b.metadata&&b.metadata.get(this.element[0])[this.widgetName]},_create:function(){},_init:function(){},destroy:function(){this.element.unbind("."+this.widgetName).removeData(this.widgetName);this.widget().unbind("."+this.widgetName).removeAttr("aria-disabled").removeClass(this.widgetBaseClass+"-disabled ui-state-disabled")},widget:function(){return this.element},option:function(f,g){var e=f;if(arguments.length===0){return b.extend({},this.options)}if(typeof f==="string"){if(g===d){return this.options[f]}e={};e[f]=g}this._setOptions(e);return this},_setOptions:function(f){var e=this;b.each(f,function(g,h){e._setOption(g,h)});return this},_setOption:function(e,f){this.options[e]=f;if(e==="disabled"){this.widget()[f?"addClass":"removeClass"](this.widgetBaseClass+"-disabled ui-state-disabled").attr("aria-disabled",f)}return this},enable:function(){return this._setOption("disabled",false)},disable:function(){return this._setOption("disabled",true)},_trigger:function(e,f,g){var j,i,h=this.options[e];g=g||{};f=b.Event(f);f.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase();f.target=this.element[0];i=f.originalEvent;if(i){for(j in i){if(!(j in f)){f[j]=i[j]}}}this.element.trigger(f,g);return !(b.isFunction(h)&&h.call(this.element[0],f,g)===false||f.isDefaultPrevented())}}})(jQuery);/*!
  * jQuery UI Mouse 1.8.18
  *
  * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
  * Depends:
  *     jquery.ui.widget.js
  */
-(function(a,b){var c=!1;a(document).mouseup(function(a){c=!1}),a.widget("ui.mouse",{options:{cancel:":input,option",distance:1,delay:0},_mouseInit:function(){var b=this;this.element.bind("mousedown."+this.widgetName,function(a){return b._mouseDown(a)}).bind("click."+this.widgetName,function(c){if(!0===a.data(c.target,b.widgetName+".preventClickEvent")){a.removeData(c.target,b.widgetName+".preventClickEvent"),c.stopImmediatePropagation();return!1}}),this.started=!1},_mouseDestroy:function(){this.element.unbind("."+this.widgetName)},_mouseDown:function(b){if(!c){this._mouseStarted&&this._mouseUp(b),this._mouseDownEvent=b;var d=this,e=b.which==1,f=typeof this.options.cancel=="string"&&b.target.nodeName?a(b.target).closest(this.options.cancel).length:!1;if(!e||f||!this._mouseCapture(b))return!0;this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){d.mouseDelayMet=!0},this.options.delay));if(this._mouseDistanceMet(b)&&this._mouseDelayMet(b)){this._mouseStarted=this._mouseStart(b)!==!1;if(!this._mouseStarted){b.preventDefault();return!0}}!0===a.data(b.target,this.widgetName+".preventClickEvent")&&a.removeData(b.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(a){return d._mouseMove(a)},this._mouseUpDelegate=function(a){return d._mouseUp(a)},a(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate),b.preventDefault(),c=!0;return!0}},_mouseMove:function(b){if(a.browser.msie&&!(document.documentMode>=9)&&!b.button)return this._mouseUp(b);if(this._mouseStarted){this._mouseDrag(b);return b.preventDefault()}this._mouseDistanceMet(b)&&this._mouseDelayMet(b)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,b)!==!1,this._mouseStarted?this._mouseDrag(b):this._mouseUp(b));return!this._mouseStarted},_mouseUp:function(b){a(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,b.target==this._mouseDownEvent.target&&a.data(b.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(b));return!1},_mouseDistanceMet:function(a){return Math.max(Math.abs(this._mouseDownEvent.pageX-a.pageX),Math.abs(this._mouseDownEvent.pageY-a.pageY))>=this.options.distance},_mouseDelayMet:function(a){return this.mouseDelayMet},_mouseStart:function(a){},_mouseDrag:function(a){},_mouseStop:function(a){},_mouseCapture:function(a){return!0}})})(jQuery);
-/*
- * jQuery UI Resizable 1.8.18
- *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Resizables
- *
- * Depends:
- *     jquery.ui.core.js
- *     jquery.ui.mouse.js
- *     jquery.ui.widget.js
- */
-(function(a,b){a.widget("ui.resizable",a.ui.mouse,{widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:1e3},_create:function(){var b=this,c=this.options;this.element.addClass("ui-resizable"),a.extend(this,{_aspectRatio:!!c.aspectRatio,aspectRatio:c.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:c.helper||c.ghost||c.animate?c.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)&&(this.element.wrap(a('<div class="ui-wrapper" style="overflow: hidden;"></div>').css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("resizable",this.element.data("resizable")),this.elementIsWrapper=!0,this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")}),this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0}),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css({margin:this.originalElement.css("margin")}),this._proportionallyResize()),this.handles=c.handles||(a(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se");if(this.handles.constructor==String){this.handles=="all"&&(this.handles="n,e,s,w,se,sw,ne,nw");var d=this.handles.split(",");this.handles={};for(var e=0;e<d.length;e++){var f=a.trim(d[e]),g="ui-resizable-"+f,h=a('<div class="ui-resizable-handle '+g+'"></div>');/sw|se|ne|nw/.test(f)&&h.css({zIndex:++c.zIndex}),"se"==f&&h.addClass("ui-icon ui-icon-gripsmall-diagonal-se"),this.handles[f]=".ui-resizable-"+f,this.element.append(h)}}this._renderAxis=function(b){b=b||this.element;for(var c in this.handles){this.handles[c].constructor==String&&(this.handles[c]=a(this.handles[c],this.element).show());if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var d=a(this.handles[c],this.element),e=0;e=/sw|ne|nw|se|n|s/.test(c)?d.outerHeight():d.outerWidth();var f=["padding",/ne|nw|n/.test(c)?"Top":/se|sw|s/.test(c)?"Bottom":/^e$/.test(c)?"Right":"Left"].join("");b.css(f,e),this._proportionallyResize()}if(!a(this.handles[c]).length)continue}},this._renderAxis(this.element),this._handles=a(".ui-resizable-handle",this.element).disableSelection(),this._handles.mouseover(function(){if(!b.resizing){if(this.className)var a=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);b.axis=a&&a[1]?a[1]:"se"}}),c.autoHide&&(this._handles.hide(),a(this.element).addClass("ui-resizable-autohide").hover(function(){c.disabled||(a(this).removeClass("ui-resizable-autohide"),b._handles.show())},function(){c.disabled||b.resizing||(a(this).addClass("ui-resizable-autohide"),b._handles.hide())})),this._mouseInit()},destroy:function(){this._mouseDestroy();var b=function(b){a(b).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};if(this.elementIsWrapper){b(this.element);var c=this.element;c.after(this.originalElement.css({position:c.css("position"),width:c.outerWidth(),height:c.outerHeight(),top:c.css("top"),left:c.css("left")})).remove()}this.originalElement.css("resize",this.originalResizeStyle),b(this.originalElement);return this},_mouseCapture:function(b){var c=!1;for(var d in this.handles)a(this.handles[d])[0]==b.target&&(c=!0);return!this.options.disabled&&c},_mouseStart:function(b){var d=this.options,e=this.element.position(),f=this.element;this.resizing=!0,this.documentScroll={top:a(document).scrollTop(),left:a(document).scrollLeft()},(f.is(".ui-draggable")||/absolute/.test(f.css("position")))&&f.css({position:"absolute",top:e.top,left:e.left}),this._renderProxy();var g=c(this.helper.css("left")),h=c(this.helper.css("top"));d.containment&&(g+=a(d.containment).scrollLeft()||0,h+=a(d.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:g,top:h},this.size=this._helper?{width:f.outerWidth(),height:f.outerHeight()}:{width:f.width(),height:f.height()},this.originalSize=this._helper?{width:f.outerWidth(),height:f.outerHeight()}:{width:f.width(),height:f.height()},this.originalPosition={left:g,top:h},this.sizeDiff={width:f.outerWidth()-f.width(),height:f.outerHeight()-f.height()},this.originalMousePosition={left:b.pageX,top:b.pageY},this.aspectRatio=typeof d.aspectRatio=="number"?d.aspectRatio:this.originalSize.width/this.originalSize.height||1;var i=a(".ui-resizable-"+this.axis).css("cursor");a("body").css("cursor",i=="auto"?this.axis+"-resize":i),f.addClass("ui-resizable-resizing"),this._propagate("start",b);return!0},_mouseDrag:function(b){var c=this.helper,d=this.options,e={},f=this,g=this.originalMousePosition,h=this.axis,i=b.pageX-g.left||0,j=b.pageY-g.top||0,k=this._change[h];if(!k)return!1;var l=k.apply(this,[b,i,j]),m=a.browser.msie&&a.browser.version<7,n=this.sizeDiff;this._updateVirtualBoundaries(b.shiftKey);if(this._aspectRatio||b.shiftKey)l=this._updateRatio(l,b);l=this._respectSize(l,b),this._propagate("resize",b),c.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"}),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),this._updateCache(l),this._trigger("resize",b,this.ui());return!1},_mouseStop:function(b){this.resizing=!1;var c=this.options,d=this;if(this._helper){var e=this._proportionallyResizeElements,f=e.length&&/textarea/i.test(e[0].nodeName),g=f&&a.ui.hasScroll(e[0],"left")?0:d.sizeDiff.height,h=f?0:d.sizeDiff.width,i={width:d.helper.width()-h,height:d.helper.height()-g},j=parseInt(d.element.css("left"),10)+(d.position.left-d.originalPosition.left)||null,k=parseInt(d.element.css("top"),10)+(d.position.top-d.originalPosition.top)||null;c.animate||this.element.css(a.extend(i,{top:k,left:j})),d.helper.height(d.size.height),d.helper.width(d.size.width),this._helper&&!c.animate&&this._proportionallyResize()}a("body").css("cursor","auto"),this.element.removeClass("ui-resizable-resizing"),this._propagate("stop",b),this._helper&&this.helper.remove();return!1},_updateVirtualBoundaries:function(a){var b=this.options,c,e,f,g,h;h={minWidth:d(b.minWidth)?b.minWidth:0,maxWidth:d(b.maxWidth)?b.maxWidth:Infinity,minHeight:d(b.minHeight)?b.minHeight:0,maxHeight:d(b.maxHeight)?b.maxHeight:Infinity};if(this._aspectRatio||a)c=h.minHeight*this.aspectRatio,f=h.minWidth/this.aspectRatio,e=h.maxHeight*this.aspectRatio,g=h.maxWidth/this.aspectRatio,c>h.minWidth&&(h.minWidth=c),f>h.minHeight&&(h.minHeight=f),e<h.maxWidth&&(h.maxWidth=e),g<h.maxHeight&&(h.maxHeight=g);this._vBoundaries=h},_updateCache:function(a){var b=this.options;this.offset=this.helper.offset(),d(a.left)&&(this.position.left=a.left),d(a.top)&&(this.position.top=a.top),d(a.height)&&(this.size.height=a.height),d(a.width)&&(this.size.width=a.width)},_updateRatio:function(a,b){var c=this.options,e=this.position,f=this.size,g=this.axis;d(a.height)?a.width=a.height*this.aspectRatio:d(a.width)&&(a.height=a.width/this.aspectRatio),g=="sw"&&(a.left=e.left+(f.width-a.width),a.top=null),g=="nw"&&(a.top=e.top+(f.height-a.height),a.left=e.left+(f.width-a.width));return a},_respectSize:function(a,b){var c=this.helper,e=this._vBoundaries,f=this._aspectRatio||b.shiftKey,g=this.axis,h=d(a.width)&&e.maxWidth&&e.maxWidth<a.width,i=d(a.height)&&e.maxHeight&&e.maxHeight<a.height,j=d(a.width)&&e.minWidth&&e.minWidth>a.width,k=d(a.height)&&e.minHeight&&e.minHeight>a.height;j&&(a.width=e.minWidth),k&&(a.height=e.minHeight),h&&(a.width=e.maxWidth),i&&(a.height=e.maxHeight);var l=this.originalPosition.left+this.originalSize.width,m=this.position.top+this.size.height,n=/sw|nw|w/.test(g),o=/nw|ne|n/.test(g);j&&n&&(a.left=l-e.minWidth),h&&n&&(a.left=l-e.maxWidth),k&&o&&(a.top=m-e.minHeight),i&&o&&(a.top=m-e.maxHeight);var p=!a.width&&!a.height;p&&!a.left&&a.top?a.top=null:p&&!a.top&&a.left&&(a.left=null);return a},_proportionallyResize:function(){var b=this.options;if(!!this._proportionallyResizeElements.length){var c=this.helper||this.element;for(var d=0;d<this._proportionallyResizeElements.length;d++){var e=this._proportionallyResizeElements[d];if(!this.borderDif){var f=[e.css("borderTopWidth"),e.css("borderRightWidth"),e.css("borderBottomWidth"),e.css("borderLeftWidth")],g=[e.css("paddingTop"),e.css("paddingRight"),e.css("paddingBottom"),e.css("paddingLeft")];this.borderDif=a.map(f,function(a,b){var c=parseInt(a,10)||0,d=parseInt(g[b],10)||0;return c+d})}if(a.browser.msie&&(!!a(c).is(":hidden")||!!a(c).parents(":hidden").length))continue;e.css({height:c.height()-this.borderDif[0]-this.borderDif[2]||0,width:c.width()-this.borderDif[1]-this.borderDif[3]||0})}}},_renderProxy:function(){var b=this.element,c=this.options;this.elementOffset=b.offset();if(this._helper){this.helper=this.helper||a('<div style="overflow:hidden;"></div>');var d=a.browser.msie&&a.browser.version<7,e=d?1:0,f=d?2:-1;this.helper.addClass(this._helper).css({width:this.element.outerWidth()+f,height:this.element.outerHeight()+f,position:"absolute",left:this.elementOffset.left-e+"px",top:this.elementOffset.top-e+"px",zIndex:++c.zIndex}),this.helper.appendTo("body").disableSelection()}else this.helper=this.element},_change:{e:function(a,b,c){return{width:this.originalSize.width+b}},w:function(a,b,c){var d=this.options,e=this.originalSize,f=this.originalPosition;return{left:f.left+b,width:e.width-b}},n:function(a,b,c){var d=this.options,e=this.originalSize,f=this.originalPosition;return{top:f.top+c,height:e.height-c}},s:function(a,b,c){return{height:this.originalSize.height+c}},se:function(b,c,d){return a.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[b,c,d]))},sw:function(b,c,d){return a.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[b,c,d]))},ne:function(b,c,d){return a.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[b,c,d]))},nw:function(b,c,d){return a.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[b,c,d]))}},_propagate:function(b,c){a.ui.plugin.call(this,b,[c,this.ui()]),b!="resize"&&this._trigger(b,c,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),a.extend(a.ui.resizable,{version:"1.8.18"}),a.ui.plugin.add("resizable","alsoResize",{start:function(b,c){var d=a(this).data("resizable"),e=d.options,f=function(b){a(b).each(function(){var b=a(this);b.data("resizable-alsoresize",{width:parseInt(b.width(),10),height:parseInt(b.height(),10),left:parseInt(b.css("left"),10),top:parseInt(b.css("top"),10)})})};typeof e.alsoResize=="object"&&!e.alsoResize.parentNode?e.alsoResize.length?(e.alsoResize=e.alsoResize[0],f(e.alsoResize)):a.each(e.alsoResize,function(a){f(a)}):f(e.alsoResize)},resize:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d.originalSize,g=d.originalPosition,h={height:d.size.height-f.height||0,width:d.size.width-f.width||0,top:d.position.top-g.top||0,left:d.position.left-g.left||0},i=function(b,d){a(b).each(function(){var b=a(this),e=a(this).data("resizable-alsoresize"),f={},g=d&&d.length?d:b.parents(c.originalElement[0]).length?["width","height"]:["width","height","top","left"];a.each(g,function(a,b){var c=(e[b]||0)+(h[b]||0);c&&c>=0&&(f[b]=c||null)}),b.css(f)})};typeof e.alsoResize=="object"&&!e.alsoResize.nodeType?a.each(e.alsoResize,function(a,b){i(a,b)}):i(e.alsoResize)},stop:function(b,c){a(this).removeData("resizable-alsoresize")}}),a.ui.plugin.add("resizable","animate",{stop:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d._proportionallyResizeElements,g=f.length&&/textarea/i.test(f[0].nodeName),h=g&&a.ui.hasScroll(f[0],"left")?0:d.sizeDiff.height,i=g?0:d.sizeDiff.width,j={width:d.size.width-i,height:d.size.height-h},k=parseInt(d.element.css("left"),10)+(d.position.left-d.originalPosition.left)||null,l=parseInt(d.element.css("top"),10)+(d.position.top-d.originalPosition.top)||null;d.element.animate(a.extend(j,l&&k?{top:l,left:k}:{}),{duration:e.animateDuration,easing:e.animateEasing,step:function(){var c={width:parseInt(d.element.css("width"),10),height:parseInt(d.element.css("height"),10),top:parseInt(d.element.css("top"),10),left:parseInt(d.element.css("left"),10)};f&&f.length&&a(f[0]).css({width:c.width,height:c.height}),d._updateCache(c),d._propagate("resize",b)}})}}),a.ui.plugin.add("resizable","containment",{start:function(b,d){var e=a(this).data("resizable"),f=e.options,g=e.element,h=f.containment,i=h instanceof a?h.get(0):/parent/.test(h)?g.parent().get(0):h;if(!!i){e.containerElement=a(i);if(/document/.test(h)||h==document)e.containerOffset={left:0,top:0},e.containerPosition={left:0,top:0},e.parentData={element:a(document),left:0,top:0,width:a(document).width(),height:a(document).height()||document.body.parentNode.scrollHeight};else{var j=a(i),k=[];a(["Top","Right","Left","Bottom"]).each(function(a,b){k[a]=c(j.css("padding"+b))}),e.containerOffset=j.offset(),e.containerPosition=j.position(),e.containerSize={height:j.innerHeight()-k[3],width:j.innerWidth()-k[1]};var l=e.containerOffset,m=e.containerSize.height,n=e.containerSize.width,o=a.ui.hasScroll(i,"left")?i.scrollWidth:n,p=a.ui.hasScroll(i)?i.scrollHeight:m;e.parentData={element:i,left:l.left,top:l.top,width:o,height:p}}}},resize:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d.containerSize,g=d.containerOffset,h=d.size,i=d.position,j=d._aspectRatio||b.shiftKey,k={top:0,left:0},l=d.containerElement;l[0]!=document&&/static/.test(l.css("position"))&&(k=g),i.left<(d._helper?g.left:0)&&(d.size.width=d.size.width+(d._helper?d.position.left-g.left:d.position.left-k.left),j&&(d.size.height=d.size.width/e.aspectRatio),d.position.left=e.helper?g.left:0),i.top<(d._helper?g.top:0)&&(d.size.height=d.size.height+(d._helper?d.position.top-g.top:d.position.top),j&&(d.size.width=d.size.height*e.aspectRatio),d.position.top=d._helper?g.top:0),d.offset.left=d.parentData.left+d.position.left,d.offset.top=d.parentData.top+d.position.top;var m=Math.abs((d._helper?d.offset.left-k.left:d.offset.left-k.left)+d.sizeDiff.width),n=Math.abs((d._helper?d.offset.top-k.top:d.offset.top-g.top)+d.sizeDiff.height),o=d.containerElement.get(0)==d.element.parent().get(0),p=/relative|absolute/.test(d.containerElement.css("position"));o&&p
-&&(m-=d.parentData.left),m+d.size.width>=d.parentData.width&&(d.size.width=d.parentData.width-m,j&&(d.size.height=d.size.width/d.aspectRatio)),n+d.size.height>=d.parentData.height&&(d.size.height=d.parentData.height-n,j&&(d.size.width=d.size.height*d.aspectRatio))},stop:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d.position,g=d.containerOffset,h=d.containerPosition,i=d.containerElement,j=a(d.helper),k=j.offset(),l=j.outerWidth()-d.sizeDiff.width,m=j.outerHeight()-d.sizeDiff.height;d._helper&&!e.animate&&/relative/.test(i.css("position"))&&a(this).css({left:k.left-h.left-g.left,width:l,height:m}),d._helper&&!e.animate&&/static/.test(i.css("position"))&&a(this).css({left:k.left-h.left-g.left,width:l,height:m})}}),a.ui.plugin.add("resizable","ghost",{start:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d.size;d.ghost=d.originalElement.clone(),d.ghost.css({opacity:.25,display:"block",position:"relative",height:f.height,width:f.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof e.ghost=="string"?e.ghost:""),d.ghost.appendTo(d.helper)},resize:function(b,c){var d=a(this).data("resizable"),e=d.options;d.ghost&&d.ghost.css({position:"relative",height:d.size.height,width:d.size.width})},stop:function(b,c){var d=a(this).data("resizable"),e=d.options;d.ghost&&d.helper&&d.helper.get(0).removeChild(d.ghost.get(0))}}),a.ui.plugin.add("resizable","grid",{resize:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d.size,g=d.originalSize,h=d.originalPosition,i=d.axis,j=e._aspectRatio||b.shiftKey;e.grid=typeof e.grid=="number"?[e.grid,e.grid]:e.grid;var k=Math.round((f.width-g.width)/(e.grid[0]||1))*(e.grid[0]||1),l=Math.round((f.height-g.height)/(e.grid[1]||1))*(e.grid[1]||1);/^(se|s|e)$/.test(i)?(d.size.width=g.width+k,d.size.height=g.height+l):/^(ne)$/.test(i)?(d.size.width=g.width+k,d.size.height=g.height+l,d.position.top=h.top-l):/^(sw)$/.test(i)?(d.size.width=g.width+k,d.size.height=g.height+l,d.position.left=h.left-k):(d.size.width=g.width+k,d.size.height=g.height+l,d.position.top=h.top-l,d.position.left=h.left-k)}});var c=function(a){return parseInt(a,10)||0},d=function(a){return!isNaN(parseInt(a,10))}})(jQuery);
-/*
+(function(b,c){var a=false;b(document).mouseup(function(d){a=false});b.widget("ui.mouse",{options:{cancel:":input,option",distance:1,delay:0},_mouseInit:function(){var d=this;this.element.bind("mousedown."+this.widgetName,function(e){return d._mouseDown(e)}).bind("click."+this.widgetName,function(e){if(true===b.data(e.target,d.widgetName+".preventClickEvent")){b.removeData(e.target,d.widgetName+".preventClickEvent");e.stopImmediatePropagation();return false}});this.started=false},_mouseDestroy:function(){this.element.unbind("."+this.widgetName)},_mouseDown:function(f){if(a){return}(this._mouseStarted&&this._mouseUp(f));this._mouseDownEvent=f;var e=this,g=(f.which==1),d=(typeof this.options.cancel=="string"&&f.target.nodeName?b(f.target).closest(this.options.cancel).length:false);if(!g||d||!this._mouseCapture(f)){return true}this.mouseDelayMet=!this.options.delay;if(!this.mouseDelayMet){this._mouseDelayTimer=setTimeout(function(){e.mouseDelayMet=true},this.options.delay)}if(this._mouseDistanceMet(f)&&this._mouseDelayMet(f)){this._mouseStarted=(this._mouseStart(f)!==false);if(!this._mouseStarted){f.preventDefault();return true}}if(true===b.data(f.target,this.widgetName+".preventClickEvent")){b.removeData(f.target,this.widgetName+".preventClickEvent")}this._mouseMoveDelegate=function(h){return e._mouseMove(h)};this._mouseUpDelegate=function(h){return e._mouseUp(h)};b(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate);f.preventDefault();a=true;return true},_mouseMove:function(d){if(b.browser.msie&&!(document.documentMode>=9)&&!d.button){return this._mouseUp(d)}if(this._mouseStarted){this._mouseDrag(d);return d.preventDefault()}if(this._mouseDistanceMet(d)&&this._mouseDelayMet(d)){this._mouseStarted=(this._mouseStart(this._mouseDownEvent,d)!==false);(this._mouseStarted?this._mouseDrag(d):this._mouseUp(d))}return !this._mouseStarted},_mouseUp:function(d){b(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate);if(this._mouseStarted){this._mouseStarted=false;if(d.target==this._mouseDownEvent.target){b.data(d.target,this.widgetName+".preventClickEvent",true)}this._mouseStop(d)}return false},_mouseDistanceMet:function(d){return(Math.max(Math.abs(this._mouseDownEvent.pageX-d.pageX),Math.abs(this._mouseDownEvent.pageY-d.pageY))>=this.options.distance)},_mouseDelayMet:function(d){return this.mouseDelayMet},_mouseStart:function(d){},_mouseDrag:function(d){},_mouseStop:function(d){},_mouseCapture:function(d){return true}})})(jQuery);(function(c,d){c.widget("ui.resizable",c.ui.mouse,{widgetEventPrefix:"resize",options:{alsoResize:false,animate:false,animateDuration:"slow",animateEasing:"swing",aspectRatio:false,autoHide:false,containment:false,ghost:false,grid:false,handles:"e,s,se",helper:false,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:1000},_create:function(){var f=this,k=this.options;this.element.addClass("ui-resizable");c.extend(this,{_aspectRatio:!!(k.aspectRatio),aspectRatio:k.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:k.helper||k.ghost||k.animate?k.helper||"ui-resizable-helper":null});if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)){this.element.wrap(c('<div class="ui-wrapper" style="overflow: hidden;"></div>').css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")}));this.element=this.element.parent().data("resizable",this.element.data("resizable"));this.elementIsWrapper=true;this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")});this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0});this.originalResizeStyle=this.originalElement.css("resize");this.originalElement.css("resize","none");this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"}));this.originalElement.css({margin:this.originalElement.css("margin")});this._proportionallyResize()}this.handles=k.handles||(!c(".ui-resizable-handle",this.element).length?"e,s,se":{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"});if(this.handles.constructor==String){if(this.handles=="all"){this.handles="n,e,s,w,se,sw,ne,nw"}var l=this.handles.split(",");this.handles={};for(var g=0;g<l.length;g++){var j=c.trim(l[g]),e="ui-resizable-"+j;var h=c('<div class="ui-resizable-handle '+e+'"></div>');if(/sw|se|ne|nw/.test(j)){h.css({zIndex:++k.zIndex})}if("se"==j){h.addClass("ui-icon ui-icon-gripsmall-diagonal-se")}this.handles[j]=".ui-resizable-"+j;this.element.append(h)}}this._renderAxis=function(q){q=q||this.element;for(var n in this.handles){if(this.handles[n].constructor==String){this.handles[n]=c(this.handles[n],this.element).show()}if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var o=c(this.handles[n],this.element),p=0;p=/sw|ne|nw|se|n|s/.test(n)?o.outerHeight():o.outerWidth();var m=["padding",/ne|nw|n/.test(n)?"Top":/se|sw|s/.test(n)?"Bottom":/^e$/.test(n)?"Right":"Left"].join("");q.css(m,p);this._proportionallyResize()}if(!c(this.handles[n]).length){continue}}};this._renderAxis(this.element);this._handles=c(".ui-resizable-handle",this.element).disableSelection();this._handles.mouseover(function(){if(!f.resizing){if(this.className){var i=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)}f.axis=i&&i[1]?i[1]:"se"}});if(k.autoHide){this._handles.hide();c(this.element).addClass("ui-resizable-autohide").hover(function(){if(k.disabled){return}c(this).removeClass("ui-resizable-autohide");f._handles.show()},function(){if(k.disabled){return}if(!f.resizing){c(this).addClass("ui-resizable-autohide");f._handles.hide()}})}this._mouseInit()},destroy:function(){this._mouseDestroy();var e=function(g){c(g).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};if(this.elementIsWrapper){e(this.element);var f=this.element;f.after(this.originalElement.css({position:f.css("position"),width:f.outerWidth(),height:f.outerHeight(),top:f.css("top"),left:f.css("left")})).remove()}this.originalElement.css("resize",this.originalResizeStyle);e(this.originalElement);return this},_mouseCapture:function(f){var g=false;for(var e in this.handles){if(c(this.handles[e])[0]==f.target){g=true}}return !this.options.disabled&&g},_mouseStart:function(g){var j=this.options,f=this.element.position(),e=this.element;this.resizing=true;this.documentScroll={top:c(document).scrollTop(),left:c(document).scrollLeft()};if(e.is(".ui-draggable")||(/absolute/).test(e.css("position"))){e.css({position:"absolute",top:f.top,left:f.left})}this._renderProxy();var k=b(this.helper.css("left")),h=b(this.helper.css("top"));if(j.containment){k+=c(j.containment).scrollLeft()||0;h+=c(j.containment).scrollTop()||0}this.offset=this.helper.offset();this.position={left:k,top:h};this.size=this._helper?{width:e.outerWidth(),height:e.outerHeight()}:{width:e.width(),height:e.height()};this.originalSize=this._helper?{width:e.outerWidth(),height:e.outerHeight()}:{width:e.width(),height:e.height()};this.originalPosition={left:k,top:h};this.sizeDiff={width:e.outerWidth()-e.width(),height:e.outerHeight()-e.height()};this.originalMousePosition={left:g.pageX,top:g.pageY};this.aspectRatio=(typeof j.aspectRatio=="number")?j.aspectRatio:((this.originalSize.width/this.originalSize.height)||1);var i=c(".ui-resizable-"+this.axis).css("cursor");c("body").css("cursor",i=="auto"?this.axis+"-resize":i);e.addClass("ui-resizable-resizing");this._propagate("start",g);return true},_mouseDrag:function(e){var h=this.helper,g=this.options,m={},q=this,j=this.originalMousePosition,n=this.axis;var r=(e.pageX-j.left)||0,p=(e.pageY-j.top)||0;var i=this._change[n];if(!i){return false}var l=i.apply(this,[e,r,p]),k=c.browser.msie&&c.browser.version<7,f=this.sizeDiff;this._updateVirtualBoundaries(e.shiftKey);if(this._aspectRatio||e.shiftKey){l=this._updateRatio(l,e)}l=this._respectSize(l,e);this._propagate("resize",e);h.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"});if(!this._helper&&this._proportionallyResizeElements.length){this._proportionallyResize()}this._updateCache(l);this._trigger("resize",e,this.ui());return false},_mouseStop:function(h){this.resizing=false;var i=this.options,m=this;if(this._helper){var g=this._proportionallyResizeElements,e=g.length&&(/textarea/i).test(g[0].nodeName),f=e&&c.ui.hasScroll(g[0],"left")?0:m.sizeDiff.height,k=e?0:m.sizeDiff.width;var n={width:(m.helper.width()-k),height:(m.helper.height()-f)},j=(parseInt(m.element.css("left"),10)+(m.position.left-m.originalPosition.left))||null,l=(parseInt(m.element.css("top"),10)+(m.position.top-m.originalPosition.top))||null;if(!i.animate){this.element.css(c.extend(n,{top:l,left:j}))}m.helper.height(m.size.height);m.helper.width(m.size.width);if(this._helper&&!i.animate){this._proportionallyResize()}}c("body").css("cursor","auto");this.element.removeClass("ui-resizable-resizing");this._propagate("stop",h);if(this._helper){this.helper.remove()}return false},_updateVirtualBoundaries:function(g){var j=this.options,i,h,f,k,e;e={minWidth:a(j.minWidth)?j.minWidth:0,maxWidth:a(j.maxWidth)?j.maxWidth:Infinity,minHeight:a(j.minHeight)?j.minHeight:0,maxHeight:a(j.maxHeight)?j.maxHeight:Infinity};if(this._aspectRatio||g){i=e.minHeight*this.aspectRatio;f=e.minWidth/this.aspectRatio;h=e.maxHeight*this.aspectRatio;k=e.maxWidth/this.aspectRatio;if(i>e.minWidth){e.minWidth=i}if(f>e.minHeight){e.minHeight=f}if(h<e.maxWidth){e.maxWidth=h}if(k<e.maxHeight){e.maxHeight=k}}this._vBoundaries=e},_updateCache:function(e){var f=this.options;this.offset=this.helper.offset();if(a(e.left)){this.position.left=e.left}if(a(e.top)){this.position.top=e.top}if(a(e.height)){this.size.height=e.height}if(a(e.width)){this.size.width=e.width}},_updateRatio:function(h,g){var i=this.options,j=this.position,f=this.size,e=this.axis;if(a(h.height)){h.width=(h.height*this.aspectRatio)}else{if(a(h.width)){h.height=(h.width/this.aspectRatio)}}if(e=="sw"){h.left=j.left+(f.width-h.width);h.top=null}if(e=="nw"){h.top=j.top+(f.height-h.height);h.left=j.left+(f.width-h.width)}return h},_respectSize:function(l,g){var j=this.helper,i=this._vBoundaries,r=this._aspectRatio||g.shiftKey,q=this.axis,t=a(l.width)&&i.maxWidth&&(i.maxWidth<l.width),m=a(l.height)&&i.maxHeight&&(i.maxHeight<l.height),h=a(l.width)&&i.minWidth&&(i.minWidth>l.width),s=a(l.height)&&i.minHeight&&(i.minHeight>l.height);if(h){l.width=i.minWidth}if(s){l.height=i.minHeight}if(t){l.width=i.maxWidth}if(m){l.height=i.maxHeight}var f=this.originalPosition.left+this.originalSize.width,p=this.position.top+this.size.height;var k=/sw|nw|w/.test(q),e=/nw|ne|n/.test(q);if(h&&k){l.left=f-i.minWidth}if(t&&k){l.left=f-i.maxWidth}if(s&&e){l.top=p-i.minHeight}if(m&&e){l.top=p-i.maxHeight}var n=!l.width&&!l.height;if(n&&!l.left&&l.top){l.top=null}else{if(n&&!l.top&&l.left){l.left=null}}return l},_proportionallyResize:function(){var k=this.options;if(!this._proportionallyResizeElements.length){return}var g=this.helper||this.element;for(var f=0;f<this._proportionallyResizeElements.length;f++){var h=this._proportionallyResizeElements[f];if(!this.borderDif){var e=[h.css("borderTopWidth"),h.css("borderRightWidth"),h.css("borderBottomWidth"),h.css("borderLeftWidth")],j=[h.css("paddingTop"),h.css("paddingRight"),h.css("paddingBottom"),h.css("paddingLeft")];this.borderDif=c.map(e,function(l,n){var m=parseInt(l,10)||0,o=parseInt(j[n],10)||0;return m+o})}if(c.browser.msie&&!(!(c(g).is(":hidden")||c(g).parents(":hidden").length))){continue}h.css({height:(g.height()-this.borderDif[0]-this.borderDif[2])||0,width:(g.width()-this.borderDif[1]-this.borderDif[3])||0})}},_renderProxy:function(){var f=this.element,i=this.options;this.elementOffset=f.offset();if(this._helper){this.helper=this.helper||c('<div style="overflow:hidden;"></div>');var e=c.browser.msie&&c.browser.version<7,g=(e?1:0),h=(e?2:-1);this.helper.addClass(this._helper).css({width:this.element.outerWidth()+h,height:this.element.outerHeight()+h,position:"absolute",left:this.elementOffset.left-g+"px",top:this.elementOffset.top-g+"px",zIndex:++i.zIndex});this.helper.appendTo("body").disableSelection()}else{this.helper=this.element}},_change:{e:function(g,f,e){return{width:this.originalSize.width+f}},w:function(h,f,e){var j=this.options,g=this.originalSize,i=this.originalPosition;return{left:i.left+f,width:g.width-f}},n:function(h,f,e){var j=this.options,g=this.originalSize,i=this.originalPosition;return{top:i.top+e,height:g.height-e}},s:function(g,f,e){return{height:this.originalSize.height+e}},se:function(g,f,e){return c.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[g,f,e]))},sw:function(g,f,e){return c.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[g,f,e]))},ne:function(g,f,e){return c.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[g,f,e]))},nw:function(g,f,e){return c.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[g,f,e]))}},_propagate:function(f,e){c.ui.plugin.call(this,f,[e,this.ui()]);(f!="resize"&&this._trigger(f,e,this.ui()))},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}});c.extend(c.ui.resizable,{version:"1.8.18"});c.ui.plugin.add("resizable","alsoResize",{start:function(f,g){var e=c(this).data("resizable"),i=e.options;var h=function(j){c(j).each(function(){var k=c(this);k.data("resizable-alsoresize",{width:parseInt(k.width(),10),height:parseInt(k.height(),10),left:parseInt(k.css("left"),10),top:parseInt(k.css("top"),10)})})};if(typeof(i.alsoResize)=="object"&&!i.alsoResize.parentNode){if(i.alsoResize.length){i.alsoResize=i.alsoResize[0];h(i.alsoResize)}else{c.each(i.alsoResize,function(j){h(j)})}}else{h(i.alsoResize)}},resize:function(g,i){var f=c(this).data("resizable"),j=f.options,h=f.originalSize,l=f.originalPosition;var k={height:(f.size.height-h.height)||0,width:(f.size.width-h.width)||0,top:(f.position.top-l.top)||0,left:(f.position.left-l.left)||0},e=function(m,n){c(m).each(function(){var q=c(this),r=c(this).data("resizable-alsoresize"),p={},o=n&&n.length?n:q.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];c.each(o,function(s,u){var t=(r[u]||0)+(k[u]||0);if(t&&t>=0){p[u]=t||null}});q.css(p)})};if(typeof(j.alsoResize)=="object"&&!j.alsoResize.nodeType){c.each(j.alsoResize,function(m,n){e(m,n)})}else{e(j.alsoResize)}},stop:function(e,f){c(this).removeData("resizable-alsoresize")}});c.ui.plugin.add("resizable","animate",{stop:function(i,n){var p=c(this).data("resizable"),j=p.options;var h=p._proportionallyResizeElements,e=h.length&&(/textarea/i).test(h[0].nodeName),f=e&&c.ui.hasScroll(h[0],"left")?0:p.sizeDiff.height,l=e?0:p.sizeDiff.width;var g={width:(p.size.width-l),height:(p.size.height-f)},k=(parseInt(p.element.css("left"),10)+(p.position.left-p.originalPosition.left))||null,m=(parseInt(p.element.css("top"),10)+(p.position.top-p.originalPosition.top))||null;
+p.element.animate(c.extend(g,m&&k?{top:m,left:k}:{}),{duration:j.animateDuration,easing:j.animateEasing,step:function(){var o={width:parseInt(p.element.css("width"),10),height:parseInt(p.element.css("height"),10),top:parseInt(p.element.css("top"),10),left:parseInt(p.element.css("left"),10)};if(h&&h.length){c(h[0]).css({width:o.width,height:o.height})}p._updateCache(o);p._propagate("resize",i)}})}});c.ui.plugin.add("resizable","containment",{start:function(f,r){var t=c(this).data("resizable"),j=t.options,l=t.element;var g=j.containment,k=(g instanceof c)?g.get(0):(/parent/.test(g))?l.parent().get(0):g;if(!k){return}t.containerElement=c(k);if(/document/.test(g)||g==document){t.containerOffset={left:0,top:0};t.containerPosition={left:0,top:0};t.parentData={element:c(document),left:0,top:0,width:c(document).width(),height:c(document).height()||document.body.parentNode.scrollHeight}}else{var n=c(k),i=[];c(["Top","Right","Left","Bottom"]).each(function(p,o){i[p]=b(n.css("padding"+o))});t.containerOffset=n.offset();t.containerPosition=n.position();t.containerSize={height:(n.innerHeight()-i[3]),width:(n.innerWidth()-i[1])};var q=t.containerOffset,e=t.containerSize.height,m=t.containerSize.width,h=(c.ui.hasScroll(k,"left")?k.scrollWidth:m),s=(c.ui.hasScroll(k)?k.scrollHeight:e);t.parentData={element:k,left:q.left,top:q.top,width:h,height:s}}},resize:function(g,q){var t=c(this).data("resizable"),i=t.options,f=t.containerSize,p=t.containerOffset,m=t.size,n=t.position,r=t._aspectRatio||g.shiftKey,e={top:0,left:0},h=t.containerElement;if(h[0]!=document&&(/static/).test(h.css("position"))){e=p}if(n.left<(t._helper?p.left:0)){t.size.width=t.size.width+(t._helper?(t.position.left-p.left):(t.position.left-e.left));if(r){t.size.height=t.size.width/i.aspectRatio}t.position.left=i.helper?p.left:0}if(n.top<(t._helper?p.top:0)){t.size.height=t.size.height+(t._helper?(t.position.top-p.top):t.position.top);if(r){t.size.width=t.size.height*i.aspectRatio}t.position.top=t._helper?p.top:0}t.offset.left=t.parentData.left+t.position.left;t.offset.top=t.parentData.top+t.position.top;var l=Math.abs((t._helper?t.offset.left-e.left:(t.offset.left-e.left))+t.sizeDiff.width),s=Math.abs((t._helper?t.offset.top-e.top:(t.offset.top-p.top))+t.sizeDiff.height);var k=t.containerElement.get(0)==t.element.parent().get(0),j=/relative|absolute/.test(t.containerElement.css("position"));if(k&&j){l-=t.parentData.left}if(l+t.size.width>=t.parentData.width){t.size.width=t.parentData.width-l;if(r){t.size.height=t.size.width/t.aspectRatio}}if(s+t.size.height>=t.parentData.height){t.size.height=t.parentData.height-s;if(r){t.size.width=t.size.height*t.aspectRatio}}},stop:function(f,n){var q=c(this).data("resizable"),g=q.options,l=q.position,m=q.containerOffset,e=q.containerPosition,i=q.containerElement;var j=c(q.helper),r=j.offset(),p=j.outerWidth()-q.sizeDiff.width,k=j.outerHeight()-q.sizeDiff.height;if(q._helper&&!g.animate&&(/relative/).test(i.css("position"))){c(this).css({left:r.left-e.left-m.left,width:p,height:k})}if(q._helper&&!g.animate&&(/static/).test(i.css("position"))){c(this).css({left:r.left-e.left-m.left,width:p,height:k})}}});c.ui.plugin.add("resizable","ghost",{start:function(g,h){var e=c(this).data("resizable"),i=e.options,f=e.size;e.ghost=e.originalElement.clone();e.ghost.css({opacity:0.25,display:"block",position:"relative",height:f.height,width:f.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof i.ghost=="string"?i.ghost:"");e.ghost.appendTo(e.helper)},resize:function(f,g){var e=c(this).data("resizable"),h=e.options;if(e.ghost){e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})}},stop:function(f,g){var e=c(this).data("resizable"),h=e.options;if(e.ghost&&e.helper){e.helper.get(0).removeChild(e.ghost.get(0))}}});c.ui.plugin.add("resizable","grid",{resize:function(e,m){var p=c(this).data("resizable"),h=p.options,k=p.size,i=p.originalSize,j=p.originalPosition,n=p.axis,l=h._aspectRatio||e.shiftKey;h.grid=typeof h.grid=="number"?[h.grid,h.grid]:h.grid;var g=Math.round((k.width-i.width)/(h.grid[0]||1))*(h.grid[0]||1),f=Math.round((k.height-i.height)/(h.grid[1]||1))*(h.grid[1]||1);if(/^(se|s|e)$/.test(n)){p.size.width=i.width+g;p.size.height=i.height+f}else{if(/^(ne)$/.test(n)){p.size.width=i.width+g;p.size.height=i.height+f;p.position.top=j.top-f}else{if(/^(sw)$/.test(n)){p.size.width=i.width+g;p.size.height=i.height+f;p.position.left=j.left-g}else{p.size.width=i.width+g;p.size.height=i.height+f;p.position.top=j.top-f;p.position.left=j.left-g}}}}});var b=function(e){return parseInt(e,10)||0};var a=function(e){return !isNaN(parseInt(e,10))}})(jQuery);/*!
  * jQuery hashchange event - v1.3 - 7/21/2010
  * http://benalman.com/projects/jquery-hashchange-plugin/
  * 
@@ -55,4 +37,4 @@
  * Dual licensed under the MIT and GPL licenses.
  * http://benalman.com/about/license/
  */
-(function($,e,b){var c="hashchange",h=document,f,g=$.event.special,i=h.documentMode,d="on"+c in e&&(i===b||i>7);function a(j){j=j||location.href;return"#"+j.replace(/^[^#]*#?(.*)$/,"$1")}$.fn[c]=function(j){return j?this.bind(c,j):this.trigger(c)};$.fn[c].delay=50;g[c]=$.extend(g[c],{setup:function(){if(d){return false}$(f.start)},teardown:function(){if(d){return false}$(f.stop)}});f=(function(){var j={},p,m=a(),k=function(q){return q},l=k,o=k;j.start=function(){p||n()};j.stop=function(){p&&clearTimeout(p);p=b};function n(){var r=a(),q=o(m);if(r!==m){l(m=r,q);$(e).trigger(c)}else{if(q!==m){location.href=location.href.replace(/#.*/,"")+q}}p=setTimeout(n,$.fn[c].delay)}$.browser.msie&&!d&&(function(){var q,r;j.start=function(){if(!q){r=$.fn[c].src;r=r&&r+a();q=$('<iframe tabindex="-1" title="empty"/>').hide().one("load",function(){r||l(a());n()}).attr("src",r||"javascript:0").insertAfter("body")[0].contentWindow;h.onpropertychange=function(){try{if(event.propertyName==="title"){q.document.title=h.title}}catch(s){}}}};j.stop=k;o=function(){return a(q.location.href)};l=function(v,s){var u=q.document,t=$.fn[c].domain;if(v!==s){u.title=h.title;u.open();t&&u.write('<script>document.domain="'+t+'"<\/script>');u.close();q.location.hash=v}}})();return j})()})(jQuery,this);
+(function($,e,b){var c="hashchange",h=document,f,g=$.event.special,i=h.documentMode,d="on"+c in e&&(i===b||i>7);function a(j){j=j||location.href;return"#"+j.replace(/^[^#]*#?(.*)$/,"$1")}$.fn[c]=function(j){return j?this.bind(c,j):this.trigger(c)};$.fn[c].delay=50;g[c]=$.extend(g[c],{setup:function(){if(d){return false}$(f.start)},teardown:function(){if(d){return false}$(f.stop)}});f=(function(){var j={},p,m=a(),k=function(q){return q},l=k,o=k;j.start=function(){p||n()};j.stop=function(){p&&clearTimeout(p);p=b};function n(){var r=a(),q=o(m);if(r!==m){l(m=r,q);$(e).trigger(c)}else{if(q!==m){location.href=location.href.replace(/#.*/,"")+q}}p=setTimeout(n,$.fn[c].delay)}$.browser.msie&&!d&&(function(){var q,r;j.start=function(){if(!q){r=$.fn[c].src;r=r&&r+a();q=$('<iframe tabindex="-1" title="empty"/>').hide().one("load",function(){r||l(a());n()}).attr("src",r||"javascript:0").insertAfter("body")[0].contentWindow;h.onpropertychange=function(){try{if(event.propertyName==="title"){q.document.title=h.title}}catch(s){}}}};j.stop=k;o=function(){return a(q.location.href)};l=function(v,s){var u=q.document,t=$.fn[c].domain;if(v!==s){u.title=h.title;u.open();t&&u.write('<script>document.domain="'+t+'"<\/script>');u.close();q.location.hash=v}}})();return j})()})(jQuery,this);
\ No newline at end of file
index f27a5ba..c860682 100644 (file)
@@ -7,8 +7,7 @@
 " *\n"
 " * http://docs.jquery.com/UI\n"
 " */\n"
-"(function(a,b){function d(b){return!a(b).parents().andSelf().filter(function(){return a.curCSS(this,\"visibility\")===\"hidden\"||a.expr.filters.hidden(this)}).length}function c(b,c){var e=b.nodeName.toLowerCase();if(\"area\"===e){var f=b.parentNode,g=f.name,h;if(!b.href||!g||f.nodeName.toLowerCase()!==\"map\")return!1;h=a(\"img[usemap=#\"+g+\"]\")[0];return!!h&&d(h)}return(/input|select|textarea|button|object/.test(e)?!b.disabled:\"a\"==e?b.href||c:c)&&d(b)}a.ui=a.ui||{};a.ui.version||(a.extend(a.ui,{version:\"1.8.18\",keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}}),a.fn.extend({propAttr:a.fn.prop||a.fn.attr,_focus:a.fn.focus,focus:function(b,c){return typeof b==\"number\"?this.each(function(){var d=this;setTimeout(function(){a(d).focus(),c&&c.call(d)},b)}):this._focus.apply(this,arguments)},scrollParent:function(){var b;a.browser.msie&&/(static|relative)/.test(this.css(\"position\"))||/absolute/.test(this.css(\"position\"))?b=this.parents().filter(function(){return/(relative|absolute|fixed)/.test(a.curCSS(this,\"position\",1))&&/(auto|scroll)/.test(a.curCSS(this,\"overflow\",1)+a.curCSS(this,\"overflow-y\",1)+a.curCSS(this,\"overflow-x\",1))}).eq(0):b=this.parents().filter(function(){return/(auto|scroll)/.test(a.curCSS(this,\"overflow\",1)+a.curCSS(this,\"overflow-y\",1)+a.curCSS(this,\"overflow-x\",1))}).eq(0);return/fixed/.test(this.css(\"position\"))||!b.length?a(document):b},zIndex:function(c){if(c!==b)return this.css(\"zIndex\",c);if(this.length){var d=a(this[0]),e,f;while(d.length&&d[0]!==document){e=d.css(\"position\");if(e===\"absolute\"||e===\"relative\"||e===\"fixed\"){f=parseInt(d.css(\"zIndex\"),10);if(!isNaN(f)&&f!==0)return f}d=d.parent()}}return 0},disableSelection:function(){return this.bind((a.support.selectstart?\"selectstart\":\"mousedown\")+\".ui-disableSelection\",function(a){a.preventDefault()})},enableSelection:function(){return this.unbind(\".ui-disableSelection\")}}),a.each([\"Width\",\"Height\"],function(c,d){function h(b,c,d,f){a.each(e,function(){c-=parseFloat(a.curCSS(b,\"padding\"+this,!0))||0,d&&(c-=parseFloat(a.curCSS(b,\"border\"+this+\"Width\",!0))||0),f&&(c-=parseFloat(a.curCSS(b,\"margin\"+this,!0))||0)});return c}var e=d===\"Width\"?[\"Left\",\"Right\"]:[\"Top\",\"Bottom\"],f=d.toLowerCase(),g={innerWidth:a.fn.innerWidth,innerHeight:a.fn.innerHeight,outerWidth:a.fn.outerWidth,outerHeight:a.fn.outerHeight};a.fn[\"inner\"+d]=function(c){if(c===b)return g[\"inner\"+d].call(this);return this.each(function(){a(this).css(f,h(this,c)+\"px\")})},a.fn[\"outer\"+d]=function(b,c){if(typeof b!=\"number\")return g[\"outer\"+d].call(this,b);return this.each(function(){a(this).css(f,h(this,b,!0,c)+\"px\")})}}),a.extend(a.expr[\":\"],{data:function(b,c,d){return!!a.data(b,d[3])},focusable:function(b){return c(b,!isNaN(a.attr(b,\"tabindex\")))},tabbable:function(b){var d=a.attr(b,\"tabindex\"),e=isNaN(d);return(e||d>=0)&&c(b,!e)}}),a(function(){var b=document.body,c=b.appendChild(c=document.createElement(\"div\"));c.offsetHeight,a.extend(c.style,{minHeight:\"100px\",height:\"auto\",padding:0,borderWidth:0}),a.support.minHeight=c.offsetHeight===100,a.support.selectstart=\"onselectstart\"in c,b.removeChild(c).style.display=\"none\"}),a.extend(a.ui,{plugin:{add:function(b,c,d){var e=a.ui[b].prototype;for(var f in d)e.plugins[f]=e.plugins[f]||[],e.plugins[f].push([c,d[f]])},call:function(a,b,c){var d=a.plugins[b];if(!!d&&!!a.element[0].parentNode)for(var e=0;e<d.length;e++)a.options[d[e][0]]&&d[e][1].apply(a.element,c)}},contains:function(a,b){return document.compareDocumentPosition?a.compareDocumentPosition(b)&16:a!==b&&a.contains(b)},hasScroll:function(b,c){if(a(b).css(\"overflow\")===\"hidden\")return!1;var d=c&&c===\"left\"?\"scrollLeft\":\"scrollTop\",e=!1;if(b[d]>0)return!0;b[d]=1,e=b[d]>0,b[d]=0;return e},isOverAxis:function(a,b,c){return a>b&&a<b+c},isOver:function(b,c,d,e,f,g){return a.ui.isOverAxis(b,d,f)&&a.ui.isOverAxis(c,e,g)}}))})(jQuery);\n"
-"/*!\n"
+"(function(a,d){a.ui=a.ui||{};if(a.ui.version){return}a.extend(a.ui,{version:\"1.8.18\",keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}});a.fn.extend({propAttr:a.fn.prop||a.fn.attr,_focus:a.fn.focus,focus:function(e,f){return typeof e===\"number\"?this.each(function(){var g=this;setTimeout(function(){a(g).focus();if(f){f.call(g)}},e)}):this._focus.apply(this,arguments)},scrollParent:function(){var e;if((a.browser.msie&&(/(static|relative)/).test(this.css(\"position\")))||(/absolute/).test(this.css(\"position\"))){e=this.parents().filter(function(){return(/(relative|absolute|fixed)/).test(a.curCSS(this,\"position\",1))&&(/(auto|scroll)/).test(a.curCSS(this,\"overflow\",1)+a.curCSS(this,\"overflow-y\",1)+a.curCSS(this,\"overflow-x\",1))}).eq(0)}else{e=this.parents().filter(function(){return(/(auto|scroll)/).test(a.curCSS(this,\"overflow\",1)+a.curCSS(this,\"overflow-y\",1)+a.curCSS(this,\"overflow-x\",1))}).eq(0)}return(/fixed/).test(this.css(\"position\"))||!e.length?a(document):e},zIndex:function(h){if(h!==d){return this.css(\"zIndex\",h)}if(this.length){var f=a(this[0]),e,g;while(f.length&&f[0]!==document){e=f.css(\"position\");if(e===\"absolute\"||e===\"relative\"||e===\"fixed\"){g=parseInt(f.css(\"zIndex\"),10);if(!isNaN(g)&&g!==0){return g}}f=f.parent()}}return 0},disableSelection:function(){return this.bind((a.support.selectstart?\"selectstart\":\"mousedown\")+\".ui-disableSelection\",function(e){e.preventDefault()})},enableSelection:function(){return this.unbind(\".ui-disableSelection\")}});a.each([\"Width\",\"Height\"],function(g,e){var f=e===\"Width\"?[\"Left\",\"Right\"]:[\"Top\",\"Bottom\"],h=e.toLowerCase(),k={innerWidth:a.fn.innerWidth,innerHeight:a.fn.innerHeight,outerWidth:a.fn.outerWidth,outerHeight:a.fn.outerHeight};function j(m,l,i,n){a.each(f,function(){l-=parseFloat(a.curCSS(m,\"padding\"+this,true))||0;if(i){l-=parseFloat(a.curCSS(m,\"border\"+this+\"Width\",true))||0}if(n){l-=parseFloat(a.curCSS(m,\"margin\"+this,true))||0}});return l}a.fn[\"inner\"+e]=function(i){if(i===d){return k[\"inner\"+e].call(this)}return this.each(function(){a(this).css(h,j(this,i)+\"px\")})};a.fn[\"outer\"+e]=function(i,l){if(typeof i!==\"number\"){return k[\"outer\"+e].call(this,i)}return this.each(function(){a(this).css(h,j(this,i,true,l)+\"px\")})}});function c(g,e){var j=g.nodeName.toLowerCase();if(\"area\"===j){var i=g.parentNode,h=i.name,f;if(!g.href||!h||i.nodeName.toLowerCase()!==\"map\"){return false}f=a(\"img[usemap=#\"+h+\"]\")[0];return !!f&&b(f)}return(/input|select|textarea|button|object/.test(j)?!g.disabled:\"a\"==j?g.href||e:e)&&b(g)}function b(e){return !a(e).parents().andSelf().filter(function(){return a.curCSS(this,\"visibility\")===\"hidden\"||a.expr.filters.hidden(this)}).length}a.extend(a.expr[\":\"],{data:function(g,f,e){return !!a.data(g,e[3])},focusable:function(e){return c(e,!isNaN(a.attr(e,\"tabindex\")))},tabbable:function(g){var e=a.attr(g,\"tabindex\"),f=isNaN(e);return(f||e>=0)&&c(g,!f)}});a(function(){var e=document.body,f=e.appendChild(f=document.createElement(\"div\"));f.offsetHeight;a.extend(f.style,{minHeight:\"100px\",height:\"auto\",padding:0,borderWidth:0});a.support.minHeight=f.offsetHeight===100;a.support.selectstart=\"onselectstart\" in f;e.removeChild(f).style.display=\"none\"});a.extend(a.ui,{plugin:{add:function(f,g,j){var h=a.ui[f].prototype;for(var e in j){h.plugins[e]=h.plugins[e]||[];h.plugins[e].push([g,j[e]])}},call:function(e,g,f){var j=e.plugins[g];if(!j||!e.element[0].parentNode){return}for(var h=0;h<j.length;h++){if(e.options[j[h][0]]){j[h][1].apply(e.element,f)}}}},contains:function(f,e){return document.compareDocumentPosition?f.compareDocumentPosition(e)&16:f!==e&&f.contains(e)},hasScroll:function(h,f){if(a(h).css(\"overflow\")===\"hidden\"){return false}var e=(f&&f===\"left\")?\"scrollLeft\":\"scrollTop\",g=false;if(h[e]>0){return true}h[e]=1;g=(h[e]>0);h[e]=0;return g},isOverAxis:function(f,e,g){return(f>e)&&(f<(e+g))},isOver:function(j,f,i,h,e,g){return a.ui.isOverAxis(j,i,e)&&a.ui.isOverAxis(f,h,g)}})})(jQuery);/*!\n"
 " * jQuery UI Widget 1.8.18\n"
 " *\n"
 " * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)\n"
@@ -17,8 +16,7 @@
 " *\n"
 " * http://docs.jquery.com/UI/Widget\n"
 " */\n"
-"(function(a,b){if(a.cleanData){var c=a.cleanData;a.cleanData=function(b){for(var d=0,e;(e=b[d])!=null;d++)try{a(e).triggerHandler(\"remove\")}catch(f){}c(b)}}else{var d=a.fn.remove;a.fn.remove=function(b,c){return this.each(function(){c||(!b||a.filter(b,[this]).length)&&a(\"*\",this).add([this]).each(function(){try{a(this).triggerHandler(\"remove\")}catch(b){}});return d.call(a(this),b,c)})}}a.widget=function(b,c,d){var e=b.split(\".\")[0],f;b=b.split(\".\")[1],f=e+\"-\"+b,d||(d=c,c=a.Widget),a.expr[\":\"][f]=function(c){return!!a.data(c,b)},a[e]=a[e]||{},a[e][b]=function(a,b){arguments.length&&this._createWidget(a,b)};var g=new c;g.options=a.extend(!0,{},g.options),a[e][b].prototype=a.extend(!0,g,{namespace:e,widgetName:b,widgetEventPrefix:a[e][b].prototype.widgetEventPrefix||b,widgetBaseClass:f},d),a.widget.bridge(b,a[e][b])},a.widget.bridge=function(c,d){a.fn[c]=function(e){var f=typeof e==\"string\",g=Array.prototype.slice.call(arguments,1),h=this;e=!f&&g.length?a.extend.apply(null,[!0,e].concat(g)):e;if(f&&e.charAt(0)===\"_\")return h;f?this.each(function(){var d=a.data(this,c),f=d&&a.isFunction(d[e])?d[e].apply(d,g):d;if(f!==d&&f!==b){h=f;return!1}}):this.each(function(){var b=a.data(this,c);b?b.option(e||{})._init():a.data(this,c,new d(e,this))});return h}},a.Widget=function(a,b){arguments.length&&this._createWidget(a,b)},a.Widget.prototype={widgetName:\"widget\",widgetEventPrefix:\"\",options:{disabled:!1},_createWidget:function(b,c){a.data(c,this.widgetName,this),this.element=a(c),this.options=a.extend(!0,{},this.options,this._getCreateOptions(),b);var d=this;this.element.bind(\"remove.\"+this.widgetName,function(){d.destroy()}),this._create(),this._trigger(\"create\"),this._init()},_getCreateOptions:function(){return a.metadata&&a.metadata.get(this.element[0])[this.widgetName]},_create:function(){},_init:function(){},destroy:function(){this.element.unbind(\".\"+this.widgetName).removeData(this.widgetName),this.widget().unbind(\".\"+this.widgetName).removeAttr(\"aria-disabled\").removeClass(this.widgetBaseClass+\"-disabled \"+\"ui-state-disabled\")},widget:function(){return this.element},option:function(c,d){var e=c;if(arguments.length===0)return a.extend({},this.options);if(typeof c==\"string\"){if(d===b)return this.options[c];e={},e[c]=d}this._setOptions(e);return this},_setOptions:function(b){var c=this;a.each(b,function(a,b){c._setOption(a,b)});return this},_setOption:function(a,b){this.options[a]=b,a===\"disabled\"&&this.widget()[b?\"addClass\":\"removeClass\"](this.widgetBaseClass+\"-disabled\"+\" \"+\"ui-state-disabled\").attr(\"aria-disabled\",b);return this},enable:function(){return this._setOption(\"disabled\",!1)},disable:function(){return this._setOption(\"disabled\",!0)},_trigger:function(b,c,d){var e,f,g=this.options[b];d=d||{},c=a.Event(c),c.type=(b===this.widgetEventPrefix?b:this.widgetEventPrefix+b).toLowerCase(),c.target=this.element[0],f=c.originalEvent;if(f)for(e in f)e in c||(c[e]=f[e]);this.element.trigger(c,d);return!(a.isFunction(g)&&g.call(this.element[0],c,d)===!1||c.isDefaultPrevented())}}})(jQuery);\n"
-"/*!\n"
+"(function(b,d){if(b.cleanData){var c=b.cleanData;b.cleanData=function(f){for(var g=0,h;(h=f[g])!=null;g++){try{b(h).triggerHandler(\"remove\")}catch(j){}}c(f)}}else{var a=b.fn.remove;b.fn.remove=function(e,f){return this.each(function(){if(!f){if(!e||b.filter(e,[this]).length){b(\"*\",this).add([this]).each(function(){try{b(this).triggerHandler(\"remove\")}catch(g){}})}}return a.call(b(this),e,f)})}}b.widget=function(f,h,e){var g=f.split(\".\")[0],j;f=f.split(\".\")[1];j=g+\"-\"+f;if(!e){e=h;h=b.Widget}b.expr[\":\"][j]=function(k){return !!b.data(k,f)};b[g]=b[g]||{};b[g][f]=function(k,l){if(arguments.length){this._createWidget(k,l)}};var i=new h();i.options=b.extend(true,{},i.options);b[g][f].prototype=b.extend(true,i,{namespace:g,widgetName:f,widgetEventPrefix:b[g][f].prototype.widgetEventPrefix||f,widgetBaseClass:j},e);b.widget.bridge(f,b[g][f])};b.widget.bridge=function(f,e){b.fn[f]=function(i){var g=typeof i===\"string\",h=Array.prototype.slice.call(arguments,1),j=this;i=!g&&h.length?b.extend.apply(null,[true,i].concat(h)):i;if(g&&i.charAt(0)===\"_\"){return j}if(g){this.each(function(){var k=b.data(this,f),l=k&&b.isFunction(k[i])?k[i].apply(k,h):k;if(l!==k&&l!==d){j=l;return false}})}else{this.each(function(){var k=b.data(this,f);if(k){k.option(i||{})._init()}else{b.data(this,f,new e(i,this))}})}return j}};b.Widget=function(e,f){if(arguments.length){this._createWidget(e,f)}};b.Widget.prototype={widgetName:\"widget\",widgetEventPrefix:\"\",options:{disabled:false},_createWidget:function(f,g){b.data(g,this.widgetName,this);this.element=b(g);this.options=b.extend(true,{},this.options,this._getCreateOptions(),f);var e=this;this.element.bind(\"remove.\"+this.widgetName,function(){e.destroy()});this._create();this._trigger(\"create\");this._init()},_getCreateOptions:function(){return b.metadata&&b.metadata.get(this.element[0])[this.widgetName]},_create:function(){},_init:function(){},destroy:function(){this.element.unbind(\".\"+this.widgetName).removeData(this.widgetName);this.widget().unbind(\".\"+this.widgetName).removeAttr(\"aria-disabled\").removeClass(this.widgetBaseClass+\"-disabled ui-state-disabled\")},widget:function(){return this.element},option:function(f,g){var e=f;if(arguments.length===0){return b.extend({},this.options)}if(typeof f===\"string\"){if(g===d){return this.options[f]}e={};e[f]=g}this._setOptions(e);return this},_setOptions:function(f){var e=this;b.each(f,function(g,h){e._setOption(g,h)});return this},_setOption:function(e,f){this.options[e]=f;if(e===\"disabled\"){this.widget()[f?\"addClass\":\"removeClass\"](this.widgetBaseClass+\"-disabled ui-state-disabled\").attr(\"aria-disabled\",f)}return this},enable:function(){return this._setOption(\"disabled\",false)},disable:function(){return this._setOption(\"disabled\",true)},_trigger:function(e,f,g){var j,i,h=this.options[e];g=g||{};f=b.Event(f);f.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase();f.target=this.element[0];i=f.originalEvent;if(i){for(j in i){if(!(j in f)){f[j]=i[j]}}}this.element.trigger(f,g);return !(b.isFunction(h)&&h.call(this.element[0],f,g)===false||f.isDefaultPrevented())}}})(jQuery);/*!\n"
 " * jQuery UI Mouse 1.8.18\n"
 " *\n"
 " * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)\n"
 " * Depends:\n"
 " *    jquery.ui.widget.js\n"
 " */\n"
-"(function(a,b){var c=!1;a(document).mouseup(function(a){c=!1}),a.widget(\"ui.mouse\",{options:{cancel:\":input,option\",distance:1,delay:0},_mouseInit:function(){var b=this;this.element.bind(\"mousedown.\"+this.widgetName,function(a){return b._mouseDown(a)}).bind(\"click.\"+this.widgetName,function(c){if(!0===a.data(c.target,b.widgetName+\".preventClickEvent\")){a.removeData(c.target,b.widgetName+\".preventClickEvent\"),c.stopImmediatePropagation();return!1}}),this.started=!1},_mouseDestroy:function(){this.element.unbind(\".\"+this.widgetName)},_mouseDown:function(b){if(!c){this._mouseStarted&&this._mouseUp(b),this._mouseDownEvent=b;var d=this,e=b.which==1,f=typeof this.options.cancel==\"string\"&&b.target.nodeName?a(b.target).closest(this.options.cancel).length:!1;if(!e||f||!this._mouseCapture(b))return!0;this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){d.mouseDelayMet=!0},this.options.delay));if(this._mouseDistanceMet(b)&&this._mouseDelayMet(b)){this._mouseStarted=this._mouseStart(b)!==!1;if(!this._mouseStarted){b.preventDefault();return!0}}!0===a.data(b.target,this.widgetName+\".preventClickEvent\")&&a.removeData(b.target,this.widgetName+\".preventClickEvent\"),this._mouseMoveDelegate=function(a){return d._mouseMove(a)},this._mouseUpDelegate=function(a){return d._mouseUp(a)},a(document).bind(\"mousemove.\"+this.widgetName,this._mouseMoveDelegate).bind(\"mouseup.\"+this.widgetName,this._mouseUpDelegate),b.preventDefault(),c=!0;return!0}},_mouseMove:function(b){if(a.browser.msie&&!(document.documentMode>=9)&&!b.button)return this._mouseUp(b);if(this._mouseStarted){this._mouseDrag(b);return b.preventDefault()}this._mouseDistanceMet(b)&&this._mouseDelayMet(b)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,b)!==!1,this._mouseStarted?this._mouseDrag(b):this._mouseUp(b));return!this._mouseStarted},_mouseUp:function(b){a(document).unbind(\"mousemove.\"+this.widgetName,this._mouseMoveDelegate).unbind(\"mouseup.\"+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,b.target==this._mouseDownEvent.target&&a.data(b.target,this.widgetName+\".preventClickEvent\",!0),this._mouseStop(b));return!1},_mouseDistanceMet:function(a){return Math.max(Math.abs(this._mouseDownEvent.pageX-a.pageX),Math.abs(this._mouseDownEvent.pageY-a.pageY))>=this.options.distance},_mouseDelayMet:function(a){return this.mouseDelayMet},_mouseStart:function(a){},_mouseDrag:function(a){},_mouseStop:function(a){},_mouseCapture:function(a){return!0}})})(jQuery);\n"
-"/*\n"
-" * jQuery UI Resizable 1.8.18\n"
-" *\n"
-" * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)\n"
-" * Dual licensed under the MIT or GPL Version 2 licenses.\n"
-" * http://jquery.org/license\n"
-" *\n"
-" * http://docs.jquery.com/UI/Resizables\n"
-" *\n"
-" * Depends:\n"
-" *    jquery.ui.core.js\n"
-" *    jquery.ui.mouse.js\n"
-" *    jquery.ui.widget.js\n"
-" */\n"
-"(function(a,b){a.widget(\"ui.resizable\",a.ui.mouse,{widgetEventPrefix:\"resize\",options:{alsoResize:!1,animate:!1,animateDuration:\"slow\",animateEasing:\"swing\",aspectRatio:!1,autoHide:!1,containment:!1,ghost:!1,grid:!1,handles:\"e,s,se\",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:1e3},_create:function(){var b=this,c=this.options;this.element.addClass(\"ui-resizable\"),a.extend(this,{_aspectRatio:!!c.aspectRatio,aspectRatio:c.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:c.helper||c.ghost||c.animate?c.helper||\"ui-resizable-helper\":null}),this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)&&(this.element.wrap(a('<div class=\"ui-wrapper\" style=\"overflow: hidden;\"></div>').css({position:this.element.css(\"position\"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css(\"top\"),left:this.element.css(\"left\")})),this.element=this.element.parent().data(\"resizable\",this.element.data(\"resizable\")),this.elementIsWrapper=!0,this.element.css({marginLeft:this.originalElement.css(\"marginLeft\"),marginTop:this.originalElement.css(\"marginTop\"),marginRight:this.originalElement.css(\"marginRight\"),marginBottom:this.originalElement.css(\"marginBottom\")}),this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0}),this.originalResizeStyle=this.originalElement.css(\"resize\"),this.originalElement.css(\"resize\",\"none\"),this._proportionallyResizeElements.push(this.originalElement.css({position:\"static\",zoom:1,display:\"block\"})),this.originalElement.css({margin:this.originalElement.css(\"margin\")}),this._proportionallyResize()),this.handles=c.handles||(a(\".ui-resizable-handle\",this.element).length?{n:\".ui-resizable-n\",e:\".ui-resizable-e\",s:\".ui-resizable-s\",w:\".ui-resizable-w\",se:\".ui-resizable-se\",sw:\".ui-resizable-sw\",ne:\".ui-resizable-ne\",nw:\".ui-resizable-nw\"}:\"e,s,se\");if(this.handles.constructor==String){this.handles==\"all\"&&(this.handles=\"n,e,s,w,se,sw,ne,nw\");var d=this.handles.split(\",\");this.handles={};for(var e=0;e<d.length;e++){var f=a.trim(d[e]),g=\"ui-resizable-\"+f,h=a('<div class=\"ui-resizable-handle '+g+'\"></div>');/sw|se|ne|nw/.test(f)&&h.css({zIndex:++c.zIndex}),\"se\"==f&&h.addClass(\"ui-icon ui-icon-gripsmall-diagonal-se\"),this.handles[f]=\".ui-resizable-\"+f,this.element.append(h)}}this._renderAxis=function(b){b=b||this.element;for(var c in this.handles){this.handles[c].constructor==String&&(this.handles[c]=a(this.handles[c],this.element).show());if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var d=a(this.handles[c],this.element),e=0;e=/sw|ne|nw|se|n|s/.test(c)?d.outerHeight():d.outerWidth();var f=[\"padding\",/ne|nw|n/.test(c)?\"Top\":/se|sw|s/.test(c)?\"Bottom\":/^e$/.test(c)?\"Right\":\"Left\"].join(\"\");b.css(f,e),this._proportionallyResize()}if(!a(this.handles[c]).length)continue}},this._renderAxis(this.element),this._handles=a(\".ui-resizable-handle\",this.element).disableSelection(),this._handles.mouseover(function(){if(!b.resizing){if(this.className)var a=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);b.axis=a&&a[1]?a[1]:\"se\"}}),c.autoHide&&(this._handles.hide(),a(this.element).addClass(\"ui-resizable-autohide\").hover(function(){c.disabled||(a(this).removeClass(\"ui-resizable-autohide\"),b._handles.show())},function(){c.disabled||b.resizing||(a(this).addClass(\"ui-resizable-autohide\"),b._handles.hide())})),this._mouseInit()},destroy:function(){this._mouseDestroy();var b=function(b){a(b).removeClass(\"ui-resizable ui-resizable-disabled ui-resizable-resizing\").removeData(\"resizable\").unbind(\".resizable\").find(\".ui-resizable-handle\").remove()};if(this.elementIsWrapper){b(this.element);var c=this.element;c.after(this.originalElement.css({position:c.css(\"position\"),width:c.outerWidth(),height:c.outerHeight(),top:c.css(\"top\"),left:c.css(\"left\")})).remove()}this.originalElement.css(\"resize\",this.originalResizeStyle),b(this.originalElement);return this},_mouseCapture:function(b){var c=!1;for(var d in this.handles)a(this.handles[d])[0]==b.target&&(c=!0);return!this.options.disabled&&c},_mouseStart:function(b){var d=this.options,e=this.element.position(),f=this.element;this.resizing=!0,this.documentScroll={top:a(document).scrollTop(),left:a(document).scrollLeft()},(f.is(\".ui-draggable\")||/absolute/.test(f.css(\"position\")))&&f.css({position:\"absolute\",top:e.top,left:e.left}),this._renderProxy();var g=c(this.helper.css(\"left\")),h=c(this.helper.css(\"top\"));d.containment&&(g+=a(d.containment).scrollLeft()||0,h+=a(d.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:g,top:h},this.size=this._helper?{width:f.outerWidth(),height:f.outerHeight()}:{width:f.width(),height:f.height()},this.originalSize=this._helper?{width:f.outerWidth(),height:f.outerHeight()}:{width:f.width(),height:f.height()},this.originalPosition={left:g,top:h},this.sizeDiff={width:f.outerWidth()-f.width(),height:f.outerHeight()-f.height()},this.originalMousePosition={left:b.pageX,top:b.pageY},this.aspectRatio=typeof d.aspectRatio==\"number\"?d.aspectRatio:this.originalSize.width/this.originalSize.height||1;var i=a(\".ui-resizable-\"+this.axis).css(\"cursor\");a(\"body\").css(\"cursor\",i==\"auto\"?this.axis+\"-resize\":i),f.addClass(\"ui-resizable-resizing\"),this._propagate(\"start\",b);return!0},_mouseDrag:function(b){var c=this.helper,d=this.options,e={},f=this,g=this.originalMousePosition,h=this.axis,i=b.pageX-g.left||0,j=b.pageY-g.top||0,k=this._change[h];if(!k)return!1;var l=k.apply(this,[b,i,j]),m=a.browser.msie&&a.browser.version<7,n=this.sizeDiff;this._updateVirtualBoundaries(b.shiftKey);if(this._aspectRatio||b.shiftKey)l=this._updateRatio(l,b);l=this._respectSize(l,b),this._propagate(\"resize\",b),c.css({top:this.position.top+\"px\",left:this.position.left+\"px\",width:this.size.width+\"px\",height:this.size.height+\"px\"}),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),this._updateCache(l),this._trigger(\"resize\",b,this.ui());return!1},_mouseStop:function(b){this.resizing=!1;var c=this.options,d=this;if(this._helper){var e=this._proportionallyResizeElements,f=e.length&&/textarea/i.test(e[0].nodeName),g=f&&a.ui.hasScroll(e[0],\"left\")?0:d.sizeDiff.height,h=f?0:d.sizeDiff.width,i={width:d.helper.width()-h,height:d.helper.height()-g},j=parseInt(d.element.css(\"left\"),10)+(d.position.left-d.originalPosition.left)||null,k=parseInt(d.element.css(\"top\"),10)+(d.position.top-d.originalPosition.top)||null;c.animate||this.element.css(a.extend(i,{top:k,left:j})),d.helper.height(d.size.height),d.helper.width(d.size.width),this._helper&&!c.animate&&this._proportionallyResize()}a(\"body\").css(\"cursor\",\"auto\"),this.element.removeClass(\"ui-resizable-resizing\"),this._propagate(\"stop\",b),this._helper&&this.helper.remove();return!1},_updateVirtualBoundaries:function(a){var b=this.options,c,e,f,g,h;h={minWidth:d(b.minWidth)?b.minWidth:0,maxWidth:d(b.maxWidth)?b.maxWidth:Infinity,minHeight:d(b.minHeight)?b.minHeight:0,maxHeight:d(b.maxHeight)?b.maxHeight:Infinity};if(this._aspectRatio||a)c=h.minHeight*this.aspectRatio,f=h.minWidth/this.aspectRatio,e=h.maxHeight*this.aspectRatio,g=h.maxWidth/this.aspectRatio,c>h.minWidth&&(h.minWidth=c),f>h.minHeight&&(h.minHeight=f),e<h.maxWidth&&(h.maxWidth=e),g<h.maxHeight&&(h.maxHeight=g);this._vBoundaries=h},_updateCache:function(a){var b=this.options;this.offset=this.helper.offset(),d(a.left)&&(this.position.left=a.left),d(a.top)&&(this.position.top=a.top),d(a.height)&&(this.size.height=a.height),d(a.width)&&(this.size.width=a.width)},_updateRatio:function(a,b){var c=this.options,e=this.position,f=this.size,g=this.axis;d(a.height)?a.width=a.height*this.aspectRatio:d(a.width)&&(a.height=a.width/this.aspectRatio),g==\"sw\"&&(a.left=e.left+(f.width-a.width),a.top=null),g==\"nw\"&&(a.top=e.top+(f.height-a.height),a.left=e.left+(f.width-a.width));return a},_respectSize:function(a,b){var c=this.helper,e=this._vBoundaries,f=this._aspectRatio||b.shiftKey,g=this.axis,h=d(a.width)&&e.maxWidth&&e.maxWidth<a.width,i=d(a.height)&&e.maxHeight&&e.maxHeight<a.height,j=d(a.width)&&e.minWidth&&e.minWidth>a.width,k=d(a.height)&&e.minHeight&&e.minHeight>a.height;j&&(a.width=e.minWidth),k&&(a.height=e.minHeight),h&&(a.width=e.maxWidth),i&&(a.height=e.maxHeight);var l=this.originalPosition.left+this.originalSize.width,m=this.position.top+this.size.height,n=/sw|nw|w/.test(g),o=/nw|ne|n/.test(g);j&&n&&(a.left=l-e.minWidth),h&&n&&(a.left=l-e.maxWidth),k&&o&&(a.top=m-e.minHeight),i&&o&&(a.top=m-e.maxHeight);var p=!a.width&&!a.height;p&&!a.left&&a.top?a.top=null:p&&!a.top&&a.left&&(a.left=null);return a},_proportionallyResize:function(){var b=this.options;if(!!this._proportionallyResizeElements.length){var c=this.helper||this.element;for(var d=0;d<this._proportionallyResizeElements.length;d++){var e=this._proportionallyResizeElements[d];if(!this.borderDif){var f=[e.css(\"borderTopWidth\"),e.css(\"borderRightWidth\"),e.css(\"borderBottomWidth\"),e.css(\"borderLeftWidth\")],g=[e.css(\"paddingTop\"),e.css(\"paddingRight\"),e.css(\"paddingBottom\"),e.css(\"paddingLeft\")];this.borderDif=a.map(f,function(a,b){var c=parseInt(a,10)||0,d=parseInt(g[b],10)||0;return c+d})}if(a.browser.msie&&(!!a(c).is(\":hidden\")||!!a(c).parents(\":hidden\").length))continue;e.css({height:c.height()-this.borderDif[0]-this.borderDif[2]||0,width:c.width()-this.borderDif[1]-this.borderDif[3]||0})}}},_renderProxy:function(){var b=this.element,c=this.options;this.elementOffset=b.offset();if(this._helper){this.helper=this.helper||a('<div style=\"overflow:hidden;\"></div>');var d=a.browser.msie&&a.browser.version<7,e=d?1:0,f=d?2:-1;this.helper.addClass(this._helper).css({width:this.element.outerWidth()+f,height:this.element.outerHeight()+f,position:\"absolute\",left:this.elementOffset.left-e+\"px\",top:this.elementOffset.top-e+\"px\",zIndex:++c.zIndex}),this.helper.appendTo(\"body\").disableSelection()}else this.helper=this.element},_change:{e:function(a,b,c){return{width:this.originalSize.width+b}},w:function(a,b,c){var d=this.options,e=this.originalSize,f=this.originalPosition;return{left:f.left+b,width:e.width-b}},n:function(a,b,c){var d=this.options,e=this.originalSize,f=this.originalPosition;return{top:f.top+c,height:e.height-c}},s:function(a,b,c){return{height:this.originalSize.height+c}},se:function(b,c,d){return a.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[b,c,d]))},sw:function(b,c,d){return a.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[b,c,d]))},ne:function(b,c,d){return a.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[b,c,d]))},nw:function(b,c,d){return a.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[b,c,d]))}},_propagate:function(b,c){a.ui.plugin.call(this,b,[c,this.ui()]),b!=\"resize\"&&this._trigger(b,c,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),a.extend(a.ui.resizable,{version:\"1.8.18\"}),a.ui.plugin.add(\"resizable\",\"alsoResize\",{start:function(b,c){var d=a(this).data(\"resizable\"),e=d.options,f=function(b){a(b).each(function(){var b=a(this);b.data(\"resizable-alsoresize\",{width:parseInt(b.width(),10),height:parseInt(b.height(),10),left:parseInt(b.css(\"left\"),10),top:parseInt(b.css(\"top\"),10)})})};typeof e.alsoResize==\"object\"&&!e.alsoResize.parentNode?e.alsoResize.length?(e.alsoResize=e.alsoResize[0],f(e.alsoResize)):a.each(e.alsoResize,function(a){f(a)}):f(e.alsoResize)},resize:function(b,c){var d=a(this).data(\"resizable\"),e=d.options,f=d.originalSize,g=d.originalPosition,h={height:d.size.height-f.height||0,width:d.size.width-f.width||0,top:d.position.top-g.top||0,left:d.position.left-g.left||0},i=function(b,d){a(b).each(function(){var b=a(this),e=a(this).data(\"resizable-alsoresize\"),f={},g=d&&d.length?d:b.parents(c.originalElement[0]).length?[\"width\",\"height\"]:[\"width\",\"height\",\"top\",\"left\"];a.each(g,function(a,b){var c=(e[b]||0)+(h[b]||0);c&&c>=0&&(f[b]=c||null)}),b.css(f)})};typeof e.alsoResize==\"object\"&&!e.alsoResize.nodeType?a.each(e.alsoResize,function(a,b){i(a,b)}):i(e.alsoResize)},stop:function(b,c){a(this).removeData(\"resizable-alsoresize\")}}),a.ui.plugin.add(\"resizable\",\"animate\",{stop:function(b,c){var d=a(this).data(\"resizable\"),e=d.options,f=d._proportionallyResizeElements,g=f.length&&/textarea/i.test(f[0].nodeName),h=g&&a.ui.hasScroll(f[0],\"left\")?0:d.sizeDiff.height,i=g?0:d.sizeDiff.width,j={width:d.size.width-i,height:d.size.height-h},k=parseInt(d.element.css(\"left\"),10)+(d.position.left-d.originalPosition.left)||null,l=parseInt(d.element.css(\"top\"),10)+(d.position.top-d.originalPosition.top)||null;d.element.animate(a.extend(j,l&&k?{top:l,left:k}:{}),{duration:e.animateDuration,easing:e.animateEasing,step:function(){var c={width:parseInt(d.element.css(\"width\"),10),height:parseInt(d.element.css(\"height\"),10),top:parseInt(d.element.css(\"top\"),10),left:parseInt(d.element.css(\"left\"),10)};f&&f.length&&a(f[0]).css({width:c.width,height:c.height}),d._updateCache(c),d._propagate(\"resize\",b)}})}}),a.ui.plugin.add(\"resizable\",\"containment\",{start:function(b,d){var e=a(this).data(\"resizable\"),f=e.options,g=e.element,h=f.containment,i=h instanceof a?h.get(0):/parent/.test(h)?g.parent().get(0):h;if(!!i){e.containerElement=a(i);if(/document/.test(h)||h==document)e.containerOffset={left:0,top:0},e.containerPosition={left:0,top:0},e.parentData={element:a(document),left:0,top:0,width:a(document).width(),height:a(document).height()||document.body.parentNode.scrollHeight};else{var j=a(i),k=[];a([\"Top\",\"Right\",\"Left\",\"Bottom\"]).each(function(a,b){k[a]=c(j.css(\"padding\"+b))}),e.containerOffset=j.offset(),e.containerPosition=j.position(),e.containerSize={height:j.innerHeight()-k[3],width:j.innerWidth()-k[1]};var l=e.containerOffset,m=e.containerSize.height,n=e.containerSize.width,o=a.ui.hasScroll(i,\"left\")?i.scrollWidth:n,p=a.ui.hasScroll(i)?i.scrollHeight:m;e.parentData={element:i,left:l.left,top:l.top,width:o,height:p}}}},resize:function(b,c){var d=a(this).data(\"resizable\"),e=d.options,f=d.containerSize,g=d.containerOffset,h=d.size,i=d.position,j=d._aspectRatio||b.shiftKey,k={top:0,left:0},l=d.containerElement;l[0]!=document&&/static/.test(l.css(\"position\"))&&(k=g),i.left<(d._helper?g.left:0)&&(d.size.width=d.size.width+(d._helper?d.position.left-g.left:d.position.left-k.left),j&&(d.size.height=d.size.width/e.aspectRatio),d.position.left=e.helper?g.left:0),i.top<(d._helper?g.top:0)&&(d.size.height=d.size.height+(d._helper?d.position.top-g.top:d.position.top),j&&(d.size.width=d.size.height*e.aspectRatio),d.position.top=d._helper?g.top:0),d.offset.left=d.parentData.left+d.position.left,d.offset.top=d.parentData.top+d.position.top;var m=Math.abs((d._helper?d.offset.left-k.left:d.offset.left-k.left)+d.sizeDiff.width),n=Math.abs((d._helper?d.offset.top-k.top:d.offset.top-g.top)+d.sizeDiff.height),o=d.containerElement.get(0)==d.element.parent().get(0),p=/relative|absolute/.test(d.containerElement.css(\"position\"));o&&p\n"
-"&&(m-=d.parentData.left),m+d.size.width>=d.parentData.width&&(d.size.width=d.parentData.width-m,j&&(d.size.height=d.size.width/d.aspectRatio)),n+d.size.height>=d.parentData.height&&(d.size.height=d.parentData.height-n,j&&(d.size.width=d.size.height*d.aspectRatio))},stop:function(b,c){var d=a(this).data(\"resizable\"),e=d.options,f=d.position,g=d.containerOffset,h=d.containerPosition,i=d.containerElement,j=a(d.helper),k=j.offset(),l=j.outerWidth()-d.sizeDiff.width,m=j.outerHeight()-d.sizeDiff.height;d._helper&&!e.animate&&/relative/.test(i.css(\"position\"))&&a(this).css({left:k.left-h.left-g.left,width:l,height:m}),d._helper&&!e.animate&&/static/.test(i.css(\"position\"))&&a(this).css({left:k.left-h.left-g.left,width:l,height:m})}}),a.ui.plugin.add(\"resizable\",\"ghost\",{start:function(b,c){var d=a(this).data(\"resizable\"),e=d.options,f=d.size;d.ghost=d.originalElement.clone(),d.ghost.css({opacity:.25,display:\"block\",position:\"relative\",height:f.height,width:f.width,margin:0,left:0,top:0}).addClass(\"ui-resizable-ghost\").addClass(typeof e.ghost==\"string\"?e.ghost:\"\"),d.ghost.appendTo(d.helper)},resize:function(b,c){var d=a(this).data(\"resizable\"),e=d.options;d.ghost&&d.ghost.css({position:\"relative\",height:d.size.height,width:d.size.width})},stop:function(b,c){var d=a(this).data(\"resizable\"),e=d.options;d.ghost&&d.helper&&d.helper.get(0).removeChild(d.ghost.get(0))}}),a.ui.plugin.add(\"resizable\",\"grid\",{resize:function(b,c){var d=a(this).data(\"resizable\"),e=d.options,f=d.size,g=d.originalSize,h=d.originalPosition,i=d.axis,j=e._aspectRatio||b.shiftKey;e.grid=typeof e.grid==\"number\"?[e.grid,e.grid]:e.grid;var k=Math.round((f.width-g.width)/(e.grid[0]||1))*(e.grid[0]||1),l=Math.round((f.height-g.height)/(e.grid[1]||1))*(e.grid[1]||1);/^(se|s|e)$/.test(i)?(d.size.width=g.width+k,d.size.height=g.height+l):/^(ne)$/.test(i)?(d.size.width=g.width+k,d.size.height=g.height+l,d.position.top=h.top-l):/^(sw)$/.test(i)?(d.size.width=g.width+k,d.size.height=g.height+l,d.position.left=h.left-k):(d.size.width=g.width+k,d.size.height=g.height+l,d.position.top=h.top-l,d.position.left=h.left-k)}});var c=function(a){return parseInt(a,10)||0},d=function(a){return!isNaN(parseInt(a,10))}})(jQuery);\n"
-"/*\n"
+"(function(b,c){var a=false;b(document).mouseup(function(d){a=false});b.widget(\"ui.mouse\",{options:{cancel:\":input,option\",distance:1,delay:0},_mouseInit:function(){var d=this;this.element.bind(\"mousedown.\"+this.widgetName,function(e){return d._mouseDown(e)}).bind(\"click.\"+this.widgetName,function(e){if(true===b.data(e.target,d.widgetName+\".preventClickEvent\")){b.removeData(e.target,d.widgetName+\".preventClickEvent\");e.stopImmediatePropagation();return false}});this.started=false},_mouseDestroy:function(){this.element.unbind(\".\"+this.widgetName)},_mouseDown:function(f){if(a){return}(this._mouseStarted&&this._mouseUp(f));this._mouseDownEvent=f;var e=this,g=(f.which==1),d=(typeof this.options.cancel==\"string\"&&f.target.nodeName?b(f.target).closest(this.options.cancel).length:false);if(!g||d||!this._mouseCapture(f)){return true}this.mouseDelayMet=!this.options.delay;if(!this.mouseDelayMet){this._mouseDelayTimer=setTimeout(function(){e.mouseDelayMet=true},this.options.delay)}if(this._mouseDistanceMet(f)&&this._mouseDelayMet(f)){this._mouseStarted=(this._mouseStart(f)!==false);if(!this._mouseStarted){f.preventDefault();return true}}if(true===b.data(f.target,this.widgetName+\".preventClickEvent\")){b.removeData(f.target,this.widgetName+\".preventClickEvent\")}this._mouseMoveDelegate=function(h){return e._mouseMove(h)};this._mouseUpDelegate=function(h){return e._mouseUp(h)};b(document).bind(\"mousemove.\"+this.widgetName,this._mouseMoveDelegate).bind(\"mouseup.\"+this.widgetName,this._mouseUpDelegate);f.preventDefault();a=true;return true},_mouseMove:function(d){if(b.browser.msie&&!(document.documentMode>=9)&&!d.button){return this._mouseUp(d)}if(this._mouseStarted){this._mouseDrag(d);return d.preventDefault()}if(this._mouseDistanceMet(d)&&this._mouseDelayMet(d)){this._mouseStarted=(this._mouseStart(this._mouseDownEvent,d)!==false);(this._mouseStarted?this._mouseDrag(d):this._mouseUp(d))}return !this._mouseStarted},_mouseUp:function(d){b(document).unbind(\"mousemove.\"+this.widgetName,this._mouseMoveDelegate).unbind(\"mouseup.\"+this.widgetName,this._mouseUpDelegate);if(this._mouseStarted){this._mouseStarted=false;if(d.target==this._mouseDownEvent.target){b.data(d.target,this.widgetName+\".preventClickEvent\",true)}this._mouseStop(d)}return false},_mouseDistanceMet:function(d){return(Math.max(Math.abs(this._mouseDownEvent.pageX-d.pageX),Math.abs(this._mouseDownEvent.pageY-d.pageY))>=this.options.distance)},_mouseDelayMet:function(d){return this.mouseDelayMet},_mouseStart:function(d){},_mouseDrag:function(d){},_mouseStop:function(d){},_mouseCapture:function(d){return true}})})(jQuery);(function(c,d){c.widget(\"ui.resizable\",c.ui.mouse,{widgetEventPrefix:\"resize\",options:{alsoResize:false,animate:false,animateDuration:\"slow\",animateEasing:\"swing\",aspectRatio:false,autoHide:false,containment:false,ghost:false,grid:false,handles:\"e,s,se\",helper:false,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:1000},_create:function(){var f=this,k=this.options;this.element.addClass(\"ui-resizable\");c.extend(this,{_aspectRatio:!!(k.aspectRatio),aspectRatio:k.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:k.helper||k.ghost||k.animate?k.helper||\"ui-resizable-helper\":null});if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)){this.element.wrap(c('<div class=\"ui-wrapper\" style=\"overflow: hidden;\"></div>').css({position:this.element.css(\"position\"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css(\"top\"),left:this.element.css(\"left\")}));this.element=this.element.parent().data(\"resizable\",this.element.data(\"resizable\"));this.elementIsWrapper=true;this.element.css({marginLeft:this.originalElement.css(\"marginLeft\"),marginTop:this.originalElement.css(\"marginTop\"),marginRight:this.originalElement.css(\"marginRight\"),marginBottom:this.originalElement.css(\"marginBottom\")});this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0});this.originalResizeStyle=this.originalElement.css(\"resize\");this.originalElement.css(\"resize\",\"none\");this._proportionallyResizeElements.push(this.originalElement.css({position:\"static\",zoom:1,display:\"block\"}));this.originalElement.css({margin:this.originalElement.css(\"margin\")});this._proportionallyResize()}this.handles=k.handles||(!c(\".ui-resizable-handle\",this.element).length?\"e,s,se\":{n:\".ui-resizable-n\",e:\".ui-resizable-e\",s:\".ui-resizable-s\",w:\".ui-resizable-w\",se:\".ui-resizable-se\",sw:\".ui-resizable-sw\",ne:\".ui-resizable-ne\",nw:\".ui-resizable-nw\"});if(this.handles.constructor==String){if(this.handles==\"all\"){this.handles=\"n,e,s,w,se,sw,ne,nw\"}var l=this.handles.split(\",\");this.handles={};for(var g=0;g<l.length;g++){var j=c.trim(l[g]),e=\"ui-resizable-\"+j;var h=c('<div class=\"ui-resizable-handle '+e+'\"></div>');if(/sw|se|ne|nw/.test(j)){h.css({zIndex:++k.zIndex})}if(\"se\"==j){h.addClass(\"ui-icon ui-icon-gripsmall-diagonal-se\")}this.handles[j]=\".ui-resizable-\"+j;this.element.append(h)}}this._renderAxis=function(q){q=q||this.element;for(var n in this.handles){if(this.handles[n].constructor==String){this.handles[n]=c(this.handles[n],this.element).show()}if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var o=c(this.handles[n],this.element),p=0;p=/sw|ne|nw|se|n|s/.test(n)?o.outerHeight():o.outerWidth();var m=[\"padding\",/ne|nw|n/.test(n)?\"Top\":/se|sw|s/.test(n)?\"Bottom\":/^e$/.test(n)?\"Right\":\"Left\"].join(\"\");q.css(m,p);this._proportionallyResize()}if(!c(this.handles[n]).length){continue}}};this._renderAxis(this.element);this._handles=c(\".ui-resizable-handle\",this.element).disableSelection();this._handles.mouseover(function(){if(!f.resizing){if(this.className){var i=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)}f.axis=i&&i[1]?i[1]:\"se\"}});if(k.autoHide){this._handles.hide();c(this.element).addClass(\"ui-resizable-autohide\").hover(function(){if(k.disabled){return}c(this).removeClass(\"ui-resizable-autohide\");f._handles.show()},function(){if(k.disabled){return}if(!f.resizing){c(this).addClass(\"ui-resizable-autohide\");f._handles.hide()}})}this._mouseInit()},destroy:function(){this._mouseDestroy();var e=function(g){c(g).removeClass(\"ui-resizable ui-resizable-disabled ui-resizable-resizing\").removeData(\"resizable\").unbind(\".resizable\").find(\".ui-resizable-handle\").remove()};if(this.elementIsWrapper){e(this.element);var f=this.element;f.after(this.originalElement.css({position:f.css(\"position\"),width:f.outerWidth(),height:f.outerHeight(),top:f.css(\"top\"),left:f.css(\"left\")})).remove()}this.originalElement.css(\"resize\",this.originalResizeStyle);e(this.originalElement);return this},_mouseCapture:function(f){var g=false;for(var e in this.handles){if(c(this.handles[e])[0]==f.target){g=true}}return !this.options.disabled&&g},_mouseStart:function(g){var j=this.options,f=this.element.position(),e=this.element;this.resizing=true;this.documentScroll={top:c(document).scrollTop(),left:c(document).scrollLeft()};if(e.is(\".ui-draggable\")||(/absolute/).test(e.css(\"position\"))){e.css({position:\"absolute\",top:f.top,left:f.left})}this._renderProxy();var k=b(this.helper.css(\"left\")),h=b(this.helper.css(\"top\"));if(j.containment){k+=c(j.containment).scrollLeft()||0;h+=c(j.containment).scrollTop()||0}this.offset=this.helper.offset();this.position={left:k,top:h};this.size=this._helper?{width:e.outerWidth(),height:e.outerHeight()}:{width:e.width(),height:e.height()};this.originalSize=this._helper?{width:e.outerWidth(),height:e.outerHeight()}:{width:e.width(),height:e.height()};this.originalPosition={left:k,top:h};this.sizeDiff={width:e.outerWidth()-e.width(),height:e.outerHeight()-e.height()};this.originalMousePosition={left:g.pageX,top:g.pageY};this.aspectRatio=(typeof j.aspectRatio==\"number\")?j.aspectRatio:((this.originalSize.width/this.originalSize.height)||1);var i=c(\".ui-resizable-\"+this.axis).css(\"cursor\");c(\"body\").css(\"cursor\",i==\"auto\"?this.axis+\"-resize\":i);e.addClass(\"ui-resizable-resizing\");this._propagate(\"start\",g);return true},_mouseDrag:function(e){var h=this.helper,g=this.options,m={},q=this,j=this.originalMousePosition,n=this.axis;var r=(e.pageX-j.left)||0,p=(e.pageY-j.top)||0;var i=this._change[n];if(!i){return false}var l=i.apply(this,[e,r,p]),k=c.browser.msie&&c.browser.version<7,f=this.sizeDiff;this._updateVirtualBoundaries(e.shiftKey);if(this._aspectRatio||e.shiftKey){l=this._updateRatio(l,e)}l=this._respectSize(l,e);this._propagate(\"resize\",e);h.css({top:this.position.top+\"px\",left:this.position.left+\"px\",width:this.size.width+\"px\",height:this.size.height+\"px\"});if(!this._helper&&this._proportionallyResizeElements.length){this._proportionallyResize()}this._updateCache(l);this._trigger(\"resize\",e,this.ui());return false},_mouseStop:function(h){this.resizing=false;var i=this.options,m=this;if(this._helper){var g=this._proportionallyResizeElements,e=g.length&&(/textarea/i).test(g[0].nodeName),f=e&&c.ui.hasScroll(g[0],\"left\")?0:m.sizeDiff.height,k=e?0:m.sizeDiff.width;var n={width:(m.helper.width()-k),height:(m.helper.height()-f)},j=(parseInt(m.element.css(\"left\"),10)+(m.position.left-m.originalPosition.left))||null,l=(parseInt(m.element.css(\"top\"),10)+(m.position.top-m.originalPosition.top))||null;if(!i.animate){this.element.css(c.extend(n,{top:l,left:j}))}m.helper.height(m.size.height);m.helper.width(m.size.width);if(this._helper&&!i.animate){this._proportionallyResize()}}c(\"body\").css(\"cursor\",\"auto\");this.element.removeClass(\"ui-resizable-resizing\");this._propagate(\"stop\",h);if(this._helper){this.helper.remove()}return false},_updateVirtualBoundaries:function(g){var j=this.options,i,h,f,k,e;e={minWidth:a(j.minWidth)?j.minWidth:0,maxWidth:a(j.maxWidth)?j.maxWidth:Infinity,minHeight:a(j.minHeight)?j.minHeight:0,maxHeight:a(j.maxHeight)?j.maxHeight:Infinity};if(this._aspectRatio||g){i=e.minHeight*this.aspectRatio;f=e.minWidth/this.aspectRatio;h=e.maxHeight*this.aspectRatio;k=e.maxWidth/this.aspectRatio;if(i>e.minWidth){e.minWidth=i}if(f>e.minHeight){e.minHeight=f}if(h<e.maxWidth){e.maxWidth=h}if(k<e.maxHeight){e.maxHeight=k}}this._vBoundaries=e},_updateCache:function(e){var f=this.options;this.offset=this.helper.offset();if(a(e.left)){this.position.left=e.left}if(a(e.top)){this.position.top=e.top}if(a(e.height)){this.size.height=e.height}if(a(e.width)){this.size.width=e.width}},_updateRatio:function(h,g){var i=this.options,j=this.position,f=this.size,e=this.axis;if(a(h.height)){h.width=(h.height*this.aspectRatio)}else{if(a(h.width)){h.height=(h.width/this.aspectRatio)}}if(e==\"sw\"){h.left=j.left+(f.width-h.width);h.top=null}if(e==\"nw\"){h.top=j.top+(f.height-h.height);h.left=j.left+(f.width-h.width)}return h},_respectSize:function(l,g){var j=this.helper,i=this._vBoundaries,r=this._aspectRatio||g.shiftKey,q=this.axis,t=a(l.width)&&i.maxWidth&&(i.maxWidth<l.width),m=a(l.height)&&i.maxHeight&&(i.maxHeight<l.height),h=a(l.width)&&i.minWidth&&(i.minWidth>l.width),s=a(l.height)&&i.minHeight&&(i.minHeight>l.height);if(h){l.width=i.minWidth}if(s){l.height=i.minHeight}if(t){l.width=i.maxWidth}if(m){l.height=i.maxHeight}var f=this.originalPosition.left+this.originalSize.width,p=this.position.top+this.size.height;var k=/sw|nw|w/.test(q),e=/nw|ne|n/.test(q);if(h&&k){l.left=f-i.minWidth}if(t&&k){l.left=f-i.maxWidth}if(s&&e){l.top=p-i.minHeight}if(m&&e){l.top=p-i.maxHeight}var n=!l.width&&!l.height;if(n&&!l.left&&l.top){l.top=null}else{if(n&&!l.top&&l.left){l.left=null}}return l},_proportionallyResize:function(){var k=this.options;if(!this._proportionallyResizeElements.length){return}var g=this.helper||this.element;for(var f=0;f<this._proportionallyResizeElements.length;f++){var h=this._proportionallyResizeElements[f];if(!this.borderDif){var e=[h.css(\"borderTopWidth\"),h.css(\"borderRightWidth\"),h.css(\"borderBottomWidth\"),h.css(\"borderLeftWidth\")],j=[h.css(\"paddingTop\"),h.css(\"paddingRight\"),h.css(\"paddingBottom\"),h.css(\"paddingLeft\")];this.borderDif=c.map(e,function(l,n){var m=parseInt(l,10)||0,o=parseInt(j[n],10)||0;return m+o})}if(c.browser.msie&&!(!(c(g).is(\":hidden\")||c(g).parents(\":hidden\").length))){continue}h.css({height:(g.height()-this.borderDif[0]-this.borderDif[2])||0,width:(g.width()-this.borderDif[1]-this.borderDif[3])||0})}},_renderProxy:function(){var f=this.element,i=this.options;this.elementOffset=f.offset();if(this._helper){this.helper=this.helper||c('<div style=\"overflow:hidden;\"></div>');var e=c.browser.msie&&c.browser.version<7,g=(e?1:0),h=(e?2:-1);this.helper.addClass(this._helper).css({width:this.element.outerWidth()+h,height:this.element.outerHeight()+h,position:\"absolute\",left:this.elementOffset.left-g+\"px\",top:this.elementOffset.top-g+\"px\",zIndex:++i.zIndex});this.helper.appendTo(\"body\").disableSelection()}else{this.helper=this.element}},_change:{e:function(g,f,e){return{width:this.originalSize.width+f}},w:function(h,f,e){var j=this.options,g=this.originalSize,i=this.originalPosition;return{left:i.left+f,width:g.width-f}},n:function(h,f,e){var j=this.options,g=this.originalSize,i=this.originalPosition;return{top:i.top+e,height:g.height-e}},s:function(g,f,e){return{height:this.originalSize.height+e}},se:function(g,f,e){return c.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[g,f,e]))},sw:function(g,f,e){return c.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[g,f,e]))},ne:function(g,f,e){return c.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[g,f,e]))},nw:function(g,f,e){return c.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[g,f,e]))}},_propagate:function(f,e){c.ui.plugin.call(this,f,[e,this.ui()]);(f!=\"resize\"&&this._trigger(f,e,this.ui()))},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}});c.extend(c.ui.resizable,{version:\"1.8.18\"});c.ui.plugin.add(\"resizable\",\"alsoResize\",{start:function(f,g){var e=c(this).data(\"resizable\"),i=e.options;var h=function(j){c(j).each(function(){var k=c(this);k.data(\"resizable-alsoresize\",{width:parseInt(k.width(),10),height:parseInt(k.height(),10),left:parseInt(k.css(\"left\"),10),top:parseInt(k.css(\"top\"),10)})})};if(typeof(i.alsoResize)==\"object\"&&!i.alsoResize.parentNode){if(i.alsoResize.length){i.alsoResize=i.alsoResize[0];h(i.alsoResize)}else{c.each(i.alsoResize,function(j){h(j)})}}else{h(i.alsoResize)}},resize:function(g,i){var f=c(this).data(\"resizable\"),j=f.options,h=f.originalSize,l=f.originalPosition;var k={height:(f.size.height-h.height)||0,width:(f.size.width-h.width)||0,top:(f.position.top-l.top)||0,left:(f.position.left-l.left)||0},e=function(m,n){c(m).each(function(){var q=c(this),r=c(this).data(\"resizable-alsoresize\"),p={},o=n&&n.length?n:q.parents(i.originalElement[0]).length?[\"width\",\"height\"]:[\"width\",\"height\",\"top\",\"left\"];c.each(o,function(s,u){var t=(r[u]||0)+(k[u]||0);if(t&&t>=0){p[u]=t||null}});q.css(p)})};if(typeof(j.alsoResize)==\"object\"&&!j.alsoResize.nodeType){c.each(j.alsoResize,function(m,n){e(m,n)})}else{e(j.alsoResize)}},stop:function(e,f){c(this).removeData(\"resizable-alsoresize\")}});c.ui.plugin.add(\"resizable\",\"animate\",{stop:function(i,n){var p=c(this).data(\"resizable\"),j=p.options;var h=p._proportionallyResizeElements,e=h.length&&(/textarea/i).test(h[0].nodeName),f=e&&c.ui.hasScroll(h[0],\"left\")?0:p.sizeDiff.height,l=e?0:p.sizeDiff.width;var g={width:(p.size.width-l),height:(p.size.height-f)},k=(parseInt(p.element.css(\"left\"),10)+(p.position.left-p.originalPosition.left))||null,m=(parseInt(p.element.css(\"top\"),10)+(p.position.top-p.originalPosition.top))||null;\n"
+"p.element.animate(c.extend(g,m&&k?{top:m,left:k}:{}),{duration:j.animateDuration,easing:j.animateEasing,step:function(){var o={width:parseInt(p.element.css(\"width\"),10),height:parseInt(p.element.css(\"height\"),10),top:parseInt(p.element.css(\"top\"),10),left:parseInt(p.element.css(\"left\"),10)};if(h&&h.length){c(h[0]).css({width:o.width,height:o.height})}p._updateCache(o);p._propagate(\"resize\",i)}})}});c.ui.plugin.add(\"resizable\",\"containment\",{start:function(f,r){var t=c(this).data(\"resizable\"),j=t.options,l=t.element;var g=j.containment,k=(g instanceof c)?g.get(0):(/parent/.test(g))?l.parent().get(0):g;if(!k){return}t.containerElement=c(k);if(/document/.test(g)||g==document){t.containerOffset={left:0,top:0};t.containerPosition={left:0,top:0};t.parentData={element:c(document),left:0,top:0,width:c(document).width(),height:c(document).height()||document.body.parentNode.scrollHeight}}else{var n=c(k),i=[];c([\"Top\",\"Right\",\"Left\",\"Bottom\"]).each(function(p,o){i[p]=b(n.css(\"padding\"+o))});t.containerOffset=n.offset();t.containerPosition=n.position();t.containerSize={height:(n.innerHeight()-i[3]),width:(n.innerWidth()-i[1])};var q=t.containerOffset,e=t.containerSize.height,m=t.containerSize.width,h=(c.ui.hasScroll(k,\"left\")?k.scrollWidth:m),s=(c.ui.hasScroll(k)?k.scrollHeight:e);t.parentData={element:k,left:q.left,top:q.top,width:h,height:s}}},resize:function(g,q){var t=c(this).data(\"resizable\"),i=t.options,f=t.containerSize,p=t.containerOffset,m=t.size,n=t.position,r=t._aspectRatio||g.shiftKey,e={top:0,left:0},h=t.containerElement;if(h[0]!=document&&(/static/).test(h.css(\"position\"))){e=p}if(n.left<(t._helper?p.left:0)){t.size.width=t.size.width+(t._helper?(t.position.left-p.left):(t.position.left-e.left));if(r){t.size.height=t.size.width/i.aspectRatio}t.position.left=i.helper?p.left:0}if(n.top<(t._helper?p.top:0)){t.size.height=t.size.height+(t._helper?(t.position.top-p.top):t.position.top);if(r){t.size.width=t.size.height*i.aspectRatio}t.position.top=t._helper?p.top:0}t.offset.left=t.parentData.left+t.position.left;t.offset.top=t.parentData.top+t.position.top;var l=Math.abs((t._helper?t.offset.left-e.left:(t.offset.left-e.left))+t.sizeDiff.width),s=Math.abs((t._helper?t.offset.top-e.top:(t.offset.top-p.top))+t.sizeDiff.height);var k=t.containerElement.get(0)==t.element.parent().get(0),j=/relative|absolute/.test(t.containerElement.css(\"position\"));if(k&&j){l-=t.parentData.left}if(l+t.size.width>=t.parentData.width){t.size.width=t.parentData.width-l;if(r){t.size.height=t.size.width/t.aspectRatio}}if(s+t.size.height>=t.parentData.height){t.size.height=t.parentData.height-s;if(r){t.size.width=t.size.height*t.aspectRatio}}},stop:function(f,n){var q=c(this).data(\"resizable\"),g=q.options,l=q.position,m=q.containerOffset,e=q.containerPosition,i=q.containerElement;var j=c(q.helper),r=j.offset(),p=j.outerWidth()-q.sizeDiff.width,k=j.outerHeight()-q.sizeDiff.height;if(q._helper&&!g.animate&&(/relative/).test(i.css(\"position\"))){c(this).css({left:r.left-e.left-m.left,width:p,height:k})}if(q._helper&&!g.animate&&(/static/).test(i.css(\"position\"))){c(this).css({left:r.left-e.left-m.left,width:p,height:k})}}});c.ui.plugin.add(\"resizable\",\"ghost\",{start:function(g,h){var e=c(this).data(\"resizable\"),i=e.options,f=e.size;e.ghost=e.originalElement.clone();e.ghost.css({opacity:0.25,display:\"block\",position:\"relative\",height:f.height,width:f.width,margin:0,left:0,top:0}).addClass(\"ui-resizable-ghost\").addClass(typeof i.ghost==\"string\"?i.ghost:\"\");e.ghost.appendTo(e.helper)},resize:function(f,g){var e=c(this).data(\"resizable\"),h=e.options;if(e.ghost){e.ghost.css({position:\"relative\",height:e.size.height,width:e.size.width})}},stop:function(f,g){var e=c(this).data(\"resizable\"),h=e.options;if(e.ghost&&e.helper){e.helper.get(0).removeChild(e.ghost.get(0))}}});c.ui.plugin.add(\"resizable\",\"grid\",{resize:function(e,m){var p=c(this).data(\"resizable\"),h=p.options,k=p.size,i=p.originalSize,j=p.originalPosition,n=p.axis,l=h._aspectRatio||e.shiftKey;h.grid=typeof h.grid==\"number\"?[h.grid,h.grid]:h.grid;var g=Math.round((k.width-i.width)/(h.grid[0]||1))*(h.grid[0]||1),f=Math.round((k.height-i.height)/(h.grid[1]||1))*(h.grid[1]||1);if(/^(se|s|e)$/.test(n)){p.size.width=i.width+g;p.size.height=i.height+f}else{if(/^(ne)$/.test(n)){p.size.width=i.width+g;p.size.height=i.height+f;p.position.top=j.top-f}else{if(/^(sw)$/.test(n)){p.size.width=i.width+g;p.size.height=i.height+f;p.position.left=j.left-g}else{p.size.width=i.width+g;p.size.height=i.height+f;p.position.top=j.top-f;p.position.left=j.left-g}}}}});var b=function(e){return parseInt(e,10)||0};var a=function(e){return !isNaN(parseInt(e,10))}})(jQuery);/*!\n"
 " * jQuery hashchange event - v1.3 - 7/21/2010\n"
 " * http://benalman.com/projects/jquery-hashchange-plugin/\n"
 " * \n"
index d7a95ca..1037d7f 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
 #ifdef LANG_LT
 #include "translator_lt.h"
 #endif
+#ifdef LANG_LV
+#include "translator_lv.h"
+#endif
 #ifdef LANG_ZA
 #include "translator_za.h"
 #endif
 #endif
 #endif // !ENGLISH_ONLY
 
-#define L_EQUAL(a) !stricmp(langName,a)
+#define L_EQUAL(a) !qstricmp(langName,a)
 
 Translator *theTranslator=0;
 
@@ -336,7 +339,7 @@ bool setTranslator(const char *langName)
 #ifdef LANG_UA
   else if (L_EQUAL("ukrainian"))
   {
-    theTranslator=new TranslatorDecoder(new TranslatorUkrainian);
+    theTranslator=new TranslatorUkrainian;
   }
 #endif
 #ifdef LANG_GR
@@ -369,6 +372,12 @@ bool setTranslator(const char *langName)
     theTranslator=new TranslatorDecoder(new TranslatorLithuanian);
   }
 #endif
+#ifdef LANG_LV
+  else if (L_EQUAL("latvian"))
+  {
+    theTranslator=new TranslatorDecoder(new TranslatorLatvian);
+  }
+#endif
 #ifdef LANG_ZA
   else if (L_EQUAL("afrikaans"))
   {
@@ -378,7 +387,7 @@ bool setTranslator(const char *langName)
 #ifdef LANG_AR
   else if (L_EQUAL("arabic"))
   {
-    theTranslator=new TranslatorDecoder(new TranslatorArabic);
+    theTranslator=new TranslatorArabic;
   }
 #endif
 #ifdef LANG_FA
@@ -419,6 +428,6 @@ bool setTranslator(const char *langName)
   }
   
   QCString msg = theTranslator->updateNeededMessage();
-  if (!msg.isEmpty()) err(msg);
+  if (!msg.isEmpty()) warn_uncond(msg);
   return TRUE;
 }
index 17f5800..9550cb9 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index f3610a3..0a96530 100644 (file)
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -15,6 +15,7 @@
  * input used in their production; they are not affected by this license.
  *
  */
+#include "htmlattrib.h"
 #include <qfileinfo.h> 
 #include "latexdocvisitor.h"
 #include "docparser.h"
@@ -26,7 +27,6 @@
 #include "message.h"
 #include "parserintf.h"
 #include "msc.h"
-#include "htmlattrib.h"
 #include "cite.h"
 #include "filedef.h"
 #include "config.h"
@@ -257,7 +257,7 @@ void LatexDocVisitor::visit(DocSymbol *s)
     case DocSymbol::LeftFloor:     m_t << "{$\\lfloor$}"; break;
     case DocSymbol::RightFloor:    m_t << "{$\\rfloor$}"; break;
     default:
-                             err("error: unknown symbol found\n");
+                             err("unknown symbol found\n");
   }
 }
 
@@ -358,7 +358,8 @@ void LatexDocVisitor::visit(DocVerbatim *s)
     case DocVerbatim::HtmlOnly: 
     case DocVerbatim::XmlOnly: 
     case DocVerbatim::ManOnly: 
-    case DocVerbatim::RtfOnly: 
+    case DocVerbatim::RtfOnly:
+    case DocVerbatim::DocbookOnly:
       /* nothing */ 
       break;
     case DocVerbatim::LatexOnly: 
@@ -423,10 +424,10 @@ void LatexDocVisitor::visit(DocVerbatim *s)
 void LatexDocVisitor::visit(DocAnchor *anc)
 {
   if (m_hide) return;
-  m_t << "\\label{" << anc->file() << "_" << anc->anchor() << "}%" << endl;
+  m_t << "\\label{" << stripPath(anc->file()) << "_" << anc->anchor() << "}%" << endl;
   if (!anc->file().isEmpty() && Config_getBool("PDF_HYPERLINKS")) 
   {
-    m_t << "\\hypertarget{" << anc->file() << "_" << anc->anchor() 
+    m_t << "\\hypertarget{" << stripPath(anc->file()) << "_" << anc->anchor() 
       << "}{}%" << endl;
   }    
 }
@@ -797,11 +798,11 @@ void LatexDocVisitor::visitPre(DocSection *s)
   if (m_hide) return;
   if (Config_getBool("PDF_HYPERLINKS"))
   {
-    m_t << "\\hypertarget{" << s->file() << "_" << s->anchor() << "}{}";
+    m_t << "\\hypertarget{" << stripPath(s->file()) << "_" << s->anchor() << "}{}";
   }
   m_t << "\\" << getSectionName(s->level()) << "{";
   filter(convertCharEntitiesToUTF8(s->title().data()));
-  m_t << "}\\label{" << s->file() << "_" << s->anchor() << "}" << endl;
+  m_t << "}\\label{" << stripPath(s->file()) << "_" << s->anchor() << "}" << endl;
 }
 
 void LatexDocVisitor::visitPost(DocSection *) 
@@ -1665,7 +1666,16 @@ void LatexDocVisitor::startDotFile(const QCString &fileName,
   {
     m_t << "[width=\\textwidth,height=\\textheight/2,keepaspectratio=true]";
   }
-  m_t << "{" << baseName << "}";
+  m_t << "{" << baseName;
+  //if (Config_getBool("USE_PDFLATEX"))
+  //{
+  //  m_t << ".pdf";
+  //}
+  //else
+  //{
+  //  m_t << ".eps";
+  //}
+  m_t << "}";
 
   if (hasCaption)
   {
@@ -1729,7 +1739,16 @@ void LatexDocVisitor::startMscFile(const QCString &fileName,
   {
     m_t << "[width=\\textwidth,height=\\textheight/2,keepaspectratio=true]";
   }
-  m_t << "{" << baseName << "}";
+  m_t << "{" << baseName;
+  //if (Config_getBool("USE_PDFLATEX"))
+  //{
+  //  m_t << ".pdf";
+  //}
+  //else
+  //{
+  //  m_t << ".eps";
+  //}
+  m_t << "}";
 
   if (hasCaption)
   {
index 4745800..3fea33c 100644 (file)
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 8a7555d..1434dca 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
 #include "namespacedef.h"
 #include "filename.h"
 
+static const char doxygenLatexStyle[] =
+#include "doxygen_sty.h"
+;
+
 //static QCString filterTitle(const char *s)
 //{
 //  QCString tmp=s,result;
@@ -128,7 +132,9 @@ static void writeLatexMakefile()
       << "\t      echo \"Rerunning latex....\" ;\\" << endl
       << "\t      " << latex_command << " refman.tex ;\\" << endl
       << "\t      latex_count=`expr $$latex_count - 1` ;\\" << endl
-      << "\t    done" << endl << endl
+      << "\t    done" << endl
+      << "\t" << mkidx_command << " refman.idx" << endl
+      << "\t" << latex_command << " refman.tex" << endl << endl
       << "refman_2on1.ps: refman.ps" << endl
       << "\tpsnup -2 refman.ps >refman_2on1.ps" << endl
       << endl
@@ -154,7 +160,9 @@ static void writeLatexMakefile()
       << "\t      echo \"Rerunning latex....\" ;\\" << endl
       << "\t      pdflatex refman ;\\" << endl
       << "\t      latex_count=`expr $$latex_count - 1` ;\\" << endl
-      << "\t    done" << endl << endl;
+      << "\t    done" << endl
+      << "\t" << mkidx_command << " refman.idx" << endl
+      << "\tpdflatex refman" << endl << endl;
   }
 
   t << endl
@@ -204,6 +212,8 @@ static void writeMakeBat()
     t << "goto :repeat\n";
     t << ":skip\n";
     t << "endlocal\n";
+    t << mkidx_command << " refman.idx\n";
+    t << latex_command << " refman.tex\n";
     t << "dvips -o refman.ps refman.dvi\n";
     t << "gswin32c -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite "
          "-sOutputFile=refman.pdf -c save pop -f refman.ps\n";
@@ -234,6 +244,8 @@ static void writeMakeBat()
     t << "goto :repeat\n";
     t << ":skip\n";
     t << "endlocal\n";
+    t << mkidx_command << " refman.idx\n";
+    t << "pdflatex refman\n";
   }
 #endif
 }
@@ -259,699 +271,263 @@ static void writeDefaultHeaderPart1(FTextStream &t)
 {
   // part 1
 
+  // Handle batch mode
+  if (Config_getBool("LATEX_BATCHMODE"))
+    t << "\\batchmode\n";
+
+  // Set document class depending on configuration
+  QCString documentClass;
+  if (Config_getBool("COMPACT_LATEX"))
+    documentClass = "article";
+  else
+    documentClass = "book";
+  t << "\\documentclass[twoside]{" << documentClass << "}\n"
+       "\n";
+
+  // Load required packages
+  t << "% Packages required by doxygen\n"
+       "\\usepackage{calc}\n"
+       "\\usepackage{doxygen}\n"
+       "\\usepackage{graphicx}\n"
+       "\\usepackage[utf8]{inputenc}\n"
+       "\\usepackage{makeidx}\n"
+       "\\usepackage{multicol}\n"
+       "\\usepackage{multirow}\n"
+       "\\usepackage{textcomp}\n"
+       "\\usepackage[table]{xcolor}\n"
+       "\n";
+
+  // Language support
+  QCString languageSupport = theTranslator->latexLanguageSupportCommand();
+  if (!languageSupport.isEmpty())
+  {
+    t << "% NLS support packages\n"
+      << languageSupport
+      << "\n";
+  }
+
+  // Define default fonts
+  t << "% Font selection\n"
+       "\\usepackage[T1]{fontenc}\n"
+       "\\usepackage{mathptmx}\n"
+       "\\usepackage[scaled=.90]{helvet}\n"
+       "\\usepackage{courier}\n"
+       "\\usepackage{amssymb}\n"
+       "\\usepackage{sectsty}\n"
+       "\\renewcommand{\\familydefault}{\\sfdefault}\n"
+       "\\allsectionsfont{%\n"
+       "  \\fontseries{bc}\\selectfont%\n"
+       "  \\color{darkgray}%\n"
+       "}\n"
+       "\\renewcommand{\\DoxyLabelFont}{%\n"
+       "  \\fontseries{bc}\\selectfont%\n"
+       "  \\color{darkgray}%\n"
+       "}\n"
+       "\n";
+
+  // Define page & text layout
   QCString paperName;
-  if (Config_getBool("LATEX_BATCHMODE")) t << "\\batchmode" << endl;
   QCString &paperType=Config_getEnum("PAPER_TYPE");
-  if (paperType=="a4wide") 
-    paperName="a4"; 
-  else 
+  // "a4wide" package is obsolete (see bug 563698)
+  if (paperType=="a4wide")
+    paperName="a4";
+  else
     paperName=paperType;
-  t << "\\documentclass";
-  //"[" << paperName << "paper";
-  //t << "]";
-  t << "{";
-  if (Config_getBool("COMPACT_LATEX")) t << "article"; else t << "book";
-  t << "}\n";
-  // the next package is obsolete (see bug 563698)
-  //if (paperType=="a4wide") t << "\\usepackage{a4wide}\n";
-  t << 
-    "\\usepackage["<<paperName<<"paper,top=2.5cm,bottom=2.5cm,left=2.5cm,right=2.5cm]{geometry}\n"
-    "\\usepackage{makeidx}\n"
-    "\\usepackage{natbib}\n"
-    "\\usepackage{graphicx}\n"
-    "\\usepackage{multicol}\n"
-    "\\usepackage{float}\n"
-    "\\usepackage{listings}\n"
-    "\\usepackage{color}\n"
-    "\\usepackage{ifthen}\n"
-    "\\usepackage[table]{xcolor}\n"
-    "\\usepackage{textcomp}\n"
-    "\\usepackage{alltt}\n"
-    //"\\usepackage{ae,aecompl,aeguill}\n"
-    ;
-  //if (Config_getBool("USE_PDFLATEX"))
-  //{
-  //  t << "\\usepackage{times}" << endl;
-  //}
-  if (Config_getBool("PDF_HYPERLINKS")) 
-  {
-    t << "\\usepackage{ifpdf}" << endl
-      << "\\ifpdf" << endl
-      << "\\usepackage[pdftex," << endl
-      << "            pagebackref=true," << endl
-      << "            colorlinks=true," << endl
-      << "            linkcolor=blue," << endl
-      << "            unicode" << endl
-      << "           ]{hyperref}" << endl
-      << "\\else" << endl
-      << "\\usepackage[ps2pdf," << endl
-      << "            pagebackref=true," << endl
-      << "            colorlinks=true," << endl
-      << "            linkcolor=blue," << endl
-      << "            unicode" << endl
-      << "           ]{hyperref}" << endl
-      << "\\usepackage{pspicture}" << endl
-      << "\\fi" << endl;
-  }
-  // Try to get the command for switching on the language
-  // support
-  t << "\\usepackage[utf8]{inputenc}" << endl;
-  QCString sLanguageSupportCommand(
-      theTranslator->latexLanguageSupportCommand());
-
-  if (!sLanguageSupportCommand.isEmpty())
-  {
-    // The command is not empty.  Put it to the output.
-    // if the command is empty, no output is needed.
-    t << sLanguageSupportCommand << endl;
-  }
-  t << "\\usepackage{mathptmx}\n";
-  t << "\\usepackage[scaled=.90]{helvet}\n";
-  t << "\\usepackage{courier}\n";
-  t << "\\usepackage{sectsty}\n";
-  t << "\\usepackage{amssymb}\n";
-  t << "\\usepackage[titles]{tocloft}\n";
-  t << "\\usepackage{doxygen}\n";
-
-  // define option for listings
-  t << "\\lstset{language=C++,"
-                "inputencoding=utf8,"
-                "basicstyle=\\footnotesize,"
-                "breaklines=true,"
-                "breakatwhitespace=true,"
-                "tabsize=" << Config_getInt("TAB_SIZE") <<","
-                "numbers=left }" << endl;
-
+  t << "% Page & text layout\n"
+       "\\usepackage{geometry}\n"
+       "\\geometry{%\n"
+       "  " << paperName << "paper,%\n"
+       "  top=2.5cm,%\n"
+       "  bottom=2.5cm,%\n"
+       "  left=2.5cm,%\n"
+       "  right=2.5cm%\n"
+       "}\n";
+  // \sloppy is obsolete (see bug 563698)
+  // Allow a bit of overflow to go unnoticed by other means
+  t << "\\tolerance=750\n"
+       "\\hfuzz=15pt\n"
+       "\\hbadness=750\n"
+       "\\setlength{\\emergencystretch}{15pt}\n"
+       "\\setlength{\\parindent}{0cm}\n"
+       "\\setlength{\\parskip}{0.2cm}\n";
+  // Redefine paragraph/subparagraph environments, using sectsty fonts
+  t << "\\makeatletter\n"
+       "\\renewcommand{\\paragraph}{%\n"
+       "  \\@startsection{paragraph}{4}{0ex}{-1.0ex}{1.0ex}{%\n"
+       "    \\normalfont\\normalsize\\bfseries\\SS@parafont%\n"
+       "  }%\n"
+       "}\n"
+       "\\renewcommand{\\subparagraph}{%\n"
+       "  \\@startsection{subparagraph}{5}{0ex}{-1.0ex}{1.0ex}{%\n"
+       "    \\normalfont\\normalsize\\bfseries\\SS@subparafont%\n"
+       "  }%\n"
+       "}\n"
+       "\\makeatother\n"
+       "\n";
+
+  // Headers & footers
+  QCString genString =
+        theTranslator->trGeneratedAt(dateToString(TRUE),Config_getString("PROJECT_NAME"));
+  t << "% Headers & footers\n"
+       "\\usepackage{fancyhdr}\n"
+       "\\pagestyle{fancyplain}\n"
+       "\\fancyhead[LE]{\\fancyplain{}{\\bfseries\\thepage}}\n"
+       "\\fancyhead[CE]{\\fancyplain{}{}}\n"
+       "\\fancyhead[RE]{\\fancyplain{}{\\bfseries\\leftmark}}\n"
+       "\\fancyhead[LO]{\\fancyplain{}{\\bfseries\\rightmark}}\n"
+       "\\fancyhead[CO]{\\fancyplain{}{}}\n"
+       "\\fancyhead[RO]{\\fancyplain{}{\\bfseries\\thepage}}\n"
+       "\\fancyfoot[LE]{\\fancyplain{}{}}\n"
+       "\\fancyfoot[CE]{\\fancyplain{}{}}\n"
+       "\\fancyfoot[RE]{\\fancyplain{}{\\bfseries\\scriptsize " << genString << " Doxygen }}\n"
+       "\\fancyfoot[LO]{\\fancyplain{}{\\bfseries\\scriptsize " << genString << " Doxygen }}\n"
+       "\\fancyfoot[CO]{\\fancyplain{}{}}\n"
+       "\\fancyfoot[RO]{\\fancyplain{}{}}\n"
+       "\\renewcommand{\\footrulewidth}{0.4pt}\n";
+  if (!Config_getBool("COMPACT_LATEX"))
+  {
+    t << "\\renewcommand{\\chaptermark}[1]{%\n"
+         "  \\markboth{#1}{}%\n"
+         "}\n";
+  }
+  t << "\\renewcommand{\\sectionmark}[1]{%\n"
+       "  \\markright{\\thesection\\ #1}%\n"
+       "}\n"
+       "\n";
+
+  // ToC, LoF, LoT, bibliography, and index
+  t << "% Indices & bibliography\n"
+       "\\usepackage{natbib}\n"
+       "\\usepackage[titles]{tocloft}\n"
+       "\\setcounter{tocdepth}{3}\n"
+       "\\setcounter{secnumdepth}{5}\n"
+       "\\makeindex\n"
+       "\n";
+
+  // User-specified packages
   QStrList &extraPackages = Config_getList("EXTRA_PACKAGES");
-  const char *s=extraPackages.first();
-  while (s)
-  {
-    t << "\\usepackage{" << s << "}\n";
-    s=extraPackages.next();
-  }
-  t << "\\makeindex\n"
-    "\\setcounter{tocdepth}{3}\n"
-    "\\renewcommand{\\footrulewidth}{0.4pt}\n"
-    "\\renewcommand{\\familydefault}{\\sfdefault}\n"
-    "\\hfuzz=15pt\n"  // allow a bit of overflow to go unnoticed
-    "\\setlength{\\emergencystretch}{15pt}\n"
-    "\\hbadness=750\n"
-    "\\tolerance=750\n"
-    "\\begin{document}\n";
-  static bool pdfHyperlinks = Config_getBool("PDF_HYPERLINKS");
-  static bool usePDFLatex   = Config_getBool("USE_PDFLATEX");
+  if (!extraPackages.isEmpty()) {
+    t << "% Packages requested by user\n";
+    const char *pkgName=extraPackages.first();
+    while (pkgName)
+    {
+      t << "\\usepackage{" << pkgName << "}\n";
+      pkgName=extraPackages.next();
+    }
+    t << "\n";
+  }
+
+  // Hyperlinks
+  bool pdfHyperlinks = Config_getBool("PDF_HYPERLINKS");
+  if (pdfHyperlinks)
+  {
+    t << "% Hyperlinks (required, but should be loaded last)\n"
+         "\\usepackage{ifpdf}\n"
+         "\\ifpdf\n"
+         "  \\usepackage[pdftex,pagebackref=true]{hyperref}\n"
+         "\\else\n"
+         "  \\usepackage[ps2pdf,pagebackref=true]{hyperref}\n"
+         "\\fi\n"
+         "\\hypersetup{%\n"
+         "  colorlinks=true,%\n"
+         "  linkcolor=blue,%\n"
+         "  citecolor=blue,%\n"
+         "  unicode%\n"
+         "}\n"
+         "\n";
+  }
+
+  // Custom commands used by the header
+  t << "% Custom commands\n"
+       "\\newcommand{\\clearemptydoublepage}{%\n"
+       "  \\newpage{\\pagestyle{empty}\\cleardoublepage}%\n"
+       "}\n"
+       "\n"
+       "\n";
+
+  // End of preamble, now comes the document contents
+  t << "%===== C O N T E N T S =====\n"
+       "\n"
+       "\\begin{document}\n";
+  if (theTranslator->idLanguage()=="greek")
+    t << "\\selectlanguage{greek}\n";
+  t << "\n";
+
+  // Front matter
+  t << "% Titlepage & ToC\n";
+  bool usePDFLatex = Config_getBool("USE_PDFLATEX");
   if (pdfHyperlinks && usePDFLatex)
   {
-    // to avoid duplicate page anchors due to reuse of same numbers for
+    // To avoid duplicate page anchors due to reuse of same numbers for
     // the index (be it as roman numbers)
-    t << "\\hypersetup{pageanchor=false,citecolor=blue}" << endl;
+    t << "\\hypersetup{pageanchor=false}\n";
   }
-  if (theTranslator->idLanguage()=="greek") t << "\\selectlanguage{greek}\n";
-  t << "\\begin{titlepage}\n"
-    "\\vspace*{7cm}\n"
-    "\\begin{center}\n"
-    "{\\Large ";
-
+  t << "\\pagenumbering{roman}\n"
+       "\\begin{titlepage}\n"
+       "\\vspace*{7cm}\n"
+       "\\begin{center}%\n"
+       "{\\Large ";
 }
 
 static void writeDefaultHeaderPart2(FTextStream &t)
 {
   // part 2
-  t << "}\\\\" << endl
-    << "\\vspace*{1cm}" << endl
-    << "{\\large ";
+  // Finalize project name
+  t << "}\\\\\n"
+       "\\vspace*{1cm}\n"
+       "{\\large ";
 }
 
 static void writeDefaultHeaderPart3(FTextStream &t)
 {
   // part 3
-  t << " Doxygen " << versionString << "}\\\\" << endl
-    << "\\vspace*{0.5cm}" << endl
-    << "{\\small " << dateToString(TRUE) << "}\\\\" << endl
-    << "\\end{center}" << endl
-    << "\\end{titlepage}" << endl;
-  if (!Config_getBool("COMPACT_LATEX")) t << "\\clearemptydoublepage\n";
-  t << "\\pagenumbering{roman}\n";
+  // Finalize project number
+  t << " Doxygen " << versionString << "}\\\\\n"
+       "\\vspace*{0.5cm}\n"
+       "{\\small " << dateToString(TRUE) << "}\\\\\n"
+       "\\end{center}\n"
+       "\\end{titlepage}\n";
+  bool compactLatex = Config_getBool("COMPACT_LATEX");
+  if (!compactLatex)
+    t << "\\clearemptydoublepage\n";
+
+  // ToC
   t << "\\tableofcontents\n";
-  if (!Config_getBool("COMPACT_LATEX")) t << "\\clearemptydoublepage\n";
+  if (!compactLatex)
+    t << "\\clearemptydoublepage\n";
   t << "\\pagenumbering{arabic}\n";
-  static bool pdfHyperlinks = Config_getBool("PDF_HYPERLINKS");
-  static bool usePDFLatex   = Config_getBool("USE_PDFLATEX");
+  bool pdfHyperlinks = Config_getBool("PDF_HYPERLINKS");
+  bool usePDFLatex   = Config_getBool("USE_PDFLATEX");
   if (pdfHyperlinks && usePDFLatex)
   {
-    t << "\\hypersetup{pageanchor=true,citecolor=blue}" << endl;
+    // re-enable anchors again
+    t << "\\hypersetup{pageanchor=true}\n";
   }
+  t << "\n"
+       "%--- Begin generated contents ---\n";
 }
 
-static void writeDefaultStyleSheetPart1(FTextStream &t)
+static void writeDefaultStyleSheet(FTextStream &t)
 {
-  // part 1
-  t << "\\NeedsTeXFormat{LaTeX2e}\n"
-       "\\ProvidesPackage{doxygen}\n\n";
-  t << "% Packages used by this style file\n"
-       "\\RequirePackage{alltt}\n"
-       "\\RequirePackage{array}\n"
-       "\\RequirePackage{calc}\n"
-       "\\RequirePackage{color}\n"
-       "\\RequirePackage{fancyhdr}\n"
-       "\\RequirePackage{longtable}\n"
-       "\\RequirePackage{verbatim}\n"
-       "\\RequirePackage{ifthen}\n"
-       "\\RequirePackage{xtab}\n"
-       "\\RequirePackage{multirow}\n"
-       "\\RequirePackage[table]{xcolor}\n\n";
-
-  t << "% Use helvetica font instead of times roman\n"
-       "\\RequirePackage{helvet}\n"
-       "\\RequirePackage{sectsty}\n"
-       "\\RequirePackage{tocloft}\n"
-//       "\\allsectionsfont{\\usefont{OT1}{phv}{bc}{n}\\selectfont}\n"
-//       "\\providecommand{\\cftchapfont}{%\n"
-//       "  \\fontsize{11}{13}\\usefont{OT1}{phv}{bc}{n}\\selectfont\n"
-//       "}\n"
-//       "\\providecommand{\\cftchappagefont}{%\n"
-//       "  \\fontsize{11}{13}\\usefont{OT1}{phv}{c}{n}\\selectfont\n"
-//       "}\n"
-//       "\\providecommand{\\cftsecfont}{%\n"
-//       "  \\fontsize{10}{12}\\usefont{OT1}{phv}{c}{n}\\selectfont\n"
-//       "}\n"
-//       "\\providecommand{\\cftsecpagefont}{%\n"
-//       "  \\fontsize{10}{12}\\usefont{OT1}{phv}{c}{n}\\selectfont\n"
-//       "}\n"
-//       "\\providecommand{\\cftsubsecfont}{%\n"
-//       "  \\fontsize{10}{12}\\usefont{OT1}{phv}{c}{n}\\selectfont\n"
-//       "}\n"
-//       "\\providecommand{\\cftsubsecpagefont}{%\n"
-//       "  \\fontsize{10}{12}\\usefont{OT1}{phv}{c}{n}\\selectfont\n"
-//       "}\n"
-//       "\\providecommand{\\cftsubsubsecfont}{%\n"
-//       "  \\fontsize{9}{11}\\usefont{OT1}{phv}{c}{n}\\selectfont\n"
-//       "}\n"
-//       "\\providecommand{\\cftsubsubsecpagefont}{%\n"
-//       "  \\fontsize{9}{11}\\usefont{OT1}{phv}{c}{n}\\selectfont\n"
-//       "}\n"
-//       "\\providecommand{\\cftparafont}{%\n"
-//       "  \\fontsize{9}{11}\\usefont{OT1}{phv}{c}{n}\\selectfont\n"
-//       "}\n"
-//       "\\providecommand{\\cftparapagefont}{%\n"
-//       "  \\fontsize{9}{11}\\usefont{OT1}{phv}{c}{n}\\selectfont\n"
-//       "}\n"
-//       "\\providecommand{\\cfttoctitlefont}{%\n"
-//       "  \\fontsize{20}{22}\\usefont{OT1}{phv}{b}{n}\\selectfont\n"
-//       "}\n"
-       "\\providecommand{\\rmdefault}{phv}\n"
-       "\\providecommand{\\bfdefault}{bc}\n"
-       "\n\n";
-
-  t << "% Setup fancy headings\n"
-       "\\pagestyle{fancyplain}\n"
-       "\\newcommand{\\clearemptydoublepage}{%\n"
-       "  \\newpage{\\pagestyle{empty}\\cleardoublepage}%\n"
-       "}\n";
-  if (!Config_getBool("COMPACT_LATEX")) 
-    t << "\\renewcommand{\\chaptermark}[1]{%\n"
-         "  \\markboth{#1}{}%\n"
-         "}\n";
-  t << "\\renewcommand{\\sectionmark}[1]{%\n"
-       "  \\markright{\\thesection\\ #1}%\n"
-       "}\n";
-
-  //t << "\\lhead[\\fancyplain{}{\\bfseries\\thepage}]{%\n"
-  //     "  \\fancyplain{}{\\bfseries\\rightmark}%\n"
-  //     "}\n";
-  //t << "\\rhead[\\fancyplain{}{\\bfseries\\leftmark}]{%\n"
-  //     "  \\fancyplain{}{\\bfseries\\thepage}%\n"
-  //     "}\n";
-  //t << "\\rfoot[\\fancyplain{}{\\bfseries\\scriptsize%\n  ";
-  t << "\\fancyhead[LE]{\\fancyplain{}{\\bfseries\\thepage}}\n";
-  t << "\\fancyhead[CE]{\\fancyplain{}{}}\n";
-  t << "\\fancyhead[RE]{\\fancyplain{}{\\bfseries\\leftmark}}\n";
-  t << "\\fancyhead[LO]{\\fancyplain{}{\\bfseries\\rightmark}}\n";
-  t << "\\fancyhead[CO]{\\fancyplain{}{}}\n";
-  t << "\\fancyhead[RO]{\\fancyplain{}{\\bfseries\\thepage}}\n";
-
-  t << "\\fancyfoot[LE]{\\fancyplain{}{}}\n";
-  t << "\\fancyfoot[CE]{\\fancyplain{}{}}\n";
-  t << "\\fancyfoot[RE]{\\fancyplain{}{\\bfseries\\scriptsize ";
-}
-
-static void writeDefaultStyleSheetPart2(FTextStream &t)
-{
-  t << "}}\n";
-  t << "\\fancyfoot[LO]{\\fancyplain{}{\\bfseries\\scriptsize ";
-  //t << "\\lfoot[]{\\fancyplain{}{\\bfseries\\scriptsize%\n  ";
-
-}
-
-static void writeDefaultStyleSheetPart3(FTextStream &t)
-{
-  //static bool latexSourceCode = Config_getBool("LATEX_SOURCE_CODE");
-  t << "}}\n";
-  //t << "\\cfoot{}\n\n";
-  t << "\\fancyfoot[CO]{\\fancyplain{}{}}\n";
-  t << "\\fancyfoot[RO]{\\fancyplain{}{}}\n";
-
-  t << "%---------- Internal commands used in this style file ----------------\n\n";
-
-  t << "\\newcommand\\tabfill[1]{%\n";
-  t << "  \\dimen@\\linewidth%\n";
-  t << "  \\advance\\dimen@\\@totalleftmargin%\n";
-  t << "  \\advance\\dimen@-\\dimen\\@curtab%\n";
-  t << "  \\parbox[t]\\dimen@{\\raggedright #1\\ifhmode\\strut\\fi}%\n";
-  t << "}\n\n";
-
-  t << "\\newcommand{\\ensurespace}[1]{%\n";
-  t << "  \\begingroup\n";
-  t << "    \\setlength{\\dimen@}{#1}%\n";
-  t << "    \\vskip\\z@\\@plus\\dimen@\n";
-  t << "    \\penalty -100\\vskip\\z@\\@plus -\\dimen@\n";
-  t << "    \\vskip\\dimen@\n";
-  t << "    \\penalty 9999%\n";
-  t << "    \\vskip -\\dimen@\n";
-  t << "    \\vskip\\z@skip % hide the previous |\\vskip| from |\\addvspace|\n";
-  t << "  \\endgroup\n";
-  t << "}\n\n";
-
-  t << "% Generic environment used by all paragraph-based environments defined\n"
-       "% below. Note that the command \\title{...} needs to be defined inside\n"
-       "% those environments!\n"
-       "\\newenvironment{DoxyDesc}[1]{%\n"
-       //"  \\filbreak%\n"
-       "  \\ensurespace{4\\baselineskip}%\n"
-       "  \\begin{list}{}%\n"
-       "  {%\n"
-       "    \\settowidth{\\labelwidth}{40pt}%\n"
-       "    \\setlength{\\leftmargin}{\\labelwidth}%\n"
-       "    \\setlength{\\parsep}{0pt}%\n"
-       "    \\setlength{\\itemsep}{-4pt}%\n"
-       "    \\renewcommand{\\makelabel}{\\entrylabel}%\n"
-       "  }%\n"
-       "  \\item[#1]%\n"
-       "}{%\n"
-       "  \\end{list}%\n"
-       "}\n\n";
-  t << "%---------- Commands used by doxygen LaTeX output generator ----------\n\n";
-  t << "% Used by <pre> ... </pre>\n"
-       "\\newenvironment{DoxyPre}{%\n"
-       "  \\small%\n"
-       "  \\begin{alltt}%\n"
-       "}{%\n"
-       "  \\end{alltt}%\n"
-       "  \\normalsize%\n"
-       "}\n\n";
-  t << "% Used by @code ... @endcode\n"
-       "\\newenvironment{DoxyCode}{%\n";
-  //if (latexSourceCode)
-  //{
-    t << "\n\n\\begin{scriptsize}\\begin{alltt}%" << endl;
-  //}
-  //else
-  //{
-  //  t << "  \\footnotesize%\n"
-  //       "  \\verbatim%\n";
-  //}
-  t << "}{%\n";
-  //if (latexSourceCode)
-  //{
-    t << "\\end{alltt}\\end{scriptsize}%" << endl; 
-  //}
-  //else
-  //{
-  //  t << "  \\endverbatim%\n"
-  //       "  \\normalsize%\n";
-  //}
-  t << "}\n\n";
-  t << "% Used by @example, @include, @includelineno and @dontinclude\n"
-       "\\newenvironment{DoxyCodeInclude}{%\n"
-       "  \\DoxyCode%\n"
-       "}{%\n"
-       "  \\endDoxyCode%\n"
-       "}\n\n";
-  t << "% Used by @verbatim ... @endverbatim\n"
-       "\\newenvironment{DoxyVerb}{%\n"
-       "  \\footnotesize%\n"
-       "  \\verbatim%\n"
-       "}{%\n"
-       "  \\endverbatim%\n"
-       "  \\normalsize%\n"
-       "}\n\n";
-  t << "% Used by @verbinclude\n"
-       "\\newenvironment{DoxyVerbInclude}{%\n"
-       "  \\DoxyVerb%\n"
-       "}{%\n"
-       "  \\endDoxyVerb%\n"
-       "}\n\n";
-  t << "% Used by numbered lists (using '-#' or <ol> ... </ol>)\n"
-       "\\newenvironment{DoxyEnumerate}{%\n"
-       "  \\enumerate%\n"
-       "}{%\n"
-       "  \\endenumerate%\n"
-       "}\n\n";
-  t << "% Used by bullet lists (using '-', @li, @arg, or <ul> ... </ul>)\n"
-       "\\newenvironment{DoxyItemize}{%\n"
-       "  \\itemize%\n"
-       "}{%\n"
-       "  \\enditemize%\n"
-       "}\n\n";
-  t << "% Used by description lists (using <dl> ... </dl>)\n"
-       "\\newenvironment{DoxyDescription}{%\n"
-       "  \\description%\n"
-       "}{%\n"
-       "  \\enddescription%\n"
-       "}\n\n";
-  t << "% Used by @image, @dotfile, and @dot ... @enddot\n"
-       "% (only if caption is specified)\n"
-       "\\newenvironment{DoxyImage}{%\n"
-       "  \\begin{figure}[H]%\n"
-       "  \\begin{center}%\n"
-       "}{%\n"
-       "  \\end{center}%\n"
-       "  \\end{figure}%\n"
-       "}\n\n";
-  t << "% Used by @image, @dotfile, @dot ... @enddot, and @msc ... @endmsc\n"
-       "% (only if no caption is specified)\n"
-       "\\newenvironment{DoxyImageNoCaption}{%\n"
-       "}{%\n"
-       "}\n\n";
-  t << "% Used by @attention\n"
-       "\\newenvironment{DoxyAttention}[1]{%\n"
-       "  \\begin{DoxyDesc}{#1}%\n"
-       "}{%\n"
-       "  \\end{DoxyDesc}%\n"
-       "}\n\n";
-  t << "% Used by @author and @authors\n"
-       "\\newenvironment{DoxyAuthor}[1]{%\n"
-       "  \\begin{DoxyDesc}{#1}%\n"
-       "}{%\n"
-       "  \\end{DoxyDesc}%\n"
-       "}\n\n";
-  t << "% Used by @date\n"
-       "\\newenvironment{DoxyDate}[1]{%\n"
-       "  \\begin{DoxyDesc}{#1}%\n"
-       "}{%\n"
-       "  \\end{DoxyDesc}%\n"
-       "}\n\n";
-  t << "% Used by @invariant\n"
-       "\\newenvironment{DoxyInvariant}[1]{%\n"
-       "  \\begin{DoxyDesc}{#1}%\n"
-       "}{%\n"
-       "  \\end{DoxyDesc}%\n"
-       "}\n\n";
-  t << "% Used by @note\n"
-       "\\newenvironment{DoxyNote}[1]{%\n"
-       "  \\begin{DoxyDesc}{#1}%\n"
-       "}{%\n"
-       "  \\end{DoxyDesc}%\n"
-       "}\n\n";
-  t << "% Used by @post\n"
-       "\\newenvironment{DoxyPostcond}[1]{%\n"
-       "  \\begin{DoxyDesc}{#1}%\n"
-       "}{%\n"
-       "  \\end{DoxyDesc}%\n"
-       "}\n\n";
-  t << "% Used by @pre\n"
-       "\\newenvironment{DoxyPrecond}[1]{%\n"
-       "  \\begin{DoxyDesc}{#1}%\n"
-       "}{%\n"
-       "  \\end{DoxyDesc}%\n"
-       "}\n\n";
-  t << "% Used by @copyright\n"
-       "\\newenvironment{DoxyCopyright}[1]{%\n"
-       "  \\begin{DoxyDesc}{#1}%\n"
-       "}{%\n"
-       "  \\end{DoxyDesc}%\n"
-       "}\n\n";
-  t << "% Used by @remark\n"
-       "\\newenvironment{DoxyRemark}[1]{%\n"
-       "  \\begin{DoxyDesc}{#1}%\n"
-       "}{%\n"
-       "  \\end{DoxyDesc}%\n"
-       "}\n\n";
-  t << "% Used by @return\n"
-       "\\newenvironment{DoxyReturn}[1]{%\n"
-       "  \\begin{DoxyDesc}{#1}%\n"
-       "}{%\n"
-       "  \\end{DoxyDesc}%\n"
-       "}\n\n";
-  t << "% Used by @since\n"
-       "\\newenvironment{DoxySince}[1]{%\n"
-       "  \\begin{DoxyDesc}{#1}%\n"
-       "}{%\n"
-       "  \\end{DoxyDesc}%\n"
-       "}\n\n";
-  t << "% Used by @see\n"
-       "\\newenvironment{DoxySeeAlso}[1]{%\n"
-       "  \\begin{DoxyDesc}{#1}%\n"
-       "}{%\n"
-       "  \\end{DoxyDesc}%\n"
-       "}\n\n";
-  t << "% Used by @version\n"
-       "\\newenvironment{DoxyVersion}[1]{%\n"
-       "  \\begin{DoxyDesc}{#1}%\n"
-       "}{%\n"
-       "  \\end{DoxyDesc}%\n"
-       "}\n\n";
-  t << "% Used by @warning\n"
-       "\\newenvironment{DoxyWarning}[1]{%\n"
-       "  \\begin{DoxyDesc}{#1}%\n"
-       "}{%\n"
-       "  \\end{DoxyDesc}%\n"
-       "}\n\n";
-  t << "% Used by @internal\n"
-       "\\newenvironment{DoxyInternal}[1]{%\n"
-       "  \\paragraph*{#1}%\n"
-       "}{%\n"
-       "}\n\n";
-  t << "% Used by @par and @paragraph\n"
-       "\\newenvironment{DoxyParagraph}[1]{%\n"
-       "  \\begin{list}{}%\n"
-       "  {%\n"
-       "    \\settowidth{\\labelwidth}{40pt}%\n"
-       "    \\setlength{\\leftmargin}{\\labelwidth}%\n"
-       "    \\setlength{\\parsep}{0pt}%\n"
-       "    \\setlength{\\itemsep}{-4pt}%\n"
-       "    \\renewcommand{\\makelabel}{\\entrylabel}%\n"
-       "  }%\n"
-       "  \\item[#1]%\n"
-       "}{%\n"
-       "  \\end{list}%\n"
-       "}\n\n";
-  t << "% Used by parameter lists\n"
-       "\\newenvironment{DoxyParams}[2][]{%\n"
-       "  \\begin{DoxyDesc}{#2}%\n"
-       //"    \\begin{description}%\n"
-       "    \\item[] \\hspace{\\fill} \\vspace{-40pt}%\n"
-       //"      \\definecolor{tableShade}{HTML}{F8F8F8}%\n"
-       //"      \\rowcolors{1}{white}{tableShade}%\n"
-       //"      \\arrayrulecolor{gray}%\n"
-       "    \\settowidth{\\labelwidth}{40pt}%\n"
-       //"    \\setlength{\\LTleft}{\\labelwidth}%\n"
-       "    \\setlength{\\LTleft}{0pt}%\n"
-       "    \\setlength{\\tabcolsep}{0.01\\textwidth}%\n"
-       "    \\ifthenelse{\\equal{#1}{}}%\n" // default: name, docs columns
-       "    {\\begin{longtable}{|>{\\raggedleft\\hspace{0pt}}p{0.15\\textwidth}|%\n"
-       "                        p{0.815\\textwidth}|}}%\n"
-       "    {\\ifthenelse{\\equal{#1}{1}}%\n" // inout, name, docs columns, or type, name, docs columns
-       "      {\\begin{longtable}{|>{\\centering}p{0.10\\textwidth}|%\n"
-       "                         >{\\raggedleft\\hspace{0pt}}p{0.15\\textwidth}|%\n"
-       "                         p{0.685\\textwidth}|}}%\n"
-       "      {\\begin{longtable}{|>{\\centering}p{0.10\\textwidth}|%\n" // inout, type, name, docs columns
-       "                         >{\\centering\\hspace{0pt}}p{0.15\\textwidth}|%\n"
-       "                         >{\\raggedleft\\hspace{0pt}}p{0.15\\textwidth}|%\n"
-       "                         p{0.515\\textwidth}|}}%\n"
-       "    }\\hline%\n"
-       "}{%\n"
-       "    \\end{longtable}%\n"
-       //"    \\end{description}%\n"
-       "  \\end{DoxyDesc}%\n"
-       "}\n\n";
-  t << "% Used for fields of simple structs\n"
-       "\\newenvironment{DoxyFields}[1]{%\n"
-       "  \\begin{DoxyDesc}{#1}%\n"
-       "    \\item[] \\hspace{\\fill} \\vspace{-40pt}%\n"
-       "    \\settowidth{\\labelwidth}{40pt}%\n"
-       "    \\setlength{\\LTleft}{0pt}%\n"
-       "    \\setlength{\\tabcolsep}{0.01\\textwidth}%\n"
-       "    \\begin{longtable}{|>{\\raggedleft\\hspace{0pt}}p{0.15\\textwidth}|%\n"
-       "                         p{0.15\\textwidth}|%\n"
-       "                         p{0.635\\textwidth}|}%\n"
-       //"\\hline{\\sf\\textbf{Type}} & {\\sf\\textbf{Name}} & {\\sf\\textbf{Description}}\\endhead%\n"
-       "    \\hline%\n"
-       "}{%\n"
-       "    \\end{longtable}%\n"
-       //"    \\end{description}%\n"
-       "  \\end{DoxyDesc}%\n"
-       "}\n\n";
-  t << "% is used for parameters within a detailed function description\n"
-       "\\newenvironment{DoxyParamCaption}{%\n"
-       "  \\renewcommand{\\item}[2][]{##1 {\\em ##2}}%\n"
-       "  }{%\n"
-       "}\n\n";
-  t << "% Used by return value lists\n"
-       "\\newenvironment{DoxyRetVals}[1]{%\n"
-       "  \\begin{DoxyDesc}{#1}%\n"
-       "    \\begin{description}%\n"
-       "      \\item[] \\hspace{\\fill} \\vspace{-25pt}%\n"
-       //"      \\definecolor{tableShade}{HTML}{F8F8F8}%\n"
-       //"      \\rowcolors{1}{white}{tableShade}%\n"
-       //"      \\arrayrulecolor{gray}%\n"
-       "      \\setlength{\\tabcolsep}{0.01\\textwidth}%\n"
-       "      \\begin{longtable}{|>{\\raggedleft\\hspace{0pt}}p{0.25\\textwidth}|%\n"
-       "                          p{0.705\\textwidth}|}%\n"
-       "      \\hline%\n"
-       "}{%\n"
-       "      \\end{longtable}%\n"
-       "    \\end{description}%\n"
-       "  \\end{DoxyDesc}%\n"
-       "}\n\n";
-  t << "% Used by exception lists\n"
-       "\\newenvironment{DoxyExceptions}[1]{%\n"
-       "  \\begin{DoxyDesc}{#1}%\n"
-       "    \\begin{description}%\n"
-       "      \\item[] \\hspace{\\fill} \\vspace{-25pt}%\n"
-       "      \\definecolor{tableShade}{HTML}{F8F8F8}%\n"
-       "      \\rowcolors{1}{white}{tableShade}%\n"
-       "      \\arrayrulecolor{gray}%\n"
-       "      \\setlength{\\tabcolsep}{0.01\\textwidth}%\n"
-       "      \\begin{longtable}{|>{\\raggedleft\\hspace{0pt}}p{0.25\\textwidth}|%\n"
-       "                          p{0.705\\textwidth}|}%\n"
-       "      \\hline%\n"
-       "}{%\n"
-       "      \\end{longtable}%\n"
-       "    \\end{description}%\n"
-       "  \\end{DoxyDesc}%\n"
-       "}\n\n";
-  t << "% Used by template parameter lists\n"
-       "\\newenvironment{DoxyTemplParams}[1]{%\n"
-       "  \\begin{DoxyDesc}{#1}%\n"
-       "    \\begin{description}%\n"
-       "      \\item[] \\hspace{\\fill} \\vspace{-25pt}%\n"
-       "      \\definecolor{tableShade}{HTML}{F8F8F8}%\n"
-       "      \\rowcolors{1}{white}{tableShade}%\n"
-       "      \\arrayrulecolor{gray}%\n"
-       "      \\setlength{\\tabcolsep}{0.01\\textwidth}%\n"
-       "      \\begin{longtable}{|>{\\raggedleft\\hspace{0pt}}p{0.25\\textwidth}|%\n"
-       "                          p{0.705\\textwidth}|}%\n"
-       "      \\hline%\n"
-       "}{%\n"
-       "      \\end{longtable}%\n"
-       "    \\end{description}%\n"
-       "  \\end{DoxyDesc}%\n"
-       "}\n\n";
-  t << "\\newcommand{\\doxyref}[3]{\\textbf{#1} (\\textnormal{#2}\\,\\pageref{#3})}\n";
-  t << "\\newenvironment{DoxyCompactList}\n";
-  t << "{\\begin{list}{}{\n";
-  t << "  \\setlength{\\leftmargin}{0.5cm}\n";
-  t << "  \\setlength{\\itemsep}{0pt}\n";
-  t << "  \\setlength{\\parsep}{0pt}\n";
-  t << "  \\setlength{\\topsep}{0pt}\n";
-  t << "  \\renewcommand{\\makelabel}{\\hfill}}}\n";
-  t << "{\\end{list}}\n";
-  t << "\\newenvironment{DoxyCompactItemize}\n";
-  t << "{\n";
-  t << "  \\begin{itemize}\n";
-  t << "  \\setlength{\\itemsep}{-3pt}\n";
-  t << "  \\setlength{\\parsep}{0pt}\n";
-  t << "  \\setlength{\\topsep}{0pt}\n";
-  t << "  \\setlength{\\partopsep}{0pt}\n";
-  t << "}\n";
-  t << "{\\end{itemize}}\n";
-  t << "\\newcommand{\\PBS}[1]{\\let\\temp=\\\\#1\\let\\\\=\\temp}\n";
-  t << "\\newlength{\\tmplength}\n";
-  t << "\\newenvironment{TabularC}[1]\n";
-  t << "{\n";
-  t << "\\setlength{\\tmplength}\n";
-  t << "     {\\linewidth/(#1)-\\tabcolsep*2-\\arrayrulewidth*(#1+1)/(#1)}\n";
-  t << "      \\par\\begin{xtabular*}{\\linewidth}\n";
-  t << "             {*{#1}{|>{\\PBS\\raggedright\\hspace{0pt}}p{\\the\\tmplength}}|}\n";
-  t << "}\n";
-  t << "{\\end{xtabular*}\\par}\n";
-  t << "\\newcommand{\\entrylabel}[1]{\n";
-  t << "   {\\parbox[b]{\\labelwidth-4pt}{\\makebox[0pt][l]{%\n";
-  t << "   \\usefont{OT1}{phv}{bc}{n}\\color{darkgray}#1}\\vspace{1.5\\baselineskip}}}}\n";
-  t << "\\newenvironment{Desc}\n";
-  t << "{\\begin{list}{}\n";
-  t << "  {\n";
-  t << "    \\settowidth{\\labelwidth}{40pt}\n";
-  t << "    \\setlength{\\leftmargin}{\\labelwidth}\n";
-  t << "    \\setlength{\\parsep}{0pt}\n";
-  t << "    \\setlength{\\itemsep}{-4pt}\n";
-  t << "    \\renewcommand{\\makelabel}{\\entrylabel}\n";
-  t << "  }\n";
-  t << "}\n";
-  t << "{\\end{list}}\n";
-
-  t << "\\newsavebox{\\xrefbox}\n";
-  t << "\\newlength{\\xreflength}\n";
-  t << "\\newcommand{\\xreflabel}[1]{%\n";
-  t << "  \\sbox{\\xrefbox}{#1}%\n";
-  t << "  \\setlength{\\xreflength}{\\wd\\xrefbox}%\n";
-  t << "  \\ifthenelse{\\xreflength>\\labelwidth}{%\n";
-  t << "    \\begin{minipage}{\\textwidth}%\n";
-  t << "      \\setlength{\\parindent}{0pt}%\n";
-  t << "      \\hangindent=15pt\\bfseries #1\\vspace{1.2\\itemsep}%\n";
-  t << "    \\end{minipage}%\n";
-  t << "  }{%\n";
-  t << "   \\parbox[b]{\\labelwidth}{\\makebox[0pt][l]{\\textbf{#1}}}%\n";
-  t << "  }}%\n";
-  t << "\\newenvironment{DoxyRefList}{%\n";
-  t << "  \\begin{list}{}{%\n";
-  t << "    \\setlength{\\labelwidth}{10pt}%\n";
-  t << "    \\setlength{\\leftmargin}{\\labelwidth}%\n";
-  t << "    \\addtolength{\\leftmargin}{\\labelsep}%\n";
-  t << "    \\renewcommand{\\makelabel}{\\xreflabel}%\n";
-  t << "    }%\n";
-  t << "  }%\n";
-  t << "{\\end{list}}\n";
-  t << "\\newenvironment{DoxyRefDesc}[1]\n";
-  t << "{\\begin{list}{}{%\n";
-  t << "  \\renewcommand\\makelabel[1]{\\textbf{##1}}\n";
-  t << "  \\settowidth\\labelwidth{\\makelabel{#1}}\n";
-  t << "  \\setlength\\leftmargin{\\labelwidth+\\labelsep}}}\n";
-  t << "{\\end{list}}\n";
-  t << "\\newenvironment{Indent}\n";
-  t << "  {\\begin{list}{}{\\setlength{\\leftmargin}{0.5cm}}\n";
-  t << "      \\item[]\\ignorespaces}\n";
-  t << "  {\\unskip\\end{list}}\n";
-
-  t << "\\setlength{\\parindent}{0cm}\n";
-  t << "\\setlength{\\parskip}{0.2cm}\n";
-  t << "\\addtocounter{secnumdepth}{2}\n";
-  // \sloppy should not be used, see bug 563698 
-  //t << "\\sloppy\n";
-  t << "\\usepackage[T1]{fontenc}\n";
-  t << "\\makeatletter\n";
-  t << "\\renewcommand{\\paragraph}{\\@startsection{paragraph}{4}{0ex}%\n";
-  t << "   {-1.0ex}%\n";
-  t << "   {1.0ex}%\n";
-  t << "   {\\usefont{OT1}{phv}{bc}{n}\\color{darkgray}}}\n";
-  t << "\\renewcommand{\\subparagraph}{\\@startsection{subparagraph}{5}{0ex}%\n";
-  t << "   {-1.0ex}%\n";
-  t << "   {1.0ex}%\n";
-  t << "   {\\usefont{OT1}{phv}{bc}{n}\\color{darkgray}}}\n";
-  t << "\\makeatother\n";
-  t << "\\allsectionsfont{\\usefont{OT1}{phv}{bc}{n}\\selectfont\\color{darkgray}}\n";
-  t << "\\stepcounter{secnumdepth}\n";
-  t << "\\stepcounter{tocdepth}\n";
-  t << "\\definecolor{comment}{rgb}{0.5,0.0,0.0}\n";
-  t << "\\definecolor{keyword}{rgb}{0.0,0.5,0.0}\n";
-  t << "\\definecolor{keywordtype}{rgb}{0.38,0.25,0.125}\n";
-  t << "\\definecolor{keywordflow}{rgb}{0.88,0.5,0.0}\n";
-  t << "\\definecolor{preprocessor}{rgb}{0.5,0.38,0.125}\n";
-  t << "\\definecolor{stringliteral}{rgb}{0.0,0.125,0.25}\n";
-  t << "\\definecolor{charliteral}{rgb}{0.0,0.5,0.5}\n";
-  t << "\\definecolor{vhdldigit}{rgb}{1.0,0.0,1.0}\n";
-  t << "\\definecolor{vhdlkeyword}{rgb}{0.43,0.0,0.43}\n";
-  t << "\\definecolor{vhdllogic}{rgb}{1.0,0.0,0.0}\n";
-  t << "\\definecolor{vhdlchar}{rgb}{0.0,0.0,0.0}\n";
+  t << doxygenLatexStyle;
 }
 
 static void writeDefaultFooter(FTextStream &t)
 {
+  t << "%--- End generated contents ---\n"
+       "\n";
+
+  // Bibliography
   Doxygen::citeDict->writeLatexBibliography(t);
-  t << "\\addcontentsline{toc}{part}{" << theTranslator->trRTFGeneralIndex() << "}\n";
-  t << "\\printindex\n";
-  t << "\\end{document}\n";
+
+  // Index
+  t << "% Index\n"
+       "\\newpage\n"
+       "\\phantomsection\n"
+       "\\addcontentsline{toc}{part}{" << theTranslator->trRTFGeneralIndex() << "}\n"
+       "\\printindex\n"
+       "\n"
+       "\\end{document}\n";
 }
 
 void LatexGenerator::writeHeaderFile(QFile &f)
@@ -976,20 +552,7 @@ void LatexGenerator::writeStyleSheetFile(QFile &f)
 {
   FTextStream t(&f);
   t << "% stylesheet for doxygen " << versionString << endl;
-
-  writeDefaultStyleSheetPart1(t);
-  QCString &projectName = Config_getString("PROJECT_NAME");
-
-  t << theTranslator->trGeneratedAt( dateToString(TRUE), projectName );
-  t << " doxygen";
-  //t << " " << theTranslator->trWrittenBy() << " ";
-  //t << "Dimitri van Heesch \\copyright~1997-2012";
-  writeDefaultStyleSheetPart2(t);
-  t << theTranslator->trGeneratedAt( dateToString(TRUE), projectName );
-  t << " doxygen";
-  //t << " << theTranslator->trWrittenBy() << " ";
-  //t << "Dimitri van Heesch \\copyright~1997-2012";
-  writeDefaultStyleSheetPart3(t);
+  writeDefaultStyleSheet(t);
 }
 
 void LatexGenerator::startFile(const char *name,const char *,const char *)
@@ -1454,31 +1017,12 @@ void LatexGenerator::writePageLink(const char *name, bool /*first*/)
 
 void LatexGenerator::writeStyleInfo(int part)
 {
-  switch(part)
-  {
-    case 0:
-      {
-        //QCString pname=Config_getString("PROJECT_NAME").stripWhiteSpace();
-        startPlainFile("doxygen.sty");
-        writeDefaultStyleSheetPart1(t);
-      }
-      break;
-    case 1:
-    case 3:
-      t << " Doxygen ";
-      break;
-    case 2:
-      {
-        writeDefaultStyleSheetPart2(t);
-      }
-      break;
-    case 4:
-      {
-        writeDefaultStyleSheetPart3(t);
-        endPlainFile();
-      }
-      break;
-  }
+  if (part > 0)
+    return;
+
+  startPlainFile("doxygen.sty");
+  writeDefaultStyleSheet(t);
+  endPlainFile();
 }
 
 void LatexGenerator::newParagraph()
@@ -1658,7 +1202,7 @@ void LatexGenerator::writeCodeLink(const char *ref,const char *f,
 {
   static bool pdfHyperlinks = Config_getBool("PDF_HYPERLINKS");
   static bool usePDFLatex   = Config_getBool("USE_PDFLATEX");
-  int l = strlen(name);
+  int l = qstrlen(name);
   if (col+l>80)
   {
     t << "\n      ";
@@ -1706,7 +1250,7 @@ void LatexGenerator::endTitleHead(const char *fileName,const char *name)
   t << "}" << endl;
   if (name)
   {
-    t << "\\label{" << fileName << "}\\index{";
+    t << "\\label{" << stripPath(fileName) << "}\\index{";
     escapeLabelName(name);
     t << "@{";
     escapeMakeIndexChars(name);
@@ -1866,7 +1410,7 @@ void LatexGenerator::endDoxyAnchor(const char *fName,const char *anchor)
     t << "}";
   }
   t << "\\label{";
-  if (fName) t << fName;
+  if (fName) t << stripPath(fName);
   if (anchor) t << "_" << anchor;
   t << "}" << endl;
 }
@@ -2378,6 +1922,14 @@ void LatexGenerator::endParameterName(bool last,bool /* emptyList */,bool closeB
   }
 }
 
+void LatexGenerator::exceptionEntry(const char* prefix,bool closeBracket)
+{
+  if (prefix)
+      t << " " << prefix;
+  else if (closeBracket)
+      t << ")";
+  t << " ";
+}
 
 void LatexGenerator::writeDoc(DocNode *n,Definition *ctx,MemberDef *)
 {
@@ -2433,7 +1985,7 @@ void LatexGenerator::escapeLabelName(const char *s)
   if (s==0) return;
   const char *p=s;
   char c;
-  QCString result(strlen(s)+1); // worst case allocation
+  QCString result(qstrlen(s)+1); // worst case allocation
   int i;
   while ((c=*p++))
   {
@@ -2462,7 +2014,7 @@ void LatexGenerator::escapeMakeIndexChars(const char *s)
   if (s==0) return;
   const char *p=s;
   char c;
-  QCString result(strlen(s)+1); // worst case allocation
+  QCString result(qstrlen(s)+1); // worst case allocation
   int i;
   while ((c=*p++))
   {
index 76069d3..2712d31 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -240,6 +240,7 @@ class LatexGenerator : public OutputGenerator
     void endParameterName(bool,bool,bool);
     void startParameterList(bool);
     void endParameterList();
+    void exceptionEntry(const char*,bool);
 
     void startConstraintList(const char *);
     void startConstraintParam();
@@ -267,7 +268,6 @@ class LatexGenerator : public OutputGenerator
     void endFontClass(); // {}
 
     void writeCodeAnchor(const char *) {}
-    void linkableSymbol(int,const char *,Definition *,Definition *) {}
     void setCurrentDoc(Definition *,const char *,bool) {}
     void addWord(const char *,bool) {}
 
index d1e02ac..c2b1ac5 100644 (file)
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -64,7 +64,7 @@ static bool elemIsVisible(const QXmlAttributes &attrib,bool defVal=TRUE)
     }
     else if (!opt)
     {
-      err("error: found unsupported value %s for visible attribute in layout file\n",
+      err("found unsupported value %s for visible attribute in layout file\n",
           visible.data());
     }
   }
@@ -96,7 +96,8 @@ LayoutNavEntry *LayoutNavEntry::find(LayoutNavEntry::Kind kind,
 QCString LayoutNavEntry::url() const
 {
   QCString url = baseFile().stripWhiteSpace();
-  if (kind()!=LayoutNavEntry::User)
+  if ((kind()!=LayoutNavEntry::User && kind()!=LayoutNavEntry::UserGroup) || 
+      (kind()==LayoutNavEntry::UserGroup && url.left(9)=="usergroup"))
   {
     url+=Doxygen::htmlFileExtension;
   }
@@ -119,7 +120,7 @@ QCString LayoutNavEntry::url() const
     }
     if (!found)
     {
-      msg("warning: explicit link request to '%s' in layout file '%s' could not be resolved\n",qPrint(url.mid(5)),qPrint(Config_getString("LAYOUT_FILE")));
+      msg("explicit link request to '%s' in layout file '%s' could not be resolved\n",qPrint(url.mid(5)),qPrint(Config_getString("LAYOUT_FILE")));
     }
   }
   //printf("LayoutNavEntry::url()=%s\n",url.data());
@@ -312,6 +313,12 @@ class LayoutParser : public QXmlDefaultHandler
                                            SrcLangExt_VHDL,VhdlDocGen::trVhdlType(VhdlDocGen::ENTITY,FALSE),
                                            SrcLangExt_Fortran,theTranslator->trDataTypes()
                                          )));
+      m_sHandler.insert("class/memberdecl/services",
+          new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+                                        MemberListType_services,theTranslator->trServices()));
+      m_sHandler.insert("class/memberdecl/interfaces",
+          new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+                                        MemberListType_interfaces,theTranslator->trInterfaces()));
       m_sHandler.insert("class/memberdecl/publictypes", 
           new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
                                         MemberListType_pubTypes,theTranslator->trPublicTypes()));
@@ -421,6 +428,12 @@ class LayoutParser : public QXmlDefaultHandler
       m_sHandler.insert("class/memberdef/enums", 
           new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
                                         MemberListType_enumMembers,theTranslator->trMemberEnumerationDocumentation()));
+      m_sHandler.insert("class/memberdef/services",
+          new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
+                                        MemberListType_serviceMembers,theTranslator->trInterfaces()));
+      m_sHandler.insert("class/memberdef/interfaces",
+          new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
+                                        MemberListType_interfaceMembers,theTranslator->trInterfaces()));
       m_sHandler.insert("class/memberdef/constructors", 
           new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
                                         MemberListType_constructors,theTranslator->trConstructorDocumentation()));
@@ -464,12 +477,16 @@ class LayoutParser : public QXmlDefaultHandler
           new StartElementHandler(this,&LayoutParser::startMemberDecl));
       m_sHandler.insert("namespace/memberdecl/nestednamespaces", 
           new StartElementHandlerSection(this,LayoutDocEntry::NamespaceNestedNamespaces,&LayoutParser::startSectionEntry,
-                                         COMPILE_FOR_3_OPTIONS(
+                                         COMPILE_FOR_4_OPTIONS(
                                            theTranslator->trNamespaces(),
                                            SrcLangExt_Java,theTranslator->trPackages(),
                                            SrcLangExt_VHDL,theTranslator->trPackages(),
+                                           SrcLangExt_IDL,theTranslator->trModules(),
                                            SrcLangExt_Fortran,theTranslator->trModules()
                                          )));
+      m_sHandler.insert("namespace/memberdecl/constantgroups",
+          new StartElementHandlerSection(this,LayoutDocEntry::NamespaceNestedConstantGroups,&LayoutParser::startSectionEntry,
+                                         theTranslator->trConstantGroups()));
       m_sHandler.insert("namespace/memberdecl/classes", 
           new StartElementHandlerSection(this,LayoutDocEntry::NamespaceClasses,&LayoutParser::startSectionEntry,
                                          COMPILE_FOR_2_OPTIONS(
@@ -558,11 +575,15 @@ class LayoutParser : public QXmlDefaultHandler
                                          )));
       m_sHandler.insert("file/memberdecl/namespaces", 
           new StartElementHandlerSection(this,LayoutDocEntry::FileNamespaces,&LayoutParser::startSectionEntry,
-                                         COMPILE_FOR_2_OPTIONS(
+                                         COMPILE_FOR_3_OPTIONS(
                                            theTranslator->trNamespaces(),
                                            SrcLangExt_Java,theTranslator->trPackages(),
+                                           SrcLangExt_IDL,theTranslator->trModules(),
                                            SrcLangExt_Fortran,theTranslator->trModules()
                                          )));
+      m_sHandler.insert("file/memberdecl/constantgroups",
+          new StartElementHandlerSection(this,LayoutDocEntry::FileNamespaces,&LayoutParser::startSectionEntry,
+                                         theTranslator->trConstantGroups()));
       m_sHandler.insert("file/memberdecl/defines", 
           new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
                                         MemberListType_decDefineMembers,theTranslator->trDefines()));
@@ -1040,11 +1061,11 @@ class LayoutParser : public QXmlDefaultHandler
       {
         if (type.isEmpty())
         {
-          err("error: an entry tag within a navindex has no type attribute! Check your layout file!\n");
+          err("an entry tag within a navindex has no type attribute! Check your layout file!\n");
         }
         else
         {
-          err("error: the type '%s' is not supported for the entry tag within a navindex! Check your layout file!\n",type.data());
+          err("the type '%s' is not supported for the entry tag within a navindex! Check your layout file!\n",type.data());
         }
         m_invalidEntry=TRUE;
         return;
@@ -1073,7 +1094,14 @@ class LayoutParser : public QXmlDefaultHandler
       }
       else if (kind==LayoutNavEntry::UserGroup)
       {
-        baseFile+=QCString().sprintf("%d",m_userGroupCount++);
+        if (!url.isEmpty())
+        {
+          baseFile=url;
+        }
+        else
+        {
+          baseFile+=QCString().sprintf("%d",m_userGroupCount++);
+        }
       }
       // create new item and make it the new root
       m_rootNav = new LayoutNavEntry(m_rootNav,kind,kind==LayoutNavEntry::MainPage?TRUE:isVisible,baseFile,title,intro);
@@ -1211,7 +1239,7 @@ class LayoutParser : public QXmlDefaultHandler
       }
       else
       {
-        err("error: Unexpected start tag `%s' found in scope='%s'!\n",
+        err("Unexpected start tag `%s' found in scope='%s'!\n",
             name.data(),m_scope.data());
       }
       return TRUE;
@@ -1261,21 +1289,21 @@ class LayoutErrorHandler : public QXmlErrorHandler
     LayoutErrorHandler(const char *fn) : fileName(fn) {}
     bool warning( const QXmlParseException &exception )
     {
-      err("warning: at line %d column %d of %s: %s\n",
+      warn_uncond("at line %d column %d of %s: %s\n",
           exception.lineNumber(),exception.columnNumber(),fileName.data(),
           exception.message().data());
       return FALSE;
     }
     bool error( const QXmlParseException &exception )
     {
-      err("error: at line %d column %d of %s: %s\n",
+      err("at line %d column %d of %s: %s\n",
           exception.lineNumber(),exception.columnNumber(),fileName.data(),
           exception.message().data());
       return FALSE;
     }
     bool fatalError( const QXmlParseException &exception )
     {
-      err("fatal error: at line %d column %d of %s: %s\n",
+      err("fatal: at line %d column %d of %s: %s\n",
           exception.lineNumber(),exception.columnNumber(),fileName.data(),
           exception.message().data());
       return FALSE;
index 830ee70..2506076 100644 (file)
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -45,11 +45,11 @@ struct LayoutDocEntry
               ClassUsedFiles,
 
               // Namespace specific items
-              NamespaceNestedNamespaces, NamespaceClasses,
-              NamespaceInlineClasses,
+              NamespaceNestedNamespaces, NamespaceNestedConstantGroups,
+              NamespaceClasses, NamespaceInlineClasses,
 
               // File specific items
-              FileClasses, FileNamespaces, 
+              FileClasses, FileNamespaces, FileConstantGroups,
               FileIncludes, FileIncludeGraph, 
               FileIncludedByGraph, FileSourceLink,
               FileInlineClasses,
index d2dfce6..d775926 100644 (file)
@@ -31,6 +31,8 @@
 "    <memberdecl>\n"
 "      <nestedclasses visible=\"yes\" title=\"\"/>\n"
 "      <publictypes title=\"\"/>\n"
+"      <services title=\"\"/>\n"
+"      <interfaces title=\"\"/>\n"
 "      <publicslots title=\"\"/>\n"
 "      <signals title=\"\"/>\n"
 "      <publicmethods title=\"\"/>\n"
@@ -65,6 +67,8 @@
 "      <inlineclasses title=\"\"/>\n"
 "      <typedefs title=\"\"/>\n"
 "      <enums title=\"\"/>\n"
+"      <services title=\"\"/>\n"
+"      <interfaces title=\"\"/>\n"
 "      <constructors title=\"\"/>\n"
 "      <functions title=\"\"/>\n"
 "      <related title=\"\"/>\n"
@@ -82,6 +86,7 @@
 "    <briefdescription visible=\"yes\"/>\n"
 "    <memberdecl>\n"
 "      <nestednamespaces visible=\"yes\" title=\"\"/>\n"
+"      <constantgroups visible=\"yes\" title=\"\"/>\n"
 "      <classes visible=\"yes\" title=\"\"/>\n"
 "      <typedefs title=\"\"/>\n"
 "      <enums title=\"\"/>\n"
 "    <memberdecl>\n"
 "      <classes visible=\"yes\" title=\"\"/>\n"
 "      <namespaces visible=\"yes\" title=\"\"/>\n"
+"      <constantgroups visible=\"yes\" title=\"\"/>\n"
 "      <defines title=\"\"/>\n"
 "      <typedefs title=\"\"/>\n"
 "      <enums title=\"\"/>\n"
index b0bbec4..f087958 100644 (file)
@@ -31,6 +31,8 @@
     <memberdecl>
       <nestedclasses visible="yes" title=""/>
       <publictypes title=""/>
+      <services title=""/>
+      <interfaces title=""/>
       <publicslots title=""/>
       <signals title=""/>
       <publicmethods title=""/>
@@ -65,6 +67,8 @@
       <inlineclasses title=""/>
       <typedefs title=""/>
       <enums title=""/>
+      <services title=""/>
+      <interfaces title=""/>
       <constructors title=""/>
       <functions title=""/>
       <related title=""/>
@@ -82,6 +86,7 @@
     <briefdescription visible="yes"/>
     <memberdecl>
       <nestednamespaces visible="yes" title=""/>
+      <constantgroups visible="yes" title=""/>
       <classes visible="yes" title=""/>
       <typedefs title=""/>
       <enums title=""/>
     <memberdecl>
       <classes visible="yes" title=""/>
       <namespaces visible="yes" title=""/>
+      <constantgroups visible="yes" title=""/>
       <defines title=""/>
       <typedefs title=""/>
       <enums title=""/>
index 800c373..6a63828 100644 (file)
@@ -1,7 +1,7 @@
 #
 # 
 #
-# Copyright (C) 1997-2012 by Dimitri van Heesch.
+# Copyright (C) 1997-2013 by Dimitri van Heesch.
 #
 # Permission to use, copy, modify, and distribute this software and its
 # documentation under the terms of the GNU General Public License is hereby 
index 29b1623..4f885a7 100644 (file)
@@ -1,7 +1,7 @@
 #
 # 
 #
-# Copyright (C) 1997-2012 by Dimitri van Heesch.
+# Copyright (C) 1997-2013 by Dimitri van Heesch.
 #
 # Permission to use, copy, modify, and distribute this software and its
 # documentation under the terms of the GNU General Public License is hereby 
index 39d303a..d63f7ac 100644 (file)
@@ -1,7 +1,7 @@
 #
 # 
 #
-# Copyright (C) 1997-2012 by Dimitri van Heesch.
+# Copyright (C) 1997-2013 by Dimitri van Heesch.
 #
 # Permission to use, copy, modify, and distribute this software and its
 # documentation under the terms of the GNU General Public License is hereby 
@@ -19,6 +19,7 @@ CONFIG       =        console warn_on staticlib $extraopts
 HEADERS      = arguments.h \
                 bufstr.h \
                cite.h \
+               clangparser.h \
                 classdef.h \
                 classlist.h \
                 cmdmapper.h \
@@ -46,6 +47,7 @@ HEADERS      =        arguments.h \
                doxygen.h \
                doxygen_bst.h \
                doxygen_css.h \
+               doxygen_sty.h \
                eclipsehelp.h \
                entry.h \
                example.h \
@@ -77,10 +79,10 @@ HEADERS      =      arguments.h \
                latexgen.h \
                 layout.h \
                 layout_default.h \
-                lockingptr.h \
                logos.h \
                mandocvisitor.h \
                mangen.h \
+               sqlite3gen.h \
                markdown.h \
                 marshal.h \
                memberdef.h \
@@ -170,12 +172,15 @@ HEADERS      =    arguments.h \
                vhdldocgen.h \
                vhdlscanner.h \
                xmldocvisitor.h \
-                xmlgen.h
+                xmlgen.h \
+                docbookvisitor.h \
+                docbookgen.h
 
 SOURCES      = arguments.cpp \
                 ce_lex.cpp \
                 ce_parse.cpp \
                cite.cpp \
+               clangparser.cpp \
                classdef.cpp \
                classlist.cpp \
                 cmdmapper.cpp \
@@ -222,6 +227,7 @@ SOURCES      =      arguments.cpp \
                logos.cpp \
                mandocvisitor.cpp \
                mangen.cpp \
+               sqlite3gen.cpp \
                markdown.cpp \
                 marshal.cpp \
                memberdef.cpp \
@@ -259,7 +265,9 @@ SOURCES      =      arguments.cpp \
                vhdlparser.cpp \
                vhdlscanner.cpp \
                xmldocvisitor.cpp \
-                xmlgen.cpp
+                xmlgen.cpp \
+                docbookvisitor.cpp \
+                docbookgen.cpp
 
 win32:TMAKE_CXXFLAGS       += -DQT_NODLL 
 win32-msvc:TMAKE_CXXFLAGS  += -Zm200
index e11e010..526a097 100644 (file)
@@ -1,7 +1,7 @@
 #
 # 
 #
-# Copyright (C) 1997-2012 by Dimitri van Heesch.
+# Copyright (C) 1997-2013 by Dimitri van Heesch.
 #
 # Permission to use, copy, modify, and distribute this software and its
 # documentation under the terms of the GNU General Public License is hereby 
@@ -144,6 +144,9 @@ extsearch_js.h: extsearch.js
 doxygen_css.h: doxygen.css
        cat doxygen.css | $(TO_C_CMD) >doxygen_css.h 
 
+doxygen_sty.h: doxygen.sty
+       cat doxygen.sty | $(TO_C_CMD) >doxygen_sty.h 
+
 navtree_js.h: navtree.js
        cat navtree.js | $(TO_C_CMD) >navtree_js.h
 
@@ -162,6 +165,9 @@ jquery_p2_js.h: jquery_p2.js
 jquery_p3_js.h: jquery_p3.js
        cat jquery_p3.js | $(TO_C_CMD) >jquery_p3_js.h
 
+jquery_p4_js.h: jquery_p4.js
+       cat jquery_p4.js | $(TO_C_CMD) >jquery_p4_js.h
+
 jquery_ui_js.h: jquery_ui.js
        cat jquery_ui.js | $(TO_C_CMD) >jquery_ui_js.h
 
index 5fc328d..024758f 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 120a449..6aea996 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 3050819..13406e1 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index dd1ea1e..09798ec 100644 (file)
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 38a3ab3..e854bfc 100644 (file)
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -32,7 +32,7 @@
 
 ManDocVisitor::ManDocVisitor(FTextStream &t,CodeOutputInterface &ci,
                              const char *langExt) 
-  : DocVisitor(DocVisitor_Man), m_t(t), m_ci(ci), m_insidePre(FALSE), m_hide(FALSE), m_firstCol(TRUE),
+  : DocVisitor(DocVisitor_Man), m_t(t), m_ci(ci), m_insidePre(FALSE), m_hide(FALSE), m_firstCol(FALSE),
     m_indent(0), m_langExt(langExt)
 {
 }
@@ -223,7 +223,8 @@ void ManDocVisitor::visit(DocVerbatim *s)
     case DocVerbatim::HtmlOnly: 
     case DocVerbatim::XmlOnly: 
     case DocVerbatim::LatexOnly: 
-    case DocVerbatim::RtfOnly: 
+    case DocVerbatim::RtfOnly:
+    case DocVerbatim::DocbookOnly:
     case DocVerbatim::Dot: 
     case DocVerbatim::Msc: 
       /* nothing */ 
index d595644..cc4e85f 100644 (file)
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index cea01ce..a50ee73 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
 
 static QCString getExtension()
 {
+  /*
+   * [.][nuber][rest]
+   * in case of . missing, just ignore it
+   * in case number missing, just place a 3 in front of it
+   */
   QCString ext = Config_getString("MAN_EXTENSION");
-  if( ext.length() >= 2 &&
-      ext.data()[0] == '.')
+  if (ext.isEmpty())
   {
-    ext = ext.mid(1, ext.length()-1);
+    ext = "3"; 
   }
   else
   {
-    ext = "3"; 
+    if (ext.at(0)=='.')
+    {
+      if (ext.length()==1)
+      {
+        ext = "3"; 
+      }
+      else // strip .
+      {
+        ext = ext.mid(1);
+      }
+    }
+    if (ext.at(0)<='0' || ext.at(0)>='9')
+    {
+      ext.prepend("3");
+    }
   }
   return ext;
 }
@@ -50,7 +68,7 @@ ManGenerator::ManGenerator() : OutputGenerator()
 {
   dir=Config_getString("MAN_OUTPUT")+"/man" + getExtension();
   firstCol=TRUE;
-  paragraph=FALSE;
+  paragraph=TRUE;
   col=0;
   upperCase=FALSE;
   insideTabbing=FALSE;
@@ -129,8 +147,8 @@ static QCString buildFileName(const char *name)
     }
   }
 
-  QCString &manExtension = Config_getString("MAN_EXTENSION");
-  if (fileName.right(2)!=manExtension) 
+  QCString manExtension = "." + getExtension();
+  if (fileName.right(manExtension.length())!=manExtension) 
   {
     fileName+=manExtension;
   }
@@ -313,7 +331,7 @@ void ManGenerator::codify(const char *str)
         case '\n':  t << "\n"; firstCol=TRUE; col=0; break;
         case '\\':  t << "\\"; col++; break;
         case '\"':  c = '\''; // no break!
-        default:    t << c; firstCol=FALSE; col++; break;
+        default:    p=writeUtf8Char(t,p-1); firstCol=FALSE; col++; break;
       }
     }
     //printf("%s",str);fflush(stdout);
@@ -798,4 +816,12 @@ void ManGenerator::endLabels()
 {
 }
 
+void ManGenerator::endHeaderSection()
+{
+  if (!firstCol) 
+  { 
+    t<< endl; firstCol=TRUE; 
+  }
+}
+
 
index f40d0c3..eda360e 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -95,7 +95,7 @@ class ManGenerator : public OutputGenerator
     void startMemberSections() {}
     void endMemberSections() {}
     void startHeaderSection() {}
-    void endHeaderSection() {}
+    void endHeaderSection();
     void startMemberHeader(const char *);
     void endMemberHeader();
     void insertMemberAlign(bool) {}
@@ -229,6 +229,7 @@ class ManGenerator : public OutputGenerator
     void endParameterName(bool,bool,bool) {}
     void startParameterList(bool) {}
     void endParameterList() {}
+    void exceptionEntry(const char*,bool) {}
 
     void startFontClass(const char *) {}
     void endFontClass() {}
@@ -256,7 +257,6 @@ class ManGenerator : public OutputGenerator
     void endLabels();
 
     void writeCodeAnchor(const char *) {}
-    void linkableSymbol(int,const char *,Definition *,Definition *) {}
     void setCurrentDoc(Definition *,const char *,bool) {}
     void addWord(const char *,bool) {}
 
index 15b36a3..a3ac468 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -192,15 +192,16 @@ static QCString isBlockCommand(const char *data,int offset,int size)
   {
     return "}";
   }
-  else if (blockName=="dot"       || 
-           blockName=="code"      || 
-           blockName=="msc"       ||
-           blockName=="verbatim"  || 
-           blockName=="latexonly" || 
-           blockName=="htmlonly"  ||
-           blockName=="xmlonly"   ||
-           blockName=="rtfonly"   ||
-           blockName=="manonly"
+  else if (blockName=="dot"         || 
+           blockName=="code"        || 
+           blockName=="msc"         ||
+           blockName=="verbatim"    || 
+           blockName=="latexonly"   || 
+           blockName=="htmlonly"    ||
+           blockName=="xmlonly"     ||
+           blockName=="rtfonly"     ||
+           blockName=="manonly"     ||
+           blockName=="docbookonly"
      )
   {
     return "end"+blockName;
@@ -291,7 +292,7 @@ static int findEmphasisChar(const char *data, int size, char c, int c_size)
           if ((data[i]=='\\' || data[i]=='@') && // command
               data[i-1]!='\\' && data[i-1]!='@') // not escaped
           {
-            if (strncmp(&data[i+1],endBlockName,l)==0)
+            if (qstrncmp(&data[i+1],endBlockName,l)==0)
             {
               break;
             }
@@ -472,6 +473,25 @@ static int processNmdash(GrowBuf &out,const char *data,int,int size)
   return 0;
 }
 
+/** Process quoted section "...", can contain one embedded newline */
+static int processQuoted(GrowBuf &out,const char *data,int,int size)
+{
+  int i=1;
+  int nl=0;
+  while (i<size && data[i]!='"' && nl<2) 
+  {
+    if (data[i]=='\n') nl++;
+    i++;
+  }
+  if (i<size && data[i]=='"' && nl<2)
+  {
+    out.addStr(data,i+1);
+    return i+1;
+  }
+  // not a quoted section
+  return 0;
+}
+
 /** Process a HTML tag. Note that <pre>..</pre> are treated specially, in
  *  the sense that all code inside is written unprocessed
  */
@@ -960,7 +980,7 @@ static int processSpecialCommand(GrowBuf &out, const char *data, int offset, int
       if ((data[i]=='\\' || data[i]=='@') && // command
           data[i-1]!='\\' && data[i-1]!='@') // not escaped
       {
-        if (strncmp(&data[i+1],endBlockName,l)==0)
+        if (qstrncmp(&data[i+1],endBlockName,l)==0)
         {
           //printf("found end at %d\n",i);
           out.addStr(data,i+1+l);
@@ -1175,13 +1195,13 @@ static int isHRuler(const char *data,int size)
 static QCString extractTitleId(QCString &title)
 {
   //static QRegExp r1("^[a-z_A-Z][a-z_A-Z0-9\\-]*:");
-  static QRegExp r2("\\{#[a-z_A-Z][a-z_A-Z0-9\\-]*\\}$");
+  static QRegExp r2("\\{#[a-z_A-Z][a-z_A-Z0-9\\-]*\\}");
   int l=0;
   int i = r2.match(title,0,&l);
-  if (i!=-1) // found {#id} style id
+  if (i!=-1 && title.mid(i+l).stripWhiteSpace().isEmpty()) // found {#id} style id
   {
     QCString id = title.mid(i+2,l-3);
-    title = title.left(i)+title.mid(i+l);
+    title = title.left(i);
     //printf("found id='%s' title='%s'\n",id.data(),title.data());
     return id;
   }
@@ -1429,11 +1449,11 @@ static bool isCodeBlock(const char *data,int offset,int size,int &indent)
  */
 int findTableColumns(const char *data,int size,int &start,int &end,int &columns)
 {
-  int i=0;
+  int i=0,n=0;
   int eol;
   // find start character of the table line
   while (i<size && data[i]==' ') i++;
-  if (i<size && data[i]=='|') i++; // leading | does not count
+  if (i<size && data[i]=='|' && data[i]!='\n') i++,n++; // leading | does not count
   start = i;
 
   // find end character of the table line
@@ -1441,20 +1461,25 @@ int findTableColumns(const char *data,int size,int &start,int &end,int &columns)
   eol=i+1;
   i--;
   while (i>0 && data[i]==' ') i--;
-  if (i>0 && data[i]=='|') i--; // trailing | does not count
+  if (i>0 && data[i]=='|') i--,n++; // trailing | does not count
   end = i;
 
   // count columns between start and end
-  columns=1;
+  columns=0;
   if (end>start)
   {
     i=start;
-    while (i<=end)
+    while (i<=end) // look for more column markers
     {
       if (data[i]=='|' && (i==0 || data[i-1]!='\\')) columns++;
+      if (columns==1) columns++; // first | make a non-table into a two column table
       i++;
     }
   }
+  if (n==2 && columns==0) // table row has | ... |
+  {
+    columns++;
+  }
   //printf("findTableColumns(start=%d,end=%d,columns=%d) eol=%d\n",
   //    start,end,columns,eol);
   return eol;
@@ -1467,7 +1492,7 @@ static bool isTableBlock(const char *data,int size)
 
   // the first line should have at least two columns separated by '|'
   int i = findTableColumns(data,size,start,end,cc0);
-  if (i>=size || cc0<2
+  if (i>=size || cc0<1
   {
     //printf("isTableBlock: no |'s in the header\n");
     return FALSE;
@@ -1560,9 +1585,9 @@ static int writeTableBlock(GrowBuf &out,const char *data,int size)
     out.addStr("<th");
     switch (columnAlignment[k])
     {
-      case AlignLeft:   out.addStr(" align=left"); break;
-      case AlignRight:  out.addStr(" align=right"); break;
-      case AlignCenter: out.addStr(" align=center"); break;
+      case AlignLeft:   out.addStr(" align=\"left\""); break;
+      case AlignRight:  out.addStr(" align=\"right\""); break;
+      case AlignCenter: out.addStr(" align=\"center\""); break;
       case AlignNone:   break;
     }
     out.addStr(">");
@@ -1572,6 +1597,7 @@ static int writeTableBlock(GrowBuf &out,const char *data,int size)
     }
     m++;
   }
+  out.addStr("\n</th>\n");
 
   // write table cells
   while (i<size)
@@ -1591,9 +1617,9 @@ static int writeTableBlock(GrowBuf &out,const char *data,int size)
         out.addStr("<td");
         switch (columnAlignment[k])
         {
-          case AlignLeft:   out.addStr(" align=left"); break;
-          case AlignRight:  out.addStr(" align=right"); break;
-          case AlignCenter: out.addStr(" align=center"); break;
+          case AlignLeft:   out.addStr(" align=\"left\""); break;
+          case AlignRight:  out.addStr(" align=\"right\""); break;
+          case AlignCenter: out.addStr(" align=\"center\""); break;
           case AlignNone:   break;
         }
         out.addStr(">");
@@ -1615,7 +1641,7 @@ static int writeTableBlock(GrowBuf &out,const char *data,int size)
     i+=ret;
   }
 
-  out.addStr("</table>\n");
+  out.addStr("</table> ");
 
   delete[] columnAlignment;
   return i;
@@ -1814,7 +1840,7 @@ static void findEndOfLine(GrowBuf &out,const char *data,int size,
               data[end-1]!='\\' && data[end-1]!='@'
              )
           {
-            if (strncmp(&data[end+1],endBlockName,l)==0)
+            if (qstrncmp(&data[end+1],endBlockName,l)==0)
             {
               if (pi!=-1) // output previous line if available
               {
@@ -1977,6 +2003,7 @@ static QCString processBlocks(const QCString &s,int indent)
         QCString header,id;
         convertStringFragment(header,data+pi,i-pi-1);
         id = extractTitleId(header);
+        //printf("header='%s' is='%s'\n",header.data(),id.data());
         if (!header.isEmpty())
         {
           if (!id.isEmpty())
@@ -1985,7 +2012,7 @@ static QCString processBlocks(const QCString &s,int indent)
             out.addStr(id);
             out.addStr(" ");
             out.addStr(header);
-            out.addStr("\n");
+            out.addStr("\n\n");
             SectionInfo *si = new SectionInfo(g_fileName,id,header,
                 level==1 ? SectionInfo::Section : SectionInfo::Subsection,level);
             if (g_current)
@@ -1998,7 +2025,7 @@ static QCString processBlocks(const QCString &s,int indent)
           {
             out.addStr(level==1?"<h1>":"<h2>");
             out.addStr(header);
-            out.addStr(level==1?"</h1>\n":"</h2>\n");
+            out.addStr(level==1?"\n</h1>\n":"\n</h2>\n");
           }
         }
         else
@@ -2081,12 +2108,17 @@ static QCString processBlocks(const QCString &s,int indent)
 
 static QCString extractPageTitle(QCString &docs,QCString &id)
 {
+  int ln=0;
   // first first non-empty line
   QCString title;
   const char *data = docs.data();
   int i=0;
   int size=docs.size();
-  while (i<size && (data[i]==' ' || data[i]=='\n')) i++;
+  while (i<size && (data[i]==' ' || data[i]=='\n')) 
+  {
+    if (data[i]=='\n') ln++;
+    i++;
+  }
   if (i>=size) return "";
   int end1=i+1;
   while (end1<size && data[end1-1]!='\n') end1++;
@@ -2094,13 +2126,16 @@ static QCString extractPageTitle(QCString &docs,QCString &id)
   // first line from i..end1
   if (end1<size)
   {
+    ln++;
     // second line form end1..end2
     int end2=end1+1;
     while (end2<size && data[end2-1]!='\n') end2++;
     if (isHeaderline(data+end1,size-end1))
     {
       convertStringFragment(title,data+i,end1-i-1);
-      docs=docs.mid(end2);
+      QCString lns;
+      lns.fill('\n',ln);
+      docs=lns+docs.mid(end2);
       id = extractTitleId(title);
       //printf("extractPageTitle(title='%s' docs='%s' id='%s')\n",title.data(),docs.data(),id.data());
       return title;
@@ -2148,6 +2183,18 @@ static QCString detab(const QCString &s,int &refIndent)
         break;
       default: // non-whitespace => update minIndent
         out.addChar(c);
+        if (c<0 && i<size) // multibyte sequence
+        {
+          out.addChar(data[i++]); // >= 2 bytes
+          if (((uchar)c&0xE0)==0xE0 && i<size)
+          {
+            out.addChar(data[i++]); // 3 bytes
+          }
+          if (((uchar)c&0xF0)==0xF0 && i<size)
+          {
+            out.addChar(data[i++]); // 4 byres
+          }
+        }
         if (col<minIndent) minIndent=col;
         col++;
     }
@@ -2175,6 +2222,7 @@ QCString processMarkdown(const QCString &fileName,Entry *e,const QCString &input
     g_actions[(unsigned int)'!']=processLink;
     g_actions[(unsigned int)'<']=processHtmlTag;
     g_actions[(unsigned int)'-']=processNmdash;
+    g_actions[(unsigned int)'"']=processQuoted;
     init=TRUE;
   }
 
@@ -2206,16 +2254,19 @@ QCString processMarkdown(const QCString &fileName,Entry *e,const QCString &input
 
 void MarkdownFileParser::parseInput(const char *fileName, 
                 const char *fileBuf, 
-                Entry *root)
+                Entry *root,
+                bool /*sameTranslationUnit*/,
+                QStrList & /*filesInSameTranslationUnit*/)
 {
   Entry *current = new Entry;
   current->lang = SrcLangExt_Markdown;
   current->fileName = fileName;
   current->docFile  = fileName;
-  int len = strlen(fileBuf);
+  current->docLine  = 1;
+  int len = qstrlen(fileBuf);
   BufStr input(len);
   BufStr output(len);
-  input.addArray(fileBuf,strlen(fileBuf));
+  input.addArray(fileBuf,qstrlen(fileBuf));
   input.addChar('\0');
   convertCppComments(&input,&output,fileName);
   output.addChar('\0');
@@ -2223,12 +2274,15 @@ void MarkdownFileParser::parseInput(const char *fileName,
   QCString id;
   QCString title=extractPageTitle(docs,id).stripWhiteSpace();
   //g_correctSectionLevel = !title.isEmpty();
-  QCString baseFn = QFileInfo(fileName).baseName().utf8();
-  QCString fn     = QFileInfo(fileName).fileName().utf8();
-  QCString baseName = substitute(baseFn," ","_");
+  QCString baseFn  = stripFromPath(QFileInfo(fileName).absFilePath().utf8());
+  int i = baseFn.findRev('.');
+  if (i!=-1) baseFn = baseFn.left(i);
+  QCString titleFn = QFileInfo(fileName).baseName().utf8();
+  QCString fn      = QFileInfo(fileName).fileName().utf8();
+  QCString baseName = substitute(substitute(baseFn," ","_"),"/","_");
   static QCString mdfileAsMainPage = Config_getString("USE_MDFILE_AS_MAINPAGE");
   if (id.isEmpty()) id = "md_"+baseName;
-  if (title.isEmpty()) title = baseName;
+  if (title.isEmpty()) title = titleFn;
   if (fn==mdfileAsMainPage)
   {
     docs.prepend("@mainpage\n");
index f41de5e..71884d5 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -28,9 +28,13 @@ class MarkdownFileParser : public ParserInterface
 {
   public:
     virtual ~MarkdownFileParser() {}
+    void startTranslationUnit(const char *) {}
+    void finishTranslationUnit() {}
     void parseInput(const char *fileName, 
                     const char *fileBuf, 
-                    Entry *root);
+                    Entry *root,
+                    bool sameTranslationUnit,
+                    QStrList &filesInSameTranslationUnit);
     bool needsPreprocessing(const QCString &) { return FALSE; }
     void parseCode(CodeOutputInterface &codeOutIntf,
                    const char *scopeName,
index daf1850..a6b3e75 100644 (file)
@@ -33,6 +33,12 @@ void marshalUInt(StorageIntf *s,uint v)
   s->write((const char *)b,4);
 }
 
+void marshalUInt64(StorageIntf *s,uint64 v)
+{
+  marshalUInt(s, uint(v>>32));
+  marshalUInt(s, uint(v&0xFFFFFFFF));
+}
+
 void marshalBool(StorageIntf *s,bool b)
 {
   char c = b;
@@ -345,7 +351,7 @@ void marshalEntry(StorageIntf *s,Entry *e)
   marshalInt(s,e->section);
   marshalInt(s,(int)e->protection);
   marshalInt(s,(int)e->mtype);
-  marshalInt(s,e->spec);
+  marshalUInt64(s,e->spec);
   marshalInt(s,e->initLines);
   marshalBool(s,e->stat);
   marshalBool(s,e->explicitExternal);
@@ -391,6 +397,7 @@ void marshalEntry(StorageIntf *s,Entry *e)
   marshalBool(s,e->hidden);
   marshalBool(s,e->artificial);
   marshalInt(s,(int)e->groupDocType);
+  marshalQCString(s,e->id);
 }
 
 void marshalEntryTree(StorageIntf *s,Entry *e)
@@ -425,6 +432,13 @@ uint unmarshalUInt(StorageIntf *s)
   return result;
 }
 
+uint64 unmarshalUInt64(StorageIntf *s)
+{
+  uint64 result=uint64(unmarshalUInt(s))<<32;
+  result|=unmarshalUInt(s);
+  return result;
+}
+
 bool unmarshalBool(StorageIntf *s)
 {
   char result;
@@ -718,7 +732,7 @@ Entry * unmarshalEntry(StorageIntf *s)
   e->section          = unmarshalInt(s);
   e->protection       = (Protection)unmarshalInt(s);
   e->mtype            = (MethodTypes)unmarshalInt(s);
-  e->spec             = unmarshalInt(s);
+  e->spec             = unmarshalUInt64(s);
   e->initLines        = unmarshalInt(s);
   e->stat             = unmarshalBool(s);
   e->explicitExternal = unmarshalBool(s);
@@ -768,6 +782,7 @@ Entry * unmarshalEntry(StorageIntf *s)
   e->hidden           = unmarshalBool(s);
   e->artificial       = unmarshalBool(s);
   e->groupDocType     = (Entry::GroupDocType)unmarshalInt(s);
+  e->id               = unmarshalQCString(s);
   return e;
 }
 
index 3728339..977a89b 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -44,6 +44,7 @@ class Entry;
 
 void marshalInt(StorageIntf *s,int v);
 void marshalUInt(StorageIntf *s,uint v);
+void marshalUInt64(StorageIntf *s,uint64 v);
 void marshalBool(StorageIntf *s,bool b);
 void marshalQCString(StorageIntf *s,const QCString &str);
 void marshalQGString(StorageIntf *s,const QGString &str);
@@ -70,6 +71,7 @@ void marshalEntryTree(StorageIntf *s,Entry *e);
 
 int                  unmarshalInt(StorageIntf *s);
 uint                 unmarshalUInt(StorageIntf *s);
+uint64               unmarshalUInt64(StorageIntf *s);
 bool                 unmarshalBool(StorageIntf *s);
 QCString             unmarshalQCString(StorageIntf *s);
 QGString             unmarshalQGString(StorageIntf *s);
index 1482180..c5bf787 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
 #include "filedef.h"
 #include "config.h"
 
-#define START_MARKER 0x4D454D5B // MEM[
-#define END_MARKER   0x4D454D5D // MEM]
-
-#if defined(_OS_WIN32_)
-#define snprintf _snprintf
-#endif
-
-// Put this macro at the start of any method of MemberDef that can directly
-// or indirectly access other MemberDefs. It prevents that the content 
-// pointed to by m_impl gets flushed to disk in the middle of the method call!
-#define KEEP_RESIDENT_DURING_CALL makeResident();LockingPtr<MemberDef> lock(this,this)
-
 //-----------------------------------------------------------------------------
 
 int MemberDef::s_indentLevel = 0;
@@ -97,10 +85,43 @@ static QCString addTemplateNames(const QCString &s,const QCString &n,const QCStr
   return result;
 }
 
+// ol.startMemberDocName has already been done before this is called.
+// when this function returns TRUE, ol.endParameterList will be called.
+//
+// typical sequence:
+//   ol.startMemberDoc
+//   ol.startMemberDocName
+//   --- enter writeDefArgumentList
+//   ol.endMemberDocName
+//   ol.startParameterList
+//     ...
+//     ol.startParameterType(first=TRUE)
+//     ol.endParameterType
+//     ol.startParameterName
+//     ol.endParameterName(last==FALSE)
+//     ...
+//     ol.startParameterType(first=FALSE)
+//     ol.endParamtereType
+//     ol.startParameterName
+//     ol.endParameterName(last==TRUE)
+//     ...
+//   --- leave writeDefArgumentList with return value TRUE
+//   ol.endParameterList
+//   ol.endMemberDoc(hasArgs=TRUE)
+//
+//  For an empty list the function should return FALSE, the sequence is
+//   ol.startMemberDoc
+//   ol.startMemberDocName
+//   --- enter writeDefArgumentList
+//   --- leave writeDefArgumentList with return value FALSE
+//   ol.endMemberDocName
+//   ol.endMemberDoc(hasArgs=FALSE);
+//  
+
 static bool writeDefArgumentList(OutputList &ol,ClassDef *cd,
                                  const QCString & /*scopeName*/,MemberDef *md)
 {
-  LockingPtr<ArgumentList> defArgList=(md->isDocsForDefinition()) ? 
+  ArgumentList *defArgList=(md->isDocsForDefinition()) ? 
                              md->argumentList() : md->declArgumentList();
   //printf("writeDefArgumentList `%s' isDocsForDefinition()=%d\n",md->name().data(),md->isDocsForDefinition());
   if (defArgList==0 || md->isProperty()) 
@@ -112,7 +133,12 @@ static bool writeDefArgumentList(OutputList &ol,ClassDef *cd,
   // simple argument list for tcl
   if (md->getLanguage()==SrcLangExt_Tcl)
   {
+    if (defArgList->count()==0) return FALSE;
     Argument *a=defArgList->first();
+    ol.endMemberDocName();
+    ol.startParameterList(FALSE);
+    ol.startParameterType(TRUE,0);
+    ol.endParameterType();
     ol.startParameterName(FALSE);
     while (a) 
     {
@@ -126,8 +152,7 @@ static bool writeDefArgumentList(OutputList &ol,ClassDef *cd,
       }
       a=defArgList->next();
     }
-    ol.endParameterName(FALSE,FALSE,FALSE);
-    ol.endMemberDocName();
+    ol.endParameterName(TRUE,FALSE,FALSE);
     return TRUE;
   }
 
@@ -341,6 +366,68 @@ static bool writeDefArgumentList(OutputList &ol,ClassDef *cd,
   return TRUE;
 }
 
+static void writeExceptionListImpl(
+        OutputList &ol, ClassDef *cd, MemberDef *md, QCString const& exception)
+{
+  // this is ordinary exception spec - there must be a '('
+  int index = exception.find('(');
+  if (-1!=index)
+  {
+    ol.exceptionEntry(exception.left(index),false);
+    ++index; // paren in second column so skip it here
+    for (int comma = exception.find(',', index); -1!=comma; )
+    {
+      ++comma; // include comma
+      linkifyText(TextGeneratorOLImpl(ol),cd,md->getBodyDef(),md,
+                  exception.mid(index,comma-index));
+      ol.exceptionEntry(0,false);
+      index=comma;
+      comma = exception.find(',', index);
+    }
+    int close = exception.find(')', index);
+    if (-1!=close)
+    {
+      QCString type=removeRedundantWhiteSpace(exception.mid(index,close-index));
+      linkifyText(TextGeneratorOLImpl(ol),cd,md->getBodyDef(),md,type);
+      ol.exceptionEntry(0,true);
+    }
+    else
+        warn(md->getDefFileName(),md->getDefLine(),
+            "missing ) in exception list on member %s",qPrint(md->name()));
+  }
+  else
+  {
+    // fallback - is it possible to get here?
+    warn(md->getDefFileName(),md->getDefLine(),
+            "missing ( in exception list on member %s",qPrint(md->name()));
+    ol.docify(" ");
+    linkifyText(TextGeneratorOLImpl(ol),cd,md->getBodyDef(),md,exception);
+  }
+}
+
+static void writeExceptionList(OutputList &ol, ClassDef *cd, MemberDef *md)
+{
+  QCString exception(QCString(md->excpString()).stripWhiteSpace());
+  if ('{'==exception.at(0))
+  {
+    // this is an UNO IDL attribute - need special handling
+    int index = exception.find(';');
+    int oldIndex = 1;
+    while (-1 != index) // there should be no more than 2 (set / get)
+    {
+      // omit '{' and ';' -> "set raises (...)"
+      writeExceptionListImpl(ol,cd,md,exception.mid(oldIndex,index-oldIndex));
+      oldIndex=index+1;
+      index = exception.find(';',oldIndex);
+    }
+    // the rest is now just '}' - omit that
+  }
+  else
+  {
+    writeExceptionListImpl(ol,cd,md,exception);
+  }
+}
+
 static void writeTemplatePrefix(OutputList &ol,ArgumentList *al)
 {
   ol.docify("template<");
@@ -402,6 +489,7 @@ class MemberDefImpl
     NamespaceDef *nspace;     // the namespace this member is in.
 
     MemberDef  *enumScope;    // the enclosing scope, if this is an enum field
+    bool        livesInsideEnum; 
     MemberDef  *annEnumType;  // the anonymous enum that is the type of this member
     MemberList *enumFields;   // enumeration fields
 
@@ -433,7 +521,7 @@ class MemberDefImpl
     QCString enumBaseType;    // base type of the enum (C++11)
     int initLines;            // number of lines in the initializer
 
-    int  memSpec;             // The specifiers present for this member
+    uint64  memSpec;          // The specifiers present for this member
     MemberType mtype;         // returns the kind of member
     int maxInitLines;         // when the initializer will be displayed 
     int userInitLines;        // result of explicit \hideinitializer or \showinitializer
@@ -502,7 +590,7 @@ class MemberDefImpl
     ClassDef *category;
     MemberDef *categoryRelation;
 
-    bool tagDataWritten;
+    unsigned tagDataWritten;
 };
 
 MemberDefImpl::MemberDefImpl() :
@@ -554,6 +642,7 @@ void MemberDefImpl::init(Definition *def,
   exampleSDict=0;
   enumFields=0;
   enumScope=0;
+  livesInsideEnum=FALSE;
   defTmpArgLists=0;
   hasCallGraph = FALSE;
   hasCallerGraph = FALSE;
@@ -631,7 +720,7 @@ void MemberDefImpl::init(Definition *def,
   hasDocumentedReturnType = FALSE;
   docProvider = 0;
   isDMember = def->getDefFileName().right(2).lower()==".d";
-  tagDataWritten = FALSE;
+  tagDataWritten = 0; // save separate written status for file, group, class, etc.
 }
 
 
@@ -643,6 +732,7 @@ void MemberDefImpl::init(Definition *def,
  *
  * \param df File containing the definition of this member.
  * \param dl Line at which the member definition was found.
+ * \param dc Column at which the member definition was found.
  * \param t  A string representing the type of the member.
  * \param na A string representing the name of the member.
  * \param a  A string representing the arguments of the member.
@@ -653,25 +743,22 @@ void MemberDefImpl::init(Definition *def,
  *           \c Normal, \c Virtual, \c Pure.
  * \param s  A boolean that is true iff the member is static.
  * \param r  The relationship between the class and the member.
- * \param mt The kind of member. See #MemberDef::MemberType for a list of 
+ * \param mt The kind of member. See #MemberType for a list of 
  *           all types.
  * \param tal The template arguments of this member.
  * \param al  The arguments of this member. This is a structured form of 
  *            the string past as argument \a a.
  */
 
-MemberDef::MemberDef(const char *df,int dl,
+MemberDef::MemberDef(const char *df,int dl,int dc,
                      const char *t,const char *na,const char *a,const char *e,
                      Protection p,Specifier v,bool s,Relationship r,MemberType mt,
                      const ArgumentList *tal,const ArgumentList *al
-                    ) : Definition(df,dl,removeRedundantWhiteSpace(na))
+                    ) : Definition(df,dl,dc,removeRedundantWhiteSpace(na))
 {
   //printf("MemberDef::MemberDef(%s)\n",na);
-  m_storagePos=-1;
-  m_cacheHandle=-1;
   m_impl = new MemberDefImpl;
   m_impl->init(this,t,a,e,p,v,s,r,mt,tal,al);
-  m_flushPending = FALSE;
   m_isLinkableCached    = 0;
   m_isConstructorCached = 0;
   m_isDestructorCached  = 0;
@@ -679,10 +766,7 @@ MemberDef::MemberDef(const char *df,int dl,
 
 MemberDef::MemberDef(const MemberDef &md) : Definition(md)
 {
-  m_storagePos=-1;
-  m_cacheHandle=-1;
   m_impl = new MemberDefImpl;
-  m_flushPending = FALSE;
   m_isLinkableCached    = 0;
   m_isConstructorCached = 0;
   m_isDestructorCached  = 0;
@@ -690,7 +774,6 @@ MemberDef::MemberDef(const MemberDef &md) : Definition(md)
 
 MemberDef *MemberDef::deepCopy() const
 {
-  makeResident();
   //MemberDef *result = new MemberDef(getDefFileName(),getDefLine(),name());
   MemberDef *result = new MemberDef(*this);
   // first copy everything by reference
@@ -789,23 +872,15 @@ MemberDef::~MemberDef()
   delete m_impl;
   //printf("%p: ~MemberDef()\n",this);
   m_impl=0;
-  if (m_cacheHandle!=-1)
-  {
-    Doxygen::symbolCache->del(m_cacheHandle);
-    m_cacheHandle=-1;
-  }
 }
 
 void MemberDef::setReimplements(MemberDef *md)   
 { 
-  makeResident();
-
   m_impl->redefines = md;
 }
 
 void MemberDef::insertReimplementedBy(MemberDef *md)
 {
-  makeResident();
   if (m_impl->templateMaster)
   {
     m_impl->templateMaster->insertReimplementedBy(md);
@@ -819,19 +894,16 @@ void MemberDef::insertReimplementedBy(MemberDef *md)
 
 MemberDef *MemberDef::reimplements() const      
 { 
-  makeResident();
   return m_impl->redefines; 
 }
 
-LockingPtr<MemberList> MemberDef::reimplementedBy() const   
+MemberList *MemberDef::reimplementedBy() const   
 { 
-  makeResident();
-  return LockingPtr<MemberList>(this,m_impl->redefinedBy); 
+  return m_impl->redefinedBy; 
 }
 
 bool MemberDef::isReimplementedBy(ClassDef *cd) const
 {
-  makeResident();
   if (cd && m_impl->redefinedBy)
   {
     MemberListIterator mi(*m_impl->redefinedBy);
@@ -853,7 +925,6 @@ bool MemberDef::isReimplementedBy(ClassDef *cd) const
 
 void MemberDef::insertEnumField(MemberDef *md)
 {
-  makeResident();
   if (m_impl->enumFields==0) m_impl->enumFields=new MemberList(MemberListType_enumFields);
   m_impl->enumFields->append(md);
 }
@@ -861,7 +932,6 @@ void MemberDef::insertEnumField(MemberDef *md)
 bool MemberDef::addExample(const char *anchor,const char *nameStr,
                            const char *file)
 {
-  makeResident();
   //printf("%s::addExample(%s,%s,%s)\n",name().data(),anchor,nameStr,file);
   if (m_impl->exampleSDict==0) m_impl->exampleSDict = new ExampleSDict;
   if (m_impl->exampleSDict->find(nameStr)==0) 
@@ -879,7 +949,6 @@ bool MemberDef::addExample(const char *anchor,const char *nameStr,
 
 bool MemberDef::hasExamples()
 {
-  makeResident();
   if (m_impl->exampleSDict==0) 
     return FALSE;
   else
@@ -888,7 +957,6 @@ bool MemberDef::hasExamples()
 
 QCString MemberDef::getOutputFileBase() const
 {
-  makeResident();
   static bool separateMemberPages = Config_getBool("SEPARATE_MEMBER_PAGES");
   QCString baseName;
   //printf("Member: %s: templateMaster=%p group=%p classDef=%p nspace=%p fileDef=%p\n",
@@ -922,7 +990,7 @@ QCString MemberDef::getOutputFileBase() const
   if (baseName.isEmpty())
   {
     warn(getDefFileName(),getDefLine(),
-       "warning: Internal inconsistency: member %s does not belong to any"
+       "Internal inconsistency: member %s does not belong to any"
        " container!",qPrint(name())
       );
     return "dummy";
@@ -943,7 +1011,6 @@ QCString MemberDef::getOutputFileBase() const
 
 QCString MemberDef::getReference() const
 {
-  makeResident();
   QCString ref = Definition::getReference();
   if (!ref.isEmpty())
   {
@@ -974,7 +1041,6 @@ QCString MemberDef::getReference() const
 
 QCString MemberDef::anchor() const
 {
-  KEEP_RESIDENT_DURING_CALL;
   QCString result=m_impl->anc;
   if (m_impl->groupAlias)     return m_impl->groupAlias->anchor();
   if (m_impl->templateMaster) return m_impl->templateMaster->anchor();
@@ -998,7 +1064,6 @@ QCString MemberDef::anchor() const
 
 void MemberDef::_computeLinkableInProject()
 {
-  KEEP_RESIDENT_DURING_CALL;
   static bool extractStatic  = Config_getBool("EXTRACT_STATIC");
   m_isLinkableCached = 2; // linkable
   //printf("MemberDef::isLinkableInProject(name=%s)\n",name().data());
@@ -1070,28 +1135,24 @@ void MemberDef::_computeLinkableInProject()
 
 void MemberDef::setDocumentation(const char *d,const char *docFile,int docLine,bool stripWhiteSpace)
 {
-  makeResident();
   Definition::setDocumentation(d,docFile,docLine,stripWhiteSpace);
   m_isLinkableCached = 0;
 }
 
 void MemberDef::setBriefDescription(const char *b,const char *briefFile,int briefLine)
 {
-  makeResident();
   Definition::setBriefDescription(b,briefFile,briefLine);
   m_isLinkableCached = 0;
 }
 
 void MemberDef::setInbodyDocumentation(const char *d,const char *inbodyFile,int inbodyLine)
 {
-  makeResident();
   Definition::setInbodyDocumentation(d,inbodyFile,inbodyLine);
   m_isLinkableCached = 0;
 }
 
 void MemberDef::setHidden(bool b)
 {
-  makeResident();
   Definition::setHidden(b);
   m_isLinkableCached = 0;
 }
@@ -1109,7 +1170,6 @@ bool MemberDef::isLinkableInProject() const
 
 bool MemberDef::isLinkable() const
 {
-  makeResident();
   if (m_impl->templateMaster)
   {
     return m_impl->templateMaster->isLinkable();
@@ -1125,7 +1185,6 @@ void MemberDef::setDefinitionTemplateParameterLists(QList<ArgumentList> *lists)
 {
   if (lists)
   {
-    makeResident();
     if (m_impl->defTmpArgLists) delete m_impl->defTmpArgLists;
     m_impl->defTmpArgLists = copyArgumentLists(lists);
   }
@@ -1134,13 +1193,16 @@ void MemberDef::setDefinitionTemplateParameterLists(QList<ArgumentList> *lists)
 void MemberDef::writeLink(OutputList &ol,ClassDef *,NamespaceDef *,
                       FileDef *fd,GroupDef *gd,bool onlyText)
 {
-  KEEP_RESIDENT_DURING_CALL;
   SrcLangExt lang = getLanguage();
   static bool hideScopeNames     = Config_getBool("HIDE_SCOPE_NAMES");
   QCString sep = getLanguageSpecificSeparator(lang,TRUE);
   QCString n = name();
   if (!hideScopeNames)
   {
+    if (m_impl->enumScope && m_impl->livesInsideEnum)
+    {
+      n.prepend(m_impl->enumScope->displayName()+sep);
+    }
     if (m_impl->classDef && gd && !isRelated()) 
     {
       n.prepend(m_impl->classDef->displayName()+sep);
@@ -1183,12 +1245,7 @@ void MemberDef::writeLink(OutputList &ol,ClassDef *,NamespaceDef *,
  */
 ClassDef *MemberDef::getClassDefOfAnonymousType() 
 {
-  // split KEEP_RESIDENT_DURING_CALL for performance
-  makeResident();
   if (m_impl->cachedAnonymousType) return m_impl->cachedAnonymousType;
-  LockingPtr<MemberDef> lock(this,this); // since this memberDef can access 
-                                         // other memberDefs prevent it from 
-                                         // being flushed to disk halfway
 
   QCString cname;
   if (getClassDef()!=0) 
@@ -1253,8 +1310,6 @@ bool MemberDef::isBriefSectionVisible() const
   //    "", //getFileDef()->name().data(),
   //    argsString());
 
-  KEEP_RESIDENT_DURING_CALL;
-
   MemberGroupInfo *info = Doxygen::memGrpInfoDict[m_impl->grpId];
   //printf("name=%s m_impl->grpId=%d info=%p\n",name().data(),m_impl->grpId,info);
   //QCString *pMemGrp = Doxygen::memberDocDict[grpId];
@@ -1338,14 +1393,13 @@ bool MemberDef::isBriefSectionVisible() const
 
 void MemberDef::writeDeclaration(OutputList &ol,
                ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd,
-               bool inGroup,ClassDef *inheritedFrom,const char *inheritId
-               )
+               bool inGroup, const DefType compoundType, 
+               ClassDef *inheritedFrom,const char *inheritId)
 {
   //printf("%s MemberDef::writeDeclaration() inGroup=%d\n",qualifiedName().data(),inGroup);
 
   // hide enum value, since they appear already as part of the enum, unless they
   // are explicitly grouped.
-  KEEP_RESIDENT_DURING_CALL;
   if (!inGroup && m_impl->mtype==MemberType_EnumValue) return;
 
   // hide members whose brief section should not be visible
@@ -1355,7 +1409,7 @@ void MemberDef::writeDeclaration(OutputList &ol,
   ASSERT (cd!=0 || nd!=0 || fd!=0 || gd!=0); // member should belong to something
   if (cd) d=cd; else if (nd) d=nd; else if (fd) d=fd; else d=gd;
 
-  _writeTagData();
+  _writeTagData(compoundType);
 
   QCString cname  = d->name();
   QCString cdname = d->displayName();
@@ -1469,7 +1523,7 @@ void MemberDef::writeDeclaration(OutputList &ol,
                     ltype.left(i),           // text
                     TRUE                     // autoBreak
                    ); 
-        getAnonymousEnumType()->writeEnumDeclaration(ol,cd,nd,fd,gd);
+        getAnonymousEnumType()->writeEnumDeclaration(ol,cd,nd,fd,gd,compoundType);
         //ol+=*getAnonymousEnumType()->enumDecl();
         linkifyText(TextGeneratorOLImpl(ol),d,m_impl->fileDef,this,ltype.right(ltype.length()-i-l),TRUE); 
       }
@@ -1715,35 +1769,42 @@ void MemberDef::writeDeclaration(OutputList &ol,
       /* && !annMemb */
      )
   {
-    ol.startMemberDescription(anchor(),inheritId);
-    ol.parseDoc(briefFile(),briefLine(),
+    DocRoot *rootNode = validatingParseDoc(briefFile(),briefLine(),
                 getOuterScope()?getOuterScope():d,this,briefDescription(),
                 TRUE,FALSE,0,TRUE,FALSE);
-    if (detailsVisible) 
+
+    if (rootNode && !rootNode->isEmpty())
     {
-      ol.pushGeneratorState();
-      ol.disableAllBut(OutputGenerator::Html);
-      //ol.endEmphasis();
-      ol.docify(" ");
-      if (m_impl->group!=0 && gd==0) // forward link to the group
+      ol.startMemberDescription(anchor(),inheritId);
+      ol.writeDoc(rootNode,getOuterScope()?getOuterScope():d,this);
+      if (detailsVisible) 
       {
-        ol.startTextLink(getOutputFileBase(),anchor());
-      }
-      else // local link
-      {
-        ol.startTextLink(0,anchor());
+        ol.pushGeneratorState();
+        ol.disableAllBut(OutputGenerator::Html);
+        //ol.endEmphasis();
+        ol.docify(" ");
+        if (m_impl->group!=0 && gd==0) // forward link to the group
+        {
+          ol.startTextLink(getOutputFileBase(),anchor());
+        }
+        else // local link
+        {
+          ol.startTextLink(0,anchor());
+        }
+        ol.parseText(theTranslator->trMore());
+        ol.endTextLink();
+        //ol.startEmphasis();
+        ol.popGeneratorState();
       }
-      ol.endTextLink();
-      //ol.startEmphasis();
-      ol.popGeneratorState();
-    }
-    // for RTF we need to add an extra empty paragraph
-    ol.pushGeneratorState();
-    ol.disableAllBut(OutputGenerator::RTF);
+      // for RTF we need to add an extra empty paragraph
+      ol.pushGeneratorState();
+      ol.disableAllBut(OutputGenerator::RTF);
       ol.startParagraph();
       ol.endParagraph();
-    ol.popGeneratorState();
-    ol.endMemberDescription();
+      ol.popGeneratorState();
+      ol.endMemberDescription();
+    }
+    delete rootNode;
   }
 
   ol.endMemberDeclaration(anchor(),inheritId);
@@ -1760,8 +1821,6 @@ bool MemberDef::isDetailedSectionLinkable() const
   static bool hideUndocMembers  = Config_getBool("HIDE_UNDOC_MEMBERS");
   static bool extractStatic     = Config_getBool("EXTRACT_STATIC");
 
-  KEEP_RESIDENT_DURING_CALL;
-
   // the member has details documentation for any of the following reasons
   bool docFilter = 
          // treat everything as documented
@@ -1787,6 +1846,8 @@ bool MemberDef::isDetailedSectionLinkable() const
          (hasMultiLineInitializer() && !hideUndocMembers) ||
          // has one or more documented arguments
          (m_impl->defArgList!=0 && m_impl->defArgList->hasDocumentation()) ||
+         // is an attribute or property - need to display that tag
+         (m_impl->memSpec & (Entry::Attribute|Entry::Property)) ||
          // has user comments
          Doxygen::userComments
          ; 
@@ -1876,7 +1937,7 @@ void MemberDef::_getLabels(QStrList &sl,Definition *container) const
         if      (isGettable())            sl.append("get");
         if      (isSettable())            sl.append("set");
         if      (isAddable())             sl.append("add");
-        if      (isRemovable())           sl.append("remove");
+        if      (!isUNOProperty() && isRemovable()) sl.append("remove");
         if      (isRaisable())            sl.append("raise");
         if      (isReadable())            sl.append("read");
         if      (isWritable())            sl.append("write");
@@ -1913,6 +1974,17 @@ void MemberDef::_getLabels(QStrList &sl,Definition *container) const
           if      (isDefault())             sl.append("default");
           if      (isDelete())              sl.append("delete");
           if      (isNoExcept())            sl.append("noexcept");
+          if      (isAttribute())           sl.append("attribute");
+          if      (isUNOProperty())         sl.append("property");
+          if      (isReadonly())            sl.append("readonly");
+          if      (isBound())               sl.append("bound");
+          if      (isUNOProperty() && isRemovable()) sl.append("removable");
+          if      (isConstrained())         sl.append("constrained");
+          if      (isTransient())           sl.append("transient");
+          if      (isMaybeVoid())           sl.append("maybevoid");
+          if      (isMaybeDefault())        sl.append("maybedefault");
+          if      (isMaybeAmbiguous())      sl.append("maybeambiguous");
+          if      (isPublished())           sl.append("published"); // enum
         }
         if (isObjCProperty() && isImplementation())
         {
@@ -1945,7 +2017,7 @@ void MemberDef::_writeCallGraph(OutputList &ol)
     DotCallGraph callGraph(this,FALSE);
     if (callGraph.isTooBig())
     {
-       err("warning: Call graph for '%s' not generated, too many nodes. Consider increasing DOT_GRAPH_MAX_NODES.\n",qPrint(qualifiedName()));
+       warn_uncond("Call graph for '%s' not generated, too many nodes. Consider increasing DOT_GRAPH_MAX_NODES.\n",qPrint(qualifiedName()));
     }
     else if (!callGraph.isTrivial())
     {
@@ -1970,7 +2042,7 @@ void MemberDef::_writeCallerGraph(OutputList &ol)
     DotCallGraph callerGraph(this, TRUE);
     if (callerGraph.isTooBig())
     {
-       err("warning: Caller graph for '%s' not generated, too many nodes. Consider increasing DOT_GRAPH_MAX_NODES.\n",qPrint(qualifiedName()));
+       warn_uncond("Caller graph for '%s' not generated, too many nodes. Consider increasing DOT_GRAPH_MAX_NODES.\n",qPrint(qualifiedName()));
     }
     else if (!callerGraph.isTrivial() && !callerGraph.isTooBig())
     {
@@ -2038,7 +2110,7 @@ void MemberDef::_writeReimplements(OutputList &ol)
       }
       else
       {
-        err("error: translation error: no marker in trReimplementsFromList()\n");
+        err("translation error: no marker in trReimplementsFromList()\n");
       }
       ol.endParagraph();
     }
@@ -2047,8 +2119,8 @@ void MemberDef::_writeReimplements(OutputList &ol)
 
 void MemberDef::_writeReimplementedBy(OutputList &ol)
 {
-  LockingPtr<MemberList> bml=reimplementedBy();
-  if (bml!=0)
+  MemberList *bml=reimplementedBy();
+  if (bml)
   {
     MemberListIterator mli(*bml);
     MemberDef *bmd=0;
@@ -2202,9 +2274,9 @@ void MemberDef::_writeEnumValues(OutputList &ol,Definition *container,
   if (isEnumerate())
   {
     bool first=TRUE;
-    LockingPtr<MemberList> fmdl=enumFieldList();
+    MemberList *fmdl=enumFieldList();
     //printf("** %s: enum values=%d\n",name().data(),fmdl!=0 ? fmdl->count() : 0);
-    if (fmdl!=0)
+    if (fmdl)
     {
       MemberDef *fmd=fmdl->first();
       while (fmd)
@@ -2251,7 +2323,7 @@ void MemberDef::_writeEnumValues(OutputList &ol,Definition *container,
 
           if (hasBrief)
           { 
-            ol.parseDoc(fmd->briefFile(),fmd->briefLine(),
+            ol.generateDoc(fmd->briefFile(),fmd->briefLine(),
                 getOuterScope()?getOuterScope():container,
                 fmd,fmd->briefDescription(),TRUE,FALSE);
           }
@@ -2263,7 +2335,7 @@ void MemberDef::_writeEnumValues(OutputList &ol,Definition *container,
           //}
           if (hasDetails)
           { 
-            ol.parseDoc(fmd->docFile(),fmd->docLine(),
+            ol.generateDoc(fmd->docFile(),fmd->docLine(),
                 getOuterScope()?getOuterScope():container,
                 fmd,fmd->documentation()+"\n",TRUE,FALSE);
           }
@@ -2306,8 +2378,6 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
   if ( !hasDocs ) return;
   if (isEnumValue() && !showEnumValues) return;
 
-  KEEP_RESIDENT_DURING_CALL;
-
   SrcLangExt lang = getLanguage();
   //printf("member=%s lang=%d\n",name().data(),lang);
   bool optVhdl = lang==SrcLangExt_VHDL;
@@ -2391,7 +2461,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
         ol.startDoxyAnchor(cfname,cname,memAnchor,doxyName,doxyArgs);
         ol.startMemberDoc(ciname,name(),memAnchor,name(),showInline);
         linkifyText(TextGeneratorOLImpl(ol),container,getBodyDef(),this,ldef.left(i));
-        vmd->writeEnumDeclaration(ol,getClassDef(),getNamespaceDef(),getFileDef(),getGroupDef());
+        vmd->writeEnumDeclaration(ol,getClassDef(),getNamespaceDef(),getFileDef(),getGroupDef(),definitionType());
         linkifyText(TextGeneratorOLImpl(ol),container,getBodyDef(),this,ldef.right(ldef.length()-i-l));
         
         found=TRUE;
@@ -2554,8 +2624,8 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
     }
     if (excpString()) // add exception list
     {
-      ol.docify(" ");
-      linkifyText(TextGeneratorOLImpl(ol),container,getBodyDef(),this,excpString());
+      writeExceptionList(ol,cd,this);
+      hasParameterList=true; // call endParameterList below
     }
   }
 
@@ -2638,7 +2708,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
 
   QCString brief           = briefDescription();
   QCString detailed        = documentation();
-  LockingPtr<ArgumentList> docArgList = LockingPtr<ArgumentList>(this,m_impl->defArgList);
+  ArgumentList *docArgList = m_impl->defArgList;
   if (m_impl->templateMaster)
   {
     brief      = m_impl->templateMaster->briefDescription();
@@ -2654,7 +2724,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
      )  
   { 
     ol.startParagraph();
-    ol.parseDoc(briefFile(),briefLine(),
+    ol.generateDoc(briefFile(),briefLine(),
                 getOuterScope()?getOuterScope():container,this,
                 brief,FALSE,FALSE,0,TRUE,FALSE);
     ol.endParagraph();
@@ -2672,12 +2742,12 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
     }
     else
     {
-      ol.parseDoc(docFile(),docLine(),getOuterScope()?getOuterScope():container,this,detailed+"\n",TRUE,FALSE);
+      ol.generateDoc(docFile(),docLine(),getOuterScope()?getOuterScope():container,this,detailed+"\n",TRUE,FALSE);
     }
    
     if (!inbodyDocumentation().isEmpty())
     {
-      ol.parseDoc(inbodyFile(),inbodyLine(),
+      ol.generateDoc(inbodyFile(),inbodyLine(),
                   getOuterScope()?getOuterScope():container,this,
                   inbodyDocumentation()+"\n",TRUE,FALSE);
     }
@@ -2687,7 +2757,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
   {
     if (!inbodyDocumentation().isEmpty())
     {
-      ol.parseDoc(inbodyFile(),inbodyLine(),getOuterScope()?getOuterScope():container,this,inbodyDocumentation()+"\n",TRUE,FALSE);
+      ol.generateDoc(inbodyFile(),inbodyLine(),getOuterScope()?getOuterScope():container,this,inbodyDocumentation()+"\n",TRUE,FALSE);
     }
   }
 
@@ -2710,7 +2780,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
       }
     }
     // feed the result to the documentation parser
-    ol.parseDoc(
+    ol.generateDoc(
         docFile(),docLine(),
         getOuterScope()?getOuterScope():container,
         this,         // memberDef
@@ -2761,13 +2831,13 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
     if (!hasDocumentedParams())
     {
       warn_doc_error(docFile(),docLine(),
-          "warning: parameters of member %s are not (all) documented",
+          "parameters of member %s are not (all) documented",
           qPrint(qualifiedName()));
     }
     if (!hasDocumentedReturnType() && isFunction() && hasDocumentation())
     {
       warn_doc_error(docFile(),docLine(),
-          "warning: return type of member %s is not documented",
+          "return type of member %s is not documented",
           qPrint(qualifiedName()));
     }
   }
@@ -2839,8 +2909,6 @@ static Definition *getClassFromType(Definition *scope,const QCString &type,SrcLa
 
 void MemberDef::writeMemberDocSimple(OutputList &ol, Definition *container)
 {
-  KEEP_RESIDENT_DURING_CALL;
-
   Definition *scope  = getOuterScope();
   QCString doxyName  = name();
   QCString doxyArgs  = argsString();
@@ -2864,6 +2932,9 @@ void MemberDef::writeMemberDocSimple(OutputList &ol, Definition *container)
   {
     type = m_impl->type;
   }
+
+  if (isTypedef()) type.prepend("typedef ");
+
   QCString ts = simplifyTypeForTable(type);
 
   if (cd) // cd points to an anonymous struct pointed to by this member
@@ -2874,7 +2945,7 @@ void MemberDef::writeMemberDocSimple(OutputList &ol, Definition *container)
     const char **p = prefixes;
     while (*p)
     {
-      int l=strlen(*p);
+      int l=qstrlen(*p);
       if (ts.left(l)==*p)
       {
         ol.writeString(*p);
@@ -2923,7 +2994,7 @@ void MemberDef::writeMemberDocSimple(OutputList &ol, Definition *container)
       ) 
      )  
   { 
-    ol.parseDoc(briefFile(),briefLine(),
+    ol.generateDoc(briefFile(),briefLine(),
                 getOuterScope()?getOuterScope():container,this,
                 brief,FALSE,FALSE,0,TRUE,FALSE);
   }
@@ -2931,7 +3002,7 @@ void MemberDef::writeMemberDocSimple(OutputList &ol, Definition *container)
   /* write detailed description */
   if (!detailed.isEmpty())
   { 
-    ol.parseDoc(docFile(),docLine(),
+    ol.generateDoc(docFile(),docLine(),
                 getOuterScope()?getOuterScope():container,this,
                 detailed+"\n",FALSE,FALSE,0,FALSE,FALSE);
    
@@ -2942,7 +3013,6 @@ void MemberDef::writeMemberDocSimple(OutputList &ol, Definition *container)
 
 QCString MemberDef::memberTypeName() const
 {
-  makeResident();
   switch (m_impl->mtype)
   {
     case MemberType_Define:      return "macro definition";
@@ -2957,13 +3027,14 @@ QCString MemberDef::memberTypeName() const
     case MemberType_DCOP:        return "dcop";
     case MemberType_Property:    return "property";
     case MemberType_Event:       return "event";
+    case MemberType_Interface:   return "interface";
+    case MemberType_Service:     return "service";
     default:          return "unknown";
   }
 }
 
 void MemberDef::warnIfUndocumented()
 {
-  makeResident();
   if (m_impl->memberGroup) return;
   ClassDef     *cd = getClassDef();
   NamespaceDef *nd = getNamespaceDef();
@@ -2992,7 +3063,7 @@ void MemberDef::warnIfUndocumented()
       !isReference()
      )
   {
-    warn_undoc(getDefFileName(),getDefLine(),"warning: Member %s%s (%s) of %s %s is not documented.",
+    warn_undoc(getDefFileName(),getDefLine(),"Member %s%s (%s) of %s %s is not documented.",
          qPrint(name()),qPrint(argsString()),qPrint(memberTypeName()),t,qPrint(d->name()));
   }
 }
@@ -3001,7 +3072,6 @@ void MemberDef::warnIfUndocumented()
 
 bool MemberDef::isFriendClass() const
 {
-  makeResident();
   return (isFriend() && 
          (m_impl->type=="friend class" || m_impl->type=="friend struct" || 
           m_impl->type=="friend union"));
@@ -3009,7 +3079,6 @@ bool MemberDef::isFriendClass() const
 
 bool MemberDef::isDocumentedFriendClass() const
 {
-  makeResident();
   ClassDef *fcd=0;
   QCString baseName=name();
   int i=baseName.find('<');
@@ -3020,7 +3089,6 @@ bool MemberDef::isDocumentedFriendClass() const
 
 bool MemberDef::hasDocumentation() const
 { 
-  makeResident();
   return Definition::hasDocumentation() || 
          (m_impl->mtype==MemberType_Enumeration && m_impl->docEnumValues) ||  // has enum values
          (m_impl->defArgList!=0 && m_impl->defArgList->hasDocumentation()); // has doc arguments
@@ -3037,20 +3105,17 @@ bool MemberDef::hasUserDocumentation() const
 
 void MemberDef::setMemberGroup(MemberGroup *grp)
 {
-  makeResident();
   m_impl->memberGroup = grp;
 }
 
 bool MemberDef::visibleMemberGroup(bool hideNoHeader) 
 { 
-  makeResident();
   return m_impl->memberGroup!=0 && 
           (!hideNoHeader || m_impl->memberGroup->header()!="[NOHEADER]"); 
 }
 
 QCString MemberDef::getScopeString() const
 {
-  makeResident();
   QCString result;
   if (getClassDef()) result=getClassDef()->displayName();
   else if (getNamespaceDef()) result=getNamespaceDef()->displayName();
@@ -3084,7 +3149,6 @@ static QCString escapeAnchor(const QCString &anchor)
 
 void MemberDef::setAnchor()
 {
-  makeResident();
   QCString memAnchor = name();
   if (!m_impl->args.isEmpty()) memAnchor+=m_impl->args;
 
@@ -3098,7 +3162,7 @@ void MemberDef::setAnchor()
   if (m_impl->tArgList) 
   {
     char buf[20];
-    snprintf(buf,20,"%d:",m_impl->tArgList->count());
+    qsnprintf(buf,20,"%d:",m_impl->tArgList->count());
     buf[19]='\0';
     memAnchor.prepend(buf);
   }
@@ -3117,7 +3181,6 @@ void MemberDef::setGroupDef(GroupDef *gd,Grouping::GroupPri_t pri,
                             bool hasDocs,MemberDef *member)
 {
   //printf("%s MemberDef::setGroupDef(%s)\n",name().data(),gd->name().data());
-  makeResident();
   m_impl->group=gd;
   m_impl->grouppri=pri;
   m_impl->groupFileName=fileName;
@@ -3127,10 +3190,10 @@ void MemberDef::setGroupDef(GroupDef *gd,Grouping::GroupPri_t pri,
   m_isLinkableCached = 0; 
 }
 
-void MemberDef::setEnumScope(MemberDef *md) 
+void MemberDef::setEnumScope(MemberDef *md,bool livesInsideEnum
 { 
-  makeResident();
   m_impl->enumScope=md; 
+  m_impl->livesInsideEnum=livesInsideEnum;
   if (md->getGroupDef())
   {
     m_impl->group=md->getGroupDef();
@@ -3144,7 +3207,6 @@ void MemberDef::setEnumScope(MemberDef *md)
 
 void MemberDef::setMemberClass(ClassDef *cd)     
 { 
-  makeResident();
   m_impl->classDef=cd; 
   m_isLinkableCached = 0; 
   m_isConstructorCached = 0; 
@@ -3153,7 +3215,6 @@ void MemberDef::setMemberClass(ClassDef *cd)
 
 void MemberDef::setNamespace(NamespaceDef *nd) 
 { 
-  makeResident();
   m_impl->nspace=nd; 
   setOuterScope(nd); 
 }
@@ -3161,7 +3222,6 @@ void MemberDef::setNamespace(NamespaceDef *nd)
 MemberDef *MemberDef::createTemplateInstanceMember(
         ArgumentList *formalArgs,ArgumentList *actualArgs)
 {
-  KEEP_RESIDENT_DURING_CALL;
   //printf("  Member %s %s %s\n",typeString(),name().data(),argsString());
   ArgumentList *actualArgList = 0;
   if (m_impl->defArgList)
@@ -3186,7 +3246,7 @@ MemberDef *MemberDef::createTemplateInstanceMember(
   }
 
   MemberDef *imd = new MemberDef(
-                       getDefFileName(),getDefLine(),
+                       getDefFileName(),getDefLine(),getDefColumn(),
                        substituteTemplateArgumentsInString(m_impl->type,formalArgs,actualArgs), 
                        methodName, 
                        substituteTemplateArgumentsInString(m_impl->args,formalArgs,actualArgs), 
@@ -3206,7 +3266,6 @@ MemberDef *MemberDef::createTemplateInstanceMember(
 
 bool MemberDef::hasOneLineInitializer() const
 {
-  makeResident();
   //printf("%s: init=%s, initLines=%d maxInitLines=%d userInitLines=%d\n",
   //    name().data(),m_impl->initializer.data(),m_impl->initLines,
   //    m_impl->maxInitLines,m_impl->userInitLines);
@@ -3216,7 +3275,6 @@ bool MemberDef::hasOneLineInitializer() const
 
 bool MemberDef::hasMultiLineInitializer() const
 {
-  makeResident();
   //printf("initLines=%d userInitLines=%d maxInitLines=%d\n",
   //    initLines,userInitLines,maxInitLines);
   return m_impl->initLines>0 && 
@@ -3227,7 +3285,6 @@ bool MemberDef::hasMultiLineInitializer() const
 
 void MemberDef::setInitializer(const char *initializer)    
 { 
-  makeResident();
   m_impl->initializer=initializer; 
   int l=m_impl->initializer.length();
   int p=l-1;
@@ -3239,7 +3296,6 @@ void MemberDef::setInitializer(const char *initializer)
 
 void MemberDef::addListReference(Definition *)
 {
-  KEEP_RESIDENT_DURING_CALL;
   static bool optimizeOutputForC = Config_getBool("OPTIMIZE_OUTPUT_FOR_C");
   //static bool hideScopeNames     = Config_getBool("HIDE_SCOPE_NAMES");
   //static bool optimizeOutputJava = Config_getBool("OPTIMIZE_OUTPUT_JAVA");
@@ -3288,10 +3344,10 @@ void MemberDef::addListReference(Definition *)
       memArgs = argsString();
     }
   }
-  LockingPtr< QList<ListItemInfo> > xrefItems = xrefListItems();
-  if (xrefItems!=0)
+  QList<ListItemInfo> *xrefItems = xrefListItems();
+  if (xrefItems)
   {
-    addRefItem(xrefItems.pointer(),
+    addRefItem(xrefItems,
         qualifiedName()+argsString(), // argsString is needed for overloaded functions (see bug 609624)
         memLabel,
         getOutputFileBase()+"#"+anchor(),memName,memArgs);
@@ -3300,7 +3356,6 @@ void MemberDef::addListReference(Definition *)
 
 MemberList *MemberDef::getSectionList(Definition *d) const 
 { 
-  makeResident();
   char key[20];
   sprintf(key,"%p",d);
   return (d!=0 && m_impl->classSectionSDict) ? m_impl->classSectionSDict->find(key) : 0;
@@ -3308,7 +3363,6 @@ MemberList *MemberDef::getSectionList(Definition *d) const
 
 void MemberDef::setSectionList(Definition *d, MemberList *sl)   
 { 
-  makeResident();
   //printf("MemberDef::setSectionList(%p,%p) name=%s\n",d,sl,name().data());
   char key[20];
   sprintf(key,"%p",d);
@@ -3321,16 +3375,14 @@ void MemberDef::setSectionList(Definition *d, MemberList *sl)
 
 Specifier MemberDef::virtualness(int count) const
 {
-  KEEP_RESIDENT_DURING_CALL;
   if (count>25) 
   {
      warn(getDefFileName(),getDefLine(),
-       "warning: Internal inconsistency: recursion detected in overload relation for member %s!"
+       "Internal inconsistency: recursion detected in overload relation for member %s!"
        ,qPrint(name())
       );
      return Normal;
   }
-  makeResident();
   Specifier v = m_impl->virt;
   MemberDef *rmd = reimplements();
   while (rmd && v==Normal)
@@ -3341,9 +3393,10 @@ Specifier MemberDef::virtualness(int count) const
   return v;
 }
 
-void MemberDef::_writeTagData()
-{
-  if (m_impl->tagDataWritten) return;
+void MemberDef::_writeTagData(const DefType compoundType)
+{ 
+  unsigned typeMask = 1 << compoundType;
+  if ((m_impl->tagDataWritten) & typeMask) return; // member already written for this type
   static bool generateTagFile = !Config_getString("GENERATE_TAGFILE").isEmpty();
   // write tag file information of this member
   if (generateTagFile && isLinkableInProject())
@@ -3363,6 +3416,8 @@ void MemberDef::_writeTagData()
       case MemberType_Friend:      Doxygen::tagFile << "friend";      break;
       case MemberType_DCOP:        Doxygen::tagFile << "dcop";        break;
       case MemberType_Slot:        Doxygen::tagFile << "slot";        break;
+      case MemberType_Interface:   Doxygen::tagFile << "interface";   break;
+      case MemberType_Service:     Doxygen::tagFile << "service";     break;
     }
     if (m_impl->prot!=Public)
     {
@@ -3386,6 +3441,11 @@ void MemberDef::_writeTagData()
     Doxygen::tagFile << "      <name>" << convertToXML(name()) << "</name>" << endl;
     Doxygen::tagFile << "      <anchorfile>" << convertToXML(getOutputFileBase()+Doxygen::htmlFileExtension) << "</anchorfile>" << endl;
     Doxygen::tagFile << "      <anchor>" << convertToXML(anchor()) << "</anchor>" << endl;
+    QCString idStr = id();
+    if (!idStr.isEmpty())
+    {
+      Doxygen::tagFile << "      <clangid>" << convertToXML(idStr) << "</clangid>" << endl;
+    }
     Doxygen::tagFile << "      <arglist>" << convertToXML(argsString()) << "</arglist>" << endl;
     writeDocAnchorsToTagFile();
     Doxygen::tagFile << "    </member>" << endl;
@@ -3406,19 +3466,24 @@ void MemberDef::_writeTagData()
           Doxygen::tagFile << "      <name>" << convertToXML(fmd->name()) << "</name>" << endl; 
           Doxygen::tagFile << "      <anchorfile>" << convertToXML(getOutputFileBase()+Doxygen::htmlFileExtension) << "</anchorfile>" << endl;              
           Doxygen::tagFile << "      <anchor>" << convertToXML(fmd->anchor()) << "</anchor>" << endl; 
+          QCString idStr = fmd->id();
+          if (!idStr.isEmpty())
+          {
+            Doxygen::tagFile << "      <clangid>" << convertToXML(idStr) << "</clangid>" << endl;
+          }
           Doxygen::tagFile << "      <arglist>" << convertToXML(fmd->argsString()) << "</arglist>" << endl; 
           Doxygen::tagFile << "    </member>" << endl;
+          fmd->m_impl->tagDataWritten |= typeMask;
           fmd->_addToSearchIndex();
         }
       }
     }
   }
-  m_impl->tagDataWritten=TRUE;
+  m_impl->tagDataWritten |= typeMask;
 }
 
 void MemberDef::_computeIsConstructor()
 {
-  KEEP_RESIDENT_DURING_CALL;
   m_isConstructorCached=1; // FALSE
   if (m_impl->classDef) 
   {
@@ -3474,7 +3539,6 @@ bool MemberDef::isConstructor() const
 
 void MemberDef::_computeIsDestructor()
 {
-  KEEP_RESIDENT_DURING_CALL;
   bool isDestructor;
   if (m_impl->isDMember) // for D
   {
@@ -3514,10 +3578,9 @@ bool MemberDef::isDestructor() const
 }
 
 void MemberDef::writeEnumDeclaration(OutputList &typeDecl,
-     ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd)
+     ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd, 
+     const DefType compoundType)
 {
-  KEEP_RESIDENT_DURING_CALL;
-
   int enumMemCount=0;
 
   MemberList *fmdl=m_impl->enumFields;
@@ -3543,7 +3606,7 @@ void MemberDef::writeEnumDeclaration(OutputList &typeDecl,
   {
     if (isLinkableInProject() || hasDocumentedEnumValues())
     {
-      _writeTagData();
+      _writeTagData(compoundType);
       writeLink(typeDecl,cd,nd,fd,gd);
     }
     else
@@ -3590,7 +3653,7 @@ void MemberDef::writeEnumDeclaration(OutputList &typeDecl,
 
           if (fmd->hasDocumentation()) // enum value has docs
           {
-            fmd->_writeTagData();
+            fmd->_writeTagData(compoundType);
             fmd->writeLink(typeDecl,cd,nd,fd,gd);
           }
           else // no docs for this enum value
@@ -3635,14 +3698,12 @@ void MemberDef::writeEnumDeclaration(OutputList &typeDecl,
 
 void MemberDef::setArgumentList(ArgumentList *al) 
 { 
-  makeResident();
   if (m_impl->defArgList) delete m_impl->defArgList;
   m_impl->defArgList = al;
 }
 
 void MemberDef::setDeclArgumentList(ArgumentList *al)
 {
-  makeResident();
   if (m_impl->declArgList) delete m_impl->declArgList;
   m_impl->declArgList = al;
 }
@@ -3650,7 +3711,6 @@ void MemberDef::setDeclArgumentList(ArgumentList *al)
 void MemberDef::setTypeConstraints(ArgumentList *al)
 {
   if (al==0) return;
-  makeResident();
   if (m_impl->typeConstraints) delete m_impl->typeConstraints;
   m_impl->typeConstraints = new ArgumentList;
   m_impl->typeConstraints->setAutoDelete(TRUE);
@@ -3664,33 +3724,28 @@ void MemberDef::setTypeConstraints(ArgumentList *al)
 
 void MemberDef::setType(const char *t)
 {
-  makeResident();
   m_impl->type = t;
 }
 
 void MemberDef::setAccessorType(ClassDef *cd,const char *t)
 {
-  makeResident();
   m_impl->accessorClass = cd;
   m_impl->accessorType = t;
 }
 
 void MemberDef::findSectionsInDocumentation()
 {
-  makeResident();
   docFindSections(documentation(),this,0,docFile());  
 }
 
 void MemberDef::enableCallGraph(bool e) 
 { 
-  makeResident();
   m_impl->hasCallGraph=e; 
   if (e) Doxygen::parseSourcesNeeded = TRUE;
 }
 
 void MemberDef::enableCallerGraph(bool e) 
 { 
-  makeResident();
   m_impl->hasCallerGraph=e; 
   if (e) Doxygen::parseSourcesNeeded = TRUE;
 }
@@ -3698,7 +3753,6 @@ void MemberDef::enableCallerGraph(bool e)
 #if 0
 bool MemberDef::protectionVisible() const
 {
-  makeResident();
   return m_impl->prot==Public || 
          (m_impl->prot==Private   && Config_getBool("EXTRACT_PRIVATE"))   ||
          (m_impl->prot==Protected && Config_getBool("EXTRACT_PROTECTED")) ||
@@ -3710,7 +3764,6 @@ bool MemberDef::protectionVisible() const
 void MemberDef::setInbodyDocumentation(const char *docs,
                   const char *docFile,int docLine)
 {
-  makeResident();
   m_impl->inbodyDocs = docs;
   m_impl->inbodyDocs = m_impl->inbodyDocs.stripWhiteSpace();
   m_impl->inbodyLine = docLine;
@@ -3720,21 +3773,18 @@ void MemberDef::setInbodyDocumentation(const char *docs,
 
 bool MemberDef::isObjCMethod() const
 {
-  makeResident();
   if (m_impl->classDef && m_impl->classDef->isObjectiveC() && isFunction()) return TRUE;
   return FALSE; 
 }
 
 bool MemberDef::isObjCProperty() const
 {
-  makeResident();
   if (m_impl->classDef && m_impl->classDef->isObjectiveC() && isProperty()) return TRUE;
   return FALSE; 
 }
 
 QCString MemberDef::qualifiedName() const
 {
-  makeResident();
   if (isObjCMethod())
   {
     QCString qm;
@@ -3755,7 +3805,6 @@ void MemberDef::setTagInfo(TagInfo *ti)
 {
   if (ti)
   {
-    makeResident();
     //printf("%s: Setting tag name=%s anchor=%s\n",name().data(),ti->tagName.data(),ti->anchor.data());
     m_impl->anc=ti->anchor;
     setReference(ti->tagName);
@@ -3765,7 +3814,6 @@ void MemberDef::setTagInfo(TagInfo *ti)
 
 QCString MemberDef::objCMethodName(bool localLink,bool showStatic) const
 {
-  makeResident();
   QCString qm;
   if (showStatic)
   {
@@ -3783,623 +3831,578 @@ QCString MemberDef::objCMethodName(bool localLink,bool showStatic) const
 
 const char *MemberDef::declaration() const
 { 
-  makeResident();
   return m_impl->decl; 
 }
 
 const char *MemberDef::definition() const
 { 
-  makeResident();
   return m_impl->def;
 }
 
 const char *MemberDef::extraTypeChars() const
 {
-  makeResident();
   return m_impl->extraTypeChars;
 }
 
 const char *MemberDef::typeString() const
 { 
-  makeResident();
   return m_impl->type; 
 }
 
 const char *MemberDef::argsString() const
 { 
-  makeResident();
   return m_impl->args; 
 }
 
 const char *MemberDef::excpString() const
 { 
-  makeResident();
   return m_impl->exception; 
 }
 
 const char *MemberDef::bitfieldString() const
 { 
-  makeResident();
   return m_impl->bitfields; 
 }
 
 const QCString &MemberDef::initializer() const
 { 
-  makeResident();
   return m_impl->initializer; 
 }
 
 int MemberDef::initializerLines() const
 { 
-  makeResident();
   return m_impl->initLines; 
 }
 
-int  MemberDef::getMemberSpecifiers() const
+uint64 MemberDef::getMemberSpecifiers() const
 { 
-  makeResident();
   return m_impl->memSpec; 
 }
 
 ClassDef *MemberDef::getClassDef() const
 { 
-  makeResident();
   return m_impl->classDef; 
 }
 
 FileDef  *MemberDef::getFileDef() const
 { 
-  makeResident();
   return m_impl->fileDef; 
 }
 
 NamespaceDef* MemberDef::getNamespaceDef() const
 { 
-  makeResident();
   return m_impl->nspace; 
 }
 
 const char *MemberDef::getReadAccessor() const
 { 
-  makeResident();
   return m_impl->read; 
 }
 
 const char *MemberDef::getWriteAccessor() const
 { 
-  makeResident();
   return m_impl->write; 
 }
 
 GroupDef *MemberDef::getGroupDef() const
 { 
-  makeResident();
   return m_impl->group; 
 }
 
 Grouping::GroupPri_t MemberDef::getGroupPri() const
 { 
-  makeResident();
   return m_impl->grouppri; 
 }
 
 const char *MemberDef::getGroupFileName() const
 { 
-  makeResident();
   return m_impl->groupFileName; 
 }
 
 int MemberDef::getGroupStartLine() const
 { 
-  makeResident();
   return m_impl->groupStartLine; 
 }
 
 bool MemberDef::getGroupHasDocs() const
 { 
-  makeResident();
   return m_impl->groupHasDocs; 
 }
 
 Protection MemberDef::protection() const
 { 
-  makeResident();
   return m_impl->prot; 
 }
 
 MemberType MemberDef::memberType() const
 { 
-  makeResident();
   return m_impl->mtype; 
 }
 
 bool MemberDef::isSignal() const
 { 
-  makeResident();
   return m_impl->mtype==MemberType_Signal;      
 }
 
 bool MemberDef::isSlot() const
 { 
-  makeResident();
   return m_impl->mtype==MemberType_Slot;        
 }
 
 bool MemberDef::isVariable() const
 { 
-  makeResident();
   return m_impl->mtype==MemberType_Variable;    
 }
 
 bool MemberDef::isEnumerate() const
 { 
-  makeResident();
   return m_impl->mtype==MemberType_Enumeration; 
 }
 
 bool MemberDef::isEnumValue() const
 { 
-  makeResident();
   return m_impl->mtype==MemberType_EnumValue;   
 }
 
 bool MemberDef::isTypedef() const
 { 
-  makeResident();
   return m_impl->mtype==MemberType_Typedef;     
 }
 
 bool MemberDef::isFunction() const
 { 
-  makeResident();
   return m_impl->mtype==MemberType_Function;    
 }
 
 bool MemberDef::isFunctionPtr() const
 {
-  makeResident();
   return m_impl->mtype==MemberType_Variable && QCString(argsString()).find(")(")!=-1;
 }
 
 bool MemberDef::isDefine() const
 { 
-  makeResident();
   return m_impl->mtype==MemberType_Define;      
 }
 
 bool MemberDef::isFriend() const
 { 
-  makeResident();
   return m_impl->mtype==MemberType_Friend;      
 }
 
 bool MemberDef::isDCOP() const
 { 
-  makeResident();
   return m_impl->mtype==MemberType_DCOP;        
 }
 
 bool MemberDef::isProperty() const
 { 
-  makeResident();
   return m_impl->mtype==MemberType_Property;    
 }
 
 bool MemberDef::isEvent() const
 { 
-  makeResident();
   return m_impl->mtype==MemberType_Event;       
 }
 
 bool MemberDef::isRelated() const
 { 
-  makeResident();
   return m_impl->related == Related;
 }
 
 bool MemberDef::isForeign() const
 { 
-  makeResident();
   return m_impl->related == Foreign; 
 }
 
 bool MemberDef::isStatic() const
 { 
-  makeResident();
   return m_impl->stat; 
 }
 
 bool MemberDef::isInline() const
 { 
-  makeResident();
   return (m_impl->memSpec&Entry::Inline)!=0; 
 }
 
 bool MemberDef::isExplicit() const
 { 
-  makeResident();
   return (m_impl->memSpec&Entry::Explicit)!=0; 
 }
 
 bool MemberDef::isMutable() const
 { 
-  makeResident();
   return (m_impl->memSpec&Entry::Mutable)!=0; 
 }
 
 bool MemberDef::isGettable() const
 { 
-  makeResident();
   return (m_impl->memSpec&Entry::Gettable)!=0; 
 }
 
 bool MemberDef::isSettable() const
 { 
-  makeResident();
   return (m_impl->memSpec&Entry::Settable)!=0; 
 }
 
 bool MemberDef::isAddable() const
 { 
-  makeResident();
   return (m_impl->memSpec&Entry::Addable)!=0; 
 }
 
 bool MemberDef::isRemovable() const
 { 
-  makeResident();
   return (m_impl->memSpec&Entry::Removable)!=0; 
 }
 
 bool MemberDef::isRaisable() const
 { 
-  makeResident();
   return (m_impl->memSpec&Entry::Raisable)!=0; 
 }
 
 bool MemberDef::isReadable() const
 { 
-  makeResident();
   return (m_impl->memSpec&Entry::Readable)!=0; 
 }
 
 bool MemberDef::isWritable() const
 { 
-  makeResident();
   return (m_impl->memSpec&Entry::Writable)!=0; 
 }
 
 bool MemberDef::isFinal() const
 { 
-  makeResident();
   return (m_impl->memSpec&Entry::Final)!=0; 
 }
 
 bool MemberDef::isNew() const
 { 
-  makeResident();
   return (m_impl->memSpec&Entry::New)!=0; 
 }
 
 bool MemberDef::isSealed() const
 { 
-  makeResident();
   return (m_impl->memSpec&Entry::Sealed)!=0; 
 }
 
 bool MemberDef::isOverride() const
 { 
-  makeResident();
   return (m_impl->memSpec&Entry::Override)!=0; 
 }
 
 bool MemberDef::isInitonly() const
 { 
-  makeResident();
   return (m_impl->memSpec&Entry::Initonly)!=0; 
 }
 
 bool MemberDef::isAbstract() const
 { 
-  makeResident();
   return (m_impl->memSpec&Entry::Abstract)!=0; 
 }
 
 bool MemberDef::isOptional() const
 { 
-  makeResident();
   return (m_impl->memSpec&Entry::Optional)!=0; 
 }
 
 bool MemberDef::isRequired() const
 { 
-  makeResident();
   return (m_impl->memSpec&Entry::Required)!=0; 
 }
 
 bool MemberDef::isNonAtomic() const
 { 
-  makeResident();
   return (m_impl->memSpec&Entry::NonAtomic)!=0; 
 }
 
 bool MemberDef::isCopy() const
 { 
-  makeResident();
   return (m_impl->memSpec&Entry::Copy)!=0; 
 }
 
 bool MemberDef::isAssign() const
 { 
-  makeResident();
   return (m_impl->memSpec&Entry::Assign)!=0; 
 }
 
 bool MemberDef::isRetain() const
 { 
-  makeResident();
   return (m_impl->memSpec&Entry::Retain)!=0; 
 }
 
 bool MemberDef::isWeak() const
 {
-  makeResident();
   return (m_impl->memSpec&Entry::Weak)!=0; 
 }
 
 bool MemberDef::isStrong() const
 {
-  makeResident();
   return (m_impl->memSpec&Entry::Strong)!=0; 
 }
 
 bool MemberDef::isUnretained() const
 {
-  makeResident();
   return (m_impl->memSpec&Entry::Unretained)!=0; 
 }
 
 bool MemberDef::isAlias() const
 {
-  makeResident();
   return (m_impl->memSpec&Entry::Alias)!=0;
 }
 
 bool MemberDef::isDefault() const
 {
-  makeResident();
   return (m_impl->memSpec&Entry::Default)!=0;
 }
 
 bool MemberDef::isDelete() const
 {
-  makeResident();
   return (m_impl->memSpec&Entry::Delete)!=0;
 }
 
 bool MemberDef::isNoExcept() const
 {
-  makeResident();
   return (m_impl->memSpec&Entry::NoExcept)!=0;
 }
 
+bool MemberDef::isAttribute() const
+{
+  return (m_impl->memSpec&Entry::Attribute)!=0;
+}
+
+bool MemberDef::isUNOProperty() const
+{
+  return (m_impl->memSpec&Entry::Property)!=0;
+}
+
+bool MemberDef::isReadonly() const
+{
+  return (m_impl->memSpec&Entry::Readonly)!=0;
+}
+
+bool MemberDef::isBound() const
+{
+  return (m_impl->memSpec&Entry::Bound)!=0;
+}
+
+bool MemberDef::isConstrained() const
+{
+  return (m_impl->memSpec&Entry::Constrained)!=0;
+}
+
+bool MemberDef::isTransient() const
+{
+  return (m_impl->memSpec&Entry::Transient)!=0;
+}
+
+bool MemberDef::isMaybeVoid() const
+{
+  return (m_impl->memSpec&Entry::MaybeVoid)!=0;
+}
+
+bool MemberDef::isMaybeDefault() const
+{
+  return (m_impl->memSpec&Entry::MaybeDefault)!=0;
+}
+
+bool MemberDef::isMaybeAmbiguous() const
+{
+  return (m_impl->memSpec&Entry::MaybeAmbiguous)!=0;
+}
+
+bool MemberDef::isPublished() const
+{
+  return (m_impl->memSpec&Entry::Published)!=0;
+}
 
 
 bool MemberDef::isImplementation() const
 { 
-  makeResident();
   return m_impl->implOnly; 
 }
 
 bool MemberDef::isExternal() const
 { 
-  makeResident();
   return m_impl->explExt; 
 }
 
 bool MemberDef::isTemplateSpecialization() const
 { 
-  makeResident();
   return m_impl->tspec; 
 }
 
 bool MemberDef::hasDocumentedParams() const
 { 
-  makeResident();
   return m_impl->hasDocumentedParams; 
 }
 
 bool MemberDef::hasDocumentedReturnType() const
 { 
-  makeResident();
   return m_impl->hasDocumentedReturnType; 
 }
 
+bool MemberDef::showInCallGraph() const
+{
+  return isFunction() || 
+         isSlot() || 
+         isConstructor() ||
+         isDestructor() || 
+         isObjCMethod();
+}
+
 ClassDef *MemberDef::relatedAlso() const
 { 
-  makeResident();
   return m_impl->relatedAlso; 
 }
 
 bool MemberDef::hasDocumentedEnumValues() const
 { 
-  makeResident();
   return m_impl->docEnumValues; 
 }
 
 MemberDef *MemberDef::getAnonymousEnumType() const
 { 
-  makeResident();
   return m_impl->annEnumType; 
 }
 
 bool MemberDef::isDocsForDefinition() const
 { 
-  makeResident();
   return m_impl->docsForDefinition; 
 }
 
 MemberDef *MemberDef::getEnumScope() const
 { 
-  makeResident();
   return m_impl->enumScope; 
 }
 
-LockingPtr<MemberList> MemberDef::enumFieldList() const
+MemberList *MemberDef::enumFieldList() const
 { 
-  makeResident();
-  return LockingPtr<MemberList>(this,m_impl->enumFields); 
+  return m_impl->enumFields; 
 }
 
-LockingPtr<ExampleSDict> MemberDef::getExamples() const
+ExampleSDict *MemberDef::getExamples() const
 { 
-  makeResident();
-  return LockingPtr<ExampleSDict>(this,m_impl->exampleSDict); 
+  return m_impl->exampleSDict; 
 }
 
 bool MemberDef::isPrototype() const
 { 
-  makeResident();
   return m_impl->proto; 
 }
 
-LockingPtr<ArgumentList> MemberDef::argumentList() const
+ArgumentList *MemberDef::argumentList() const
 { 
-  makeResident();
-  return LockingPtr<ArgumentList>(this,m_impl->defArgList); 
+  return m_impl->defArgList; 
 }
 
-LockingPtr<ArgumentList> MemberDef::declArgumentList() const
+ArgumentList *MemberDef::declArgumentList() const
 { 
-  makeResident();
-  return LockingPtr<ArgumentList>(this,m_impl->declArgList); 
+  return m_impl->declArgList; 
 }
 
-LockingPtr<ArgumentList> MemberDef::templateArguments() const
+ArgumentList *MemberDef::templateArguments() const
 { 
-  makeResident();
-  return LockingPtr<ArgumentList>(this,m_impl->tArgList); 
+  return m_impl->tArgList; 
 }
 
-LockingPtr< QList<ArgumentList> > MemberDef::definitionTemplateParameterLists() const
+QList<ArgumentList> *MemberDef::definitionTemplateParameterLists() const
 { 
-  makeResident();
-  return LockingPtr< QList<ArgumentList> >(this,m_impl->defTmpArgLists); 
+  return m_impl->defTmpArgLists; 
 }
 
 int MemberDef::getMemberGroupId() const
 { 
-  makeResident();
   return m_impl->grpId; 
 }
 
 MemberGroup *MemberDef::getMemberGroup() const
 { 
-  makeResident();
   return m_impl->memberGroup; 
 }
 
 bool MemberDef::fromAnonymousScope() const
 { 
-  makeResident();
   return m_impl->annScope; 
 }
 
 bool MemberDef::anonymousDeclShown() const
 { 
-  makeResident();
   return m_impl->annUsed; 
 }
 
 void MemberDef::setAnonymousUsed() 
 {
-  makeResident();
   m_impl->annUsed = TRUE;
 }
 
 bool MemberDef::hasCallGraph() const
 { 
-  makeResident();
   return m_impl->hasCallGraph; 
 }
 
 bool MemberDef::hasCallerGraph() const
 { 
-  makeResident();
   return m_impl->hasCallerGraph; 
 }
 
 MemberDef *MemberDef::templateMaster() const
 { 
-  makeResident();
   return m_impl->templateMaster; 
 }
 
 bool MemberDef::isTypedefValCached() const
 { 
-  makeResident();
   return m_impl->isTypedefValCached; 
 }
 
 ClassDef *MemberDef::getCachedTypedefVal() const
 { 
-  makeResident();
   return m_impl->cachedTypedefValue; 
 }
 
 QCString MemberDef::getCachedTypedefTemplSpec() const
 { 
-  makeResident();
   return m_impl->cachedTypedefTemplSpec; 
 }
 
 QCString MemberDef::getCachedResolvedTypedef() const
 { 
-  makeResident();
   //printf("MemberDef::getCachedResolvedTypedef()=%s m_impl=%p\n",m_impl->cachedResolvedType.data(),m_impl);
   return m_impl->cachedResolvedType; 
 }
 
 MemberDef *MemberDef::memberDefinition() const
 { 
-  makeResident();
   return m_impl->memDef; 
 }
 
 MemberDef *MemberDef::memberDeclaration() const
 { 
-  makeResident();
   return m_impl->memDec; 
 }
 
 MemberDef *MemberDef::inheritsDocsFrom() const
 { 
-  makeResident();
   return m_impl->docProvider; 
 }
 
 MemberDef *MemberDef::getGroupAlias() const
 { 
-  makeResident();
   return m_impl->groupAlias; 
 }
 
 void MemberDef::setMemberType(MemberType t)
 { 
-  makeResident();
   m_impl->mtype=t; 
   m_isLinkableCached = 0;
 }
 
 void MemberDef::setDefinition(const char *d)
 { 
-  makeResident();
   m_impl->def=d; 
 }
 
 void MemberDef::setFileDef(FileDef *fd)
 { 
-  makeResident();
   m_impl->fileDef=fd; 
   m_isLinkableCached = 0;
   m_isConstructorCached = 0;
@@ -4408,26 +4411,22 @@ void MemberDef::setFileDef(FileDef *fd)
 
 void MemberDef::setProtection(Protection p)
 { 
-  makeResident();
   m_impl->prot=p; 
   m_isLinkableCached = 0;
 }
 
-void MemberDef::setMemberSpecifiers(int s)
+void MemberDef::setMemberSpecifiers(uint64 s)
 { 
-  makeResident();
   m_impl->memSpec=s; 
 }
 
-void MemberDef::mergeMemberSpecifiers(int s)
+void MemberDef::mergeMemberSpecifiers(uint64 s)
 { 
-  makeResident();
   m_impl->memSpec|=s; 
 }
 
 void MemberDef::setBitfields(const char *s)
 { 
-  makeResident();
   m_impl->bitfields = s; 
 }
 
@@ -4435,82 +4434,69 @@ void MemberDef::setMaxInitLines(int lines)
 { 
   if (lines!=-1)
   {
-    makeResident();
     m_impl->userInitLines=lines; 
   }
 }
 
 void MemberDef::setExplicitExternal(bool b)
 { 
-  makeResident();
   m_impl->explExt=b; 
 }
 
 void MemberDef::setReadAccessor(const char *r)
 { 
-  makeResident();
   m_impl->read=r; 
 }
 
 void MemberDef::setWriteAccessor(const char *w)
 { 
-  makeResident();
   m_impl->write=w; 
 }
 
 void MemberDef::setTemplateSpecialization(bool b)
 { 
-  makeResident();
   m_impl->tspec=b; 
 }
 
 void MemberDef::makeRelated()
 { 
-  makeResident();
   m_impl->related = Related; 
   m_isLinkableCached = 0;
 }
 
 void MemberDef::makeForeign()
 { 
-  makeResident();
   m_impl->related = Foreign; 
   m_isLinkableCached = 0;
 }
 
 void MemberDef::setHasDocumentedParams(bool b)
 { 
-  makeResident();
   m_impl->hasDocumentedParams = b; 
 }
 
 void MemberDef::setHasDocumentedReturnType(bool b)
 { 
-  makeResident();
   m_impl->hasDocumentedReturnType = b; 
 }
 
 void MemberDef::setInheritsDocsFrom(MemberDef *md)
 { 
-  makeResident();
   m_impl->docProvider = md; 
 }
 
 void MemberDef::setArgsString(const char *as)
 { 
-  makeResident();
   m_impl->args = as; 
 }
 
 void MemberDef::setRelatedAlso(ClassDef *cd)
 { 
-  makeResident();
   m_impl->relatedAlso=cd; 
 }
 
 void MemberDef::setEnumClassScope(ClassDef *cd)
 { 
-  makeResident();
   m_impl->classDef = cd; 
   m_isLinkableCached = 0; 
   m_isConstructorCached = 0; 
@@ -4518,123 +4504,103 @@ void MemberDef::setEnumClassScope(ClassDef *cd)
 
 void MemberDef::setDocumentedEnumValues(bool value)
 { 
-  makeResident();
   m_impl->docEnumValues=value; 
 }
 
 void MemberDef::setAnonymousEnumType(MemberDef *md)
 { 
-  makeResident();
   m_impl->annEnumType = md; 
 }
 
 void MemberDef::setPrototype(bool p)
 { 
-  makeResident();
   m_impl->proto=p; 
 }
 
 void MemberDef::setMemberGroupId(int id)
 { 
-  makeResident();
   m_impl->grpId=id; 
 }
 
 void MemberDef::makeImplementationDetail()
 { 
-  makeResident();
   m_impl->implOnly=TRUE; 
 }
 
 void MemberDef::setFromAnonymousScope(bool b)
 { 
-  makeResident();
   m_impl->annScope=b; 
 }
 
 void MemberDef::setFromAnonymousMember(MemberDef *m)
 { 
-  makeResident();
   m_impl->annMemb=m; 
 }
 
 void MemberDef::setTemplateMaster(MemberDef *mt)
 { 
-  makeResident();
   m_impl->templateMaster=mt; 
   m_isLinkableCached = 0; 
 }
 
 void MemberDef::setDocsForDefinition(bool b)
 { 
-  makeResident();
   m_impl->docsForDefinition = b; 
 }
 
 void MemberDef::setGroupAlias(MemberDef *md)
 { 
-  makeResident();
   m_impl->groupAlias = md; 
 }
 
 void MemberDef::invalidateTypedefValCache()
 { 
-  makeResident();
   m_impl->isTypedefValCached=FALSE; 
 }
 
 void MemberDef::setMemberDefinition(MemberDef *md)
 { 
-  makeResident();
   m_impl->memDef=md; 
 }
 
 void MemberDef::setMemberDeclaration(MemberDef *md)
 { 
-  makeResident();
   m_impl->memDec=md; 
 }
 
 ClassDef *MemberDef::category() const
 {
-  makeResident();
   return m_impl->category;
 }
 
 void MemberDef::setCategory(ClassDef *def)
 {
-  makeResident();
   m_impl->category = def;
 }
 
 MemberDef *MemberDef::categoryRelation() const
 {
-  makeResident();
   return m_impl->categoryRelation;
 }
 
 void MemberDef::setCategoryRelation(MemberDef *md)
 {
-  makeResident();
   m_impl->categoryRelation = md;
 }
 
 void MemberDef::setEnumBaseType(const QCString &type)
 {
-  makeResident();
   m_impl->enumBaseType = type;
 }
 
 QCString MemberDef::enumBaseType() const
 {
-  makeResident();
   return m_impl->enumBaseType;
 }
 
 
 void MemberDef::cacheTypedefVal(ClassDef*val, const QCString & templSpec, const QCString &resolvedType)
 {
-  makeResident();
   m_impl->isTypedefValCached=TRUE; 
   m_impl->cachedTypedefValue=val; 
   m_impl->cachedTypedefTemplSpec=templSpec; 
@@ -4644,10 +4610,9 @@ void MemberDef::cacheTypedefVal(ClassDef*val, const QCString & templSpec, const
 
 void MemberDef::copyArgumentNames(MemberDef *bmd)
 {
-  makeResident();
   {
-    LockingPtr<ArgumentList> arguments = bmd->argumentList();
-    if (m_impl->defArgList && arguments!=0)
+    ArgumentList *arguments = bmd->argumentList();
+    if (m_impl->defArgList && arguments)
     {
       ArgumentListIterator aliDst(*m_impl->defArgList);
       ArgumentListIterator aliSrc(*arguments);
@@ -4659,8 +4624,8 @@ void MemberDef::copyArgumentNames(MemberDef *bmd)
     }
   }
   {
-    LockingPtr<ArgumentList> arguments = bmd->declArgumentList();
-    if (m_impl->declArgList && arguments!=0)
+    ArgumentList *arguments = bmd->declArgumentList();
+    if (m_impl->declArgList && arguments)
     {
       ArgumentListIterator aliDst(*m_impl->declArgList);
       ArgumentListIterator aliSrc(*arguments);
@@ -4688,295 +4653,10 @@ static void invalidateCachedTypesInArgumentList(ArgumentList *al)
 
 void MemberDef::invalidateCachedArgumentTypes()
 {
-  makeResident();
   invalidateCachedTypesInArgumentList(m_impl->defArgList);
   invalidateCachedTypesInArgumentList(m_impl->declArgList);
 }
 
-
-//-----------------------------------------------------------------
-
-void MemberDef::flushToDisk() const
-{
-  if (isLocked()) return;
-  MemberDef *that = (MemberDef*)this;
-  that->m_storagePos = Doxygen::symbolStorage->alloc();
-  //printf("%p: MemberDef::flushToDisk() m_impl=%p\n",this,m_impl);
-  // write the definition base class member variables to disk
-  Definition::flushToDisk();
-
-  //printf("%p:   flushing specific part\n",this);
-
-  // write the memberdef member variables to disk
-  marshalUInt(Doxygen::symbolStorage,START_MARKER);
-  marshalObjPointer   (Doxygen::symbolStorage,m_impl->classDef);
-  marshalObjPointer   (Doxygen::symbolStorage,m_impl->fileDef);
-  marshalObjPointer   (Doxygen::symbolStorage,m_impl->nspace);
-  marshalObjPointer   (Doxygen::symbolStorage,m_impl->enumScope);
-  marshalObjPointer   (Doxygen::symbolStorage,m_impl->annEnumType);
-  marshalMemberList   (Doxygen::symbolStorage,m_impl->enumFields);
-  marshalObjPointer   (Doxygen::symbolStorage,m_impl->redefines);
-  marshalMemberList   (Doxygen::symbolStorage,m_impl->redefinedBy);
-  marshalObjPointer   (Doxygen::symbolStorage,m_impl->memDef);
-  marshalObjPointer   (Doxygen::symbolStorage,m_impl->memDec);
-  marshalObjPointer   (Doxygen::symbolStorage,m_impl->relatedAlso);
-  marshalExampleSDict (Doxygen::symbolStorage,m_impl->exampleSDict);
-  marshalQCString     (Doxygen::symbolStorage,m_impl->type);
-  marshalQCString     (Doxygen::symbolStorage,m_impl->enumBaseType);
-  marshalQCString     (Doxygen::symbolStorage,m_impl->accessorType);
-  marshalObjPointer   (Doxygen::symbolStorage,m_impl->accessorClass);
-  marshalQCString     (Doxygen::symbolStorage,m_impl->args);
-  marshalQCString     (Doxygen::symbolStorage,m_impl->def);
-  marshalQCString     (Doxygen::symbolStorage,m_impl->anc);
-  marshalInt          (Doxygen::symbolStorage,(int)m_impl->virt);
-  marshalInt          (Doxygen::symbolStorage,(int)m_impl->prot);
-  marshalQCString     (Doxygen::symbolStorage,m_impl->decl);
-  marshalQCString     (Doxygen::symbolStorage,m_impl->bitfields);
-  marshalQCString     (Doxygen::symbolStorage,m_impl->read);
-  marshalQCString     (Doxygen::symbolStorage,m_impl->write);
-  marshalQCString     (Doxygen::symbolStorage,m_impl->exception);
-  marshalQCString     (Doxygen::symbolStorage,m_impl->initializer);
-  marshalQCString     (Doxygen::symbolStorage,m_impl->extraTypeChars);
-  marshalInt          (Doxygen::symbolStorage,m_impl->initLines);
-  marshalInt          (Doxygen::symbolStorage,m_impl->memSpec);
-  marshalInt          (Doxygen::symbolStorage,(int)m_impl->mtype);
-  marshalInt          (Doxygen::symbolStorage,m_impl->maxInitLines);
-  marshalInt          (Doxygen::symbolStorage,m_impl->userInitLines);
-  marshalObjPointer   (Doxygen::symbolStorage,m_impl->annMemb);
-  marshalArgumentList (Doxygen::symbolStorage,m_impl->defArgList);
-  marshalArgumentList (Doxygen::symbolStorage,m_impl->declArgList);
-  marshalArgumentList (Doxygen::symbolStorage,m_impl->tArgList);
-  marshalArgumentList (Doxygen::symbolStorage,m_impl->typeConstraints);
-  marshalObjPointer   (Doxygen::symbolStorage,m_impl->templateMaster);
-  marshalArgumentLists(Doxygen::symbolStorage,m_impl->defTmpArgLists);
-  marshalObjPointer   (Doxygen::symbolStorage,m_impl->cachedAnonymousType);
-  marshalMemberLists  (Doxygen::symbolStorage,m_impl->classSectionSDict);
-  marshalObjPointer   (Doxygen::symbolStorage,m_impl->groupAlias);
-  marshalInt          (Doxygen::symbolStorage,m_impl->grpId);
-  marshalObjPointer   (Doxygen::symbolStorage,m_impl->memberGroup);
-  marshalObjPointer   (Doxygen::symbolStorage,m_impl->group);
-  marshalInt          (Doxygen::symbolStorage,(int)m_impl->grouppri);
-  marshalQCString     (Doxygen::symbolStorage,m_impl->groupFileName);
-  marshalInt          (Doxygen::symbolStorage,m_impl->groupStartLine);
-  marshalObjPointer   (Doxygen::symbolStorage,m_impl->groupMember);
-  marshalBool         (Doxygen::symbolStorage,m_impl->isTypedefValCached);
-  marshalObjPointer   (Doxygen::symbolStorage,m_impl->cachedTypedefValue);
-  marshalQCString     (Doxygen::symbolStorage,m_impl->cachedTypedefTemplSpec);
-  marshalQCString     (Doxygen::symbolStorage,m_impl->cachedResolvedType);
-  marshalObjPointer   (Doxygen::symbolStorage,m_impl->docProvider);
-  marshalQCString     (Doxygen::symbolStorage,m_impl->explicitOutputFileBase);
-  marshalBool         (Doxygen::symbolStorage,m_impl->implOnly); 
-  marshalBool         (Doxygen::symbolStorage,m_impl->hasDocumentedParams);
-  marshalBool         (Doxygen::symbolStorage,m_impl->hasDocumentedReturnType);
-  marshalBool         (Doxygen::symbolStorage,m_impl->isDMember);
-  marshalInt          (Doxygen::symbolStorage,(int)m_impl->related);
-  marshalBool         (Doxygen::symbolStorage,m_impl->stat);
-  marshalBool         (Doxygen::symbolStorage,m_impl->proto);
-  marshalBool         (Doxygen::symbolStorage,m_impl->docEnumValues);
-  marshalBool         (Doxygen::symbolStorage,m_impl->annScope);
-  marshalBool         (Doxygen::symbolStorage,m_impl->annUsed);
-  marshalBool         (Doxygen::symbolStorage,m_impl->hasCallGraph);
-  marshalBool         (Doxygen::symbolStorage,m_impl->hasCallerGraph);
-  marshalBool         (Doxygen::symbolStorage,m_impl->explExt);
-  marshalBool         (Doxygen::symbolStorage,m_impl->tspec);
-  marshalBool         (Doxygen::symbolStorage,m_impl->groupHasDocs);
-  marshalBool         (Doxygen::symbolStorage,m_impl->docsForDefinition);
-  marshalObjPointer   (Doxygen::symbolStorage,m_impl->category);
-  marshalObjPointer   (Doxygen::symbolStorage,m_impl->categoryRelation);
-  marshalBool         (Doxygen::symbolStorage,m_impl->tagDataWritten);
-  marshalUInt(Doxygen::symbolStorage,END_MARKER);
-
-  // function doesn't modify the object conceptually but compiler doesn't know this.
-  delete that->m_impl;
-  that->m_impl=0;
-  that->m_flushPending=FALSE;
-}
-
-void MemberDef::loadFromDisk() const
-{
-  MemberDef *that = (MemberDef *)this;
-  if (isLocked()) 
-  {
-    //printf("%p: loadFromDisk() locked: so still in memory\n",this);
-    assert(m_impl!=0);
-    return;
-  }
-  assert(m_impl==0);
-
-  Doxygen::symbolStorage->seek(m_storagePos);
-  Definition::loadFromDisk();
-
-  //printf("%p:   loading specific part\n",this);
-
-  that->m_impl = new MemberDefImpl;
-  //printf("%p: MemberDef::loadFromDisk(): m_impl=%p\n",this,m_impl);
-
-  uint marker = unmarshalUInt(Doxygen::symbolStorage);
-  assert(marker==START_MARKER);
-  m_impl->classDef                = (ClassDef*)unmarshalObjPointer     (Doxygen::symbolStorage);
-  m_impl->fileDef                 = (FileDef*)unmarshalObjPointer      (Doxygen::symbolStorage);
-  m_impl->nspace                  = (NamespaceDef*)unmarshalObjPointer (Doxygen::symbolStorage);
-  m_impl->enumScope               = (MemberDef*)unmarshalObjPointer    (Doxygen::symbolStorage);
-  m_impl->annEnumType             = (MemberDef*)unmarshalObjPointer    (Doxygen::symbolStorage);
-  m_impl->enumFields              = unmarshalMemberList                (Doxygen::symbolStorage);
-  m_impl->redefines               = (MemberDef*)unmarshalObjPointer    (Doxygen::symbolStorage);
-  m_impl->redefinedBy             = unmarshalMemberList                (Doxygen::symbolStorage);
-  m_impl->memDef                  = (MemberDef*)unmarshalObjPointer    (Doxygen::symbolStorage);
-  m_impl->memDec                  = (MemberDef*)unmarshalObjPointer    (Doxygen::symbolStorage);
-  m_impl->relatedAlso             = (ClassDef*)unmarshalObjPointer     (Doxygen::symbolStorage);
-  m_impl->exampleSDict            = unmarshalExampleSDict (Doxygen::symbolStorage);
-  m_impl->type                    = unmarshalQCString     (Doxygen::symbolStorage);
-  m_impl->enumBaseType            = unmarshalQCString     (Doxygen::symbolStorage);
-  m_impl->accessorType            = unmarshalQCString     (Doxygen::symbolStorage);
-  m_impl->accessorClass           = (ClassDef*)unmarshalObjPointer     (Doxygen::symbolStorage);
-  m_impl->args                    = unmarshalQCString     (Doxygen::symbolStorage);
-  m_impl->def                     = unmarshalQCString     (Doxygen::symbolStorage);
-  m_impl->anc                     = unmarshalQCString     (Doxygen::symbolStorage);
-  m_impl->virt                    = (Specifier)unmarshalInt (Doxygen::symbolStorage);
-  m_impl->prot                    = (Protection)unmarshalInt(Doxygen::symbolStorage);
-  m_impl->decl                    = unmarshalQCString     (Doxygen::symbolStorage);
-  m_impl->bitfields               = unmarshalQCString     (Doxygen::symbolStorage);
-  m_impl->read                    = unmarshalQCString     (Doxygen::symbolStorage);
-  m_impl->write                   = unmarshalQCString     (Doxygen::symbolStorage);
-  m_impl->exception               = unmarshalQCString     (Doxygen::symbolStorage);
-  m_impl->initializer             = unmarshalQCString     (Doxygen::symbolStorage);
-  m_impl->extraTypeChars          = unmarshalQCString     (Doxygen::symbolStorage);
-  m_impl->initLines               = unmarshalInt          (Doxygen::symbolStorage);
-  m_impl->memSpec                 = unmarshalInt          (Doxygen::symbolStorage);
-  m_impl->mtype                   = (MemberType)unmarshalInt          (Doxygen::symbolStorage);
-  m_impl->maxInitLines            = unmarshalInt          (Doxygen::symbolStorage);
-  m_impl->userInitLines           = unmarshalInt          (Doxygen::symbolStorage);
-  m_impl->annMemb                 = (MemberDef*)unmarshalObjPointer   (Doxygen::symbolStorage);
-  m_impl->defArgList              = unmarshalArgumentList (Doxygen::symbolStorage);
-  m_impl->declArgList             = unmarshalArgumentList (Doxygen::symbolStorage);
-  m_impl->tArgList                = unmarshalArgumentList (Doxygen::symbolStorage);
-  m_impl->typeConstraints         = unmarshalArgumentList (Doxygen::symbolStorage);
-  m_impl->templateMaster          = (MemberDef*)unmarshalObjPointer   (Doxygen::symbolStorage);
-  m_impl->defTmpArgLists          = unmarshalArgumentLists(Doxygen::symbolStorage);
-  m_impl->cachedAnonymousType     = (ClassDef*)unmarshalObjPointer   (Doxygen::symbolStorage);
-  m_impl->classSectionSDict       = unmarshalMemberLists  (Doxygen::symbolStorage);
-  m_impl->groupAlias              = (MemberDef*)unmarshalObjPointer   (Doxygen::symbolStorage);
-  m_impl->grpId                   = unmarshalInt          (Doxygen::symbolStorage);
-  m_impl->memberGroup             = (MemberGroup*)unmarshalObjPointer   (Doxygen::symbolStorage);
-  m_impl->group                   = (GroupDef*)unmarshalObjPointer   (Doxygen::symbolStorage);
-  m_impl->grouppri                = (Grouping::GroupPri_t)unmarshalInt          (Doxygen::symbolStorage);
-  m_impl->groupFileName           = unmarshalQCString     (Doxygen::symbolStorage);
-  m_impl->groupStartLine          = unmarshalInt          (Doxygen::symbolStorage);
-  m_impl->groupMember             = (MemberDef*)unmarshalObjPointer   (Doxygen::symbolStorage);
-  m_impl->isTypedefValCached      = unmarshalBool         (Doxygen::symbolStorage);
-  m_impl->cachedTypedefValue      = (ClassDef*)unmarshalObjPointer   (Doxygen::symbolStorage);
-  m_impl->cachedTypedefTemplSpec  = unmarshalQCString     (Doxygen::symbolStorage);
-  m_impl->cachedResolvedType      = unmarshalQCString     (Doxygen::symbolStorage);
-  m_impl->docProvider             = (MemberDef*)unmarshalObjPointer   (Doxygen::symbolStorage);
-  m_impl->explicitOutputFileBase  = unmarshalQCString     (Doxygen::symbolStorage);
-  m_impl->implOnly                = unmarshalBool         (Doxygen::symbolStorage); 
-  m_impl->hasDocumentedParams     = unmarshalBool         (Doxygen::symbolStorage);
-  m_impl->hasDocumentedReturnType = unmarshalBool         (Doxygen::symbolStorage);
-  m_impl->isDMember               = unmarshalBool         (Doxygen::symbolStorage);
-  m_impl->related                 = (Relationship)unmarshalInt(Doxygen::symbolStorage);
-  m_impl->stat                    = unmarshalBool         (Doxygen::symbolStorage);
-  m_impl->proto                   = unmarshalBool         (Doxygen::symbolStorage);
-  m_impl->docEnumValues           = unmarshalBool         (Doxygen::symbolStorage);
-  m_impl->annScope                = unmarshalBool         (Doxygen::symbolStorage);
-  m_impl->annUsed                 = unmarshalBool         (Doxygen::symbolStorage);
-  m_impl->hasCallGraph            = unmarshalBool         (Doxygen::symbolStorage);
-  m_impl->hasCallerGraph          = unmarshalBool         (Doxygen::symbolStorage);
-  m_impl->explExt                 = unmarshalBool         (Doxygen::symbolStorage);
-  m_impl->tspec                   = unmarshalBool         (Doxygen::symbolStorage);
-  m_impl->groupHasDocs            = unmarshalBool         (Doxygen::symbolStorage);
-  m_impl->docsForDefinition       = unmarshalBool         (Doxygen::symbolStorage);
-  m_impl->category                = (ClassDef*)unmarshalObjPointer   (Doxygen::symbolStorage);
-  m_impl->categoryRelation        = (MemberDef*)unmarshalObjPointer  (Doxygen::symbolStorage);
-  m_impl->tagDataWritten          = unmarshalBool         (Doxygen::symbolStorage);
-  marker = unmarshalUInt(Doxygen::symbolStorage);
-  assert(marker==END_MARKER);
-
-  //printf("%p: MemberDef::loadFromDisk(): sorting\n",this);
-}
-
-void MemberDef::makeResident() const
-{ 
-  if (Doxygen::symbolCache==0) return;
-  if (m_cacheHandle==-1) // not yet in cache
-  { 
-    MemberDef *victim = 0;
-    MemberDef *that = (MemberDef*)this; // fake method constness
-    that->m_cacheHandle = Doxygen::symbolCache->add(that,(void **)&victim);
-    //printf("adding %s to cache, handle=%d\n",m_impl->name.data(),that->m_cacheHandle);
-    if (victim)  // cache was full, victim was the least recently used item and has to go
-    {
-      //printf("%p: makeResident(): cache full %p::saveToDisk(): m_impl=%p\n",this,victim,victim->m_impl);
-      victim->m_cacheHandle=-1; // invalidate cache handle
-      victim->saveToDisk();     // store the item on disk
-    }
-    else // cache not yet full
-    {
-      //printf("Adding %s to cache, handle=%d\n",m_impl->name.data(),m_cacheHandle);
-    }
-    if (m_storagePos!=-1) // already been written to disk
-    {
-      if (isLocked()) // locked in memory
-      {
-        assert(m_impl!=0);
-        that->m_flushPending=FALSE; // no need to flush anymore
-      }
-      else // not locked in memory
-      {
-        assert(m_impl==0);
-        loadFromDisk();
-      }
-    }
-  }
-  else // already cached, make this object the most recently used.
-  {
-    assert(m_impl!=0);
-    //printf("Touching symbol %s\n",m_impl->name.data());
-    Doxygen::symbolCache->use(m_cacheHandle);
-  }
-}
-
-void MemberDef::saveToDisk() const
-{
-  assert(m_impl!=0);
-  MemberDef *that = (MemberDef *)this;
-  //printf("%p: saveToDisk(): m_impl=%p\n",this,m_impl);
-  if (isLocked()) // cannot flush the item as it is locked
-  {
-    that->m_flushPending=TRUE; // flush when unlocked
-  }
-  else // ready to flush the item to disk
-  {
-    //printf("Adding %s to cache, handle=%d by replacing %s\n",
-    //    m_impl->name.data(),m_cacheHandle,victim->m_impl->name.data());
-    if (m_storagePos!=-1) 
-      // if victim was stored on disk already and is not locked
-    {
-      // free the storage space occupied by the old store item
-      Doxygen::symbolStorage->release(m_storagePos); // free up space for others
-    }
-    // write a the new (possibly modified) instance to disk
-    flushToDisk();
-    // end to write sequence (unless nothing was written due to the lock)
-    Doxygen::symbolStorage->end();
-  }
-}
-
-void MemberDef::lock() const
-{
-}
-
-void MemberDef::unlock() const
-{
-  if (m_flushPending && !isLocked())
-  {
-    //printf("%p: flush after unlock\n",this);
-    // write a the new (possibly modified) instance to disk
-    flushToDisk();
-    // end to write sequence (unless nothing was written due to the lock)
-    Doxygen::symbolStorage->end();
-  }
-}
-
 //----------------
 
 QCString MemberDef::displayName(bool) const 
@@ -5050,10 +4730,10 @@ void combineDeclarationAndDefinition(MemberDef *mdec,MemberDef *mdef)
     //    mdef, mdef ? mdef->name().data() : "",
     //    mdec, mdec ? mdec->name().data() : "");
 
-    LockingPtr<ArgumentList> mdefAl = mdef->argumentList();
-    LockingPtr<ArgumentList> mdecAl = mdec->argumentList();
-    if (matchArguments2(mdef->getOuterScope(),mdef->getFileDef(),mdefAl.pointer(),
-          mdec->getOuterScope(),mdec->getFileDef(),mdecAl.pointer(),
+    ArgumentList *mdefAl = mdef->argumentList();
+    ArgumentList *mdecAl = mdec->argumentList();
+    if (matchArguments2(mdef->getOuterScope(),mdef->getFileDef(),mdefAl,
+          mdec->getOuterScope(),mdec->getFileDef(),mdecAl,
           TRUE
           )
        ) /* match found */
@@ -5065,7 +4745,7 @@ void combineDeclarationAndDefinition(MemberDef *mdec,MemberDef *mdef)
       //    );
 
       // first merge argument documentation
-      transferArgumentDocumentation(mdecAl.pointer(),mdefAl.pointer());
+      transferArgumentDocumentation(mdecAl,mdefAl);
 
       /* copy documentation between function definition and declaration */
       if (!mdec->briefDescription().isEmpty())
@@ -5078,27 +4758,27 @@ void combineDeclarationAndDefinition(MemberDef *mdec,MemberDef *mdef)
       }
       if (!mdef->documentation().isEmpty())
       {
-        //printf("transfering docs mdef->mdec (%s->%s)\n",mdef->argsString(),mdec->argsString());
+        //printf("transferring docs mdef->mdec (%s->%s)\n",mdef->argsString(),mdec->argsString());
         mdec->setDocumentation(mdef->documentation(),mdef->docFile(),mdef->docLine());
         mdec->setDocsForDefinition(mdef->isDocsForDefinition());
         if (mdefAl!=0)
         {
           ArgumentList *mdefAlComb = new ArgumentList;
           stringToArgumentList(mdef->argsString(),mdefAlComb);
-          transferArgumentDocumentation(mdefAl.pointer(),mdefAlComb);
+          transferArgumentDocumentation(mdefAl,mdefAlComb);
           mdec->setArgumentList(mdefAlComb);
         }
       }
       else if (!mdec->documentation().isEmpty())
       {
-        //printf("transfering docs mdec->mdef (%s->%s)\n",mdec->argsString(),mdef->argsString());
+        //printf("transferring docs mdec->mdef (%s->%s)\n",mdec->argsString(),mdef->argsString());
         mdef->setDocumentation(mdec->documentation(),mdec->docFile(),mdec->docLine());
         mdef->setDocsForDefinition(mdec->isDocsForDefinition());
         if (mdecAl!=0)
         {
           ArgumentList *mdecAlComb = new ArgumentList;
           stringToArgumentList(mdec->argsString(),mdecAlComb);
-          transferArgumentDocumentation(mdecAl.pointer(),mdecAlComb);
+          transferArgumentDocumentation(mdecAl,mdecAlComb);
           mdef->setDeclArgumentList(mdecAlComb);
         }
       }
@@ -5165,3 +4845,4 @@ void combineDeclarationAndDefinition(MemberDef *mdec,MemberDef *mdef)
   }
 }
 
+
index 8727302..8c88f7c 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -44,7 +44,7 @@ class MemberDef : public Definition
 {
   public:
     
-    MemberDef(const char *defFileName,int defLine,
+    MemberDef(const char *defFileName,int defLine,int defColumn,
               const char *type,const char *name,const char *args,
               const char *excp,Protection prot,Specifier virt,bool stat,
               Relationship related,MemberType t,const ArgumentList *tal,
@@ -73,7 +73,7 @@ class MemberDef : public Definition
     const char *extraTypeChars() const;
     const QCString &initializer() const;
     int initializerLines() const;
-    int  getMemberSpecifiers() const;
+    uint64 getMemberSpecifiers() const;
     MemberList *getSectionList(Definition *d) const;
 
     // scope query members
@@ -148,6 +148,16 @@ class MemberDef : public Definition
     bool isDefault() const;
     bool isDelete() const;
     bool isNoExcept() const;
+    bool isAttribute() const; // UNO IDL attribute
+    bool isUNOProperty() const; // UNO IDL property
+    bool isReadonly() const;
+    bool isBound() const;
+    bool isConstrained() const;
+    bool isTransient() const;
+    bool isMaybeVoid() const;
+    bool isMaybeDefault() const;
+    bool isMaybeAmbiguous() const;
+    bool isPublished() const; // UNO IDL published
     bool isTemplateSpecialization() const;
     bool hasDocumentedParams() const;
     bool hasDocumentedReturnType() const;
@@ -158,6 +168,7 @@ class MemberDef : public Definition
     bool hasOneLineInitializer() const;
     bool hasMultiLineInitializer() const;
     bool protectionVisible() const;
+    bool showInCallGraph() const;
 
     // output info
     bool isLinkableInProject() const;
@@ -171,7 +182,7 @@ class MemberDef : public Definition
     bool isDocumentedFriendClass() const;
 
     MemberDef *reimplements() const;
-    LockingPtr< MemberList > reimplementedBy() const;
+    MemberList *reimplementedBy() const;
     bool isReimplementedBy(ClassDef *cd) const;
 
     //int inbodyLine() const;
@@ -184,19 +195,19 @@ class MemberDef : public Definition
     MemberDef *getAnonymousEnumType() const;
     bool isDocsForDefinition() const;
     MemberDef *getEnumScope() const;
-    LockingPtr< MemberList > enumFieldList() const;
+    MemberList *enumFieldList() const;
     void setEnumBaseType(const QCString &type);
     QCString enumBaseType() const;
 
     bool hasExamples();
-    LockingPtr<ExampleSDict> getExamples() const;
+    ExampleSDict *getExamples() const;
     bool isPrototype() const;
 
     // argument related members
-    LockingPtr<ArgumentList> argumentList() const;
-    LockingPtr<ArgumentList> declArgumentList() const;
-    LockingPtr<ArgumentList> templateArguments() const;
-    LockingPtr< QList<ArgumentList> > definitionTemplateParameterLists() const;
+    ArgumentList *argumentList() const;
+    ArgumentList *declArgumentList() const;
+    ArgumentList *templateArguments() const;
+    QList<ArgumentList> *definitionTemplateParameterLists() const;
 
     // member group related members
     int getMemberGroupId() const;
@@ -240,8 +251,8 @@ class MemberDef : public Definition
     void setFileDef(FileDef *fd);
     void setAnchor();
     void setProtection(Protection p);
-    void setMemberSpecifiers(int s);
-    void mergeMemberSpecifiers(int s);
+    void setMemberSpecifiers(uint64 s);
+    void mergeMemberSpecifiers(uint64 s);
     void setInitializer(const char *i);
     void setBitfields(const char *s);
     void setMaxInitLines(int lines);
@@ -274,7 +285,7 @@ class MemberDef : public Definition
 
     // enumeration specific members
     void insertEnumField(MemberDef *md);
-    void setEnumScope(MemberDef *md);
+    void setEnumScope(MemberDef *md,bool livesInsideEnum=FALSE);
     void setEnumClassScope(ClassDef *cd);
     void setDocumentedEnumValues(bool value);
     void setAnonymousEnumType(MemberDef *md);
@@ -341,14 +352,16 @@ class MemberDef : public Definition
     // output generation
     void writeDeclaration(OutputList &ol,
                    ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd,
-                   bool inGroup,ClassDef *inheritFrom=0,const char *inheritId=0); 
+                   bool inGroup, const DefType compoundType,
+                   ClassDef *inheritFrom=0,const char *inheritId=0); 
     void writeDocumentation(MemberList *ml,OutputList &ol,
                             const char *scopeName,Definition *container,
                             bool inGroup,bool showEnumValues=FALSE,bool
                             showInline=FALSE);
     void writeMemberDocSimple(OutputList &ol,Definition *container);
     void writeEnumDeclaration(OutputList &typeDecl,
-            ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd);
+            ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd, 
+            const DefType compoundType);
     void warnIfUndocumented();
     
     MemberDef *createTemplateInstanceMember(ArgumentList *formalArgs,
@@ -380,7 +393,7 @@ class MemberDef : public Definition
                           const QCString &cfname,const QCString &ciname,
                           const QCString &cname);
     void _writeCategoryRelation(OutputList &ol);
-    void _writeTagData();
+    void _writeTagData(const DefType);
     void _addToSearchIndex();
 
     static int s_indentLevel;
@@ -393,9 +406,6 @@ class MemberDef : public Definition
                    bool onlyText=FALSE);
 
     MemberDefImpl *m_impl;
-    int m_cacheHandle;
-    off_t m_storagePos;     // location where the item is stored in file (if impl==0)
-    bool m_flushPending;
     uchar m_isLinkableCached;    // 0 = not cached, 1=FALSE, 2=TRUE
     uchar m_isConstructorCached; // 0 = not cached, 1=FALSE, 2=TRUE
     uchar m_isDestructorCached;  // 0 = not cached, 1=FALSE, 2=TRUE
index e7ce2b5..2df4a89 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -112,7 +112,7 @@ void MemberGroup::writeDeclarations(OutputList &ol,
   //printf("MemberGroup::writeDeclarations() %s\n",grpHeader.data());
   QCString ldoc = doc;
   if (!ldoc.isEmpty()) ldoc.prepend("<a name=\""+anchor()+"\" id=\""+anchor()+"\"></a>");
-  memberList->writeDeclarations(ol,cd,nd,fd,gd,grpHeader,ldoc,FALSE,showInline);
+  memberList->writeDeclarations(ol,cd,nd,fd,gd,grpHeader,ldoc,DefinitionIntf::TypeGroup,FALSE,showInline);
 }
 
 void MemberGroup::writePlainDeclarations(OutputList &ol,
@@ -121,7 +121,7 @@ void MemberGroup::writePlainDeclarations(OutputList &ol,
               )
 {
   //printf("MemberGroup::writePlainDeclarations() memberList->count()=%d\n",memberList->count());
-  memberList->writePlainDeclarations(ol,cd,nd,fd,gd,inheritedFrom,inheritId);
+  memberList->writePlainDeclarations(ol,cd,nd,fd,gd,DefinitionIntf::TypeGroup,inheritedFrom,inheritId);
 }
 
 void MemberGroup::writeDocumentation(OutputList &ol,const char *scopeName,
@@ -150,7 +150,7 @@ void MemberGroup::addGroupedInheritedMembers(OutputList &ol,ClassDef *cd,
     {
       MemberList ml(lt);
       ml.append(md);
-      ml.writePlainDeclarations(ol,cd,0,0,0,inheritedFrom,inheritId);
+      ml.writePlainDeclarations(ol,cd,0,0,0,DefinitionIntf::TypeGroup,inheritedFrom,inheritId);
     }
   }
 }
index 84b7d32..64a521b 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 5a36ef8..76ffff1 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -31,6 +31,7 @@
 #include "filedef.h"
 #include "membergroup.h"
 #include "config.h"
+#include "docparser.h"
 
 MemberList::MemberList()
 {
@@ -67,7 +68,7 @@ int MemberList::compareItems(QCollection::Item item1, QCollection::Item item2)
     else if (ord2 > ord1)
       return 1;
   }
-  int cmp = stricmp(c1->name(),c2->name());
+  int cmp = qstricmp(c1->name(),c2->name());
   return cmp!=0 ? cmp : c1->getDefLine()-c2->getDefLine();
 }
 
@@ -136,6 +137,9 @@ void MemberList::countDecMembers(bool countEnumValues,GroupDef *gd)
         case MemberType_Event:       // fall through
         case MemberType_Property:    m_varCnt++,m_numDecMembers++;  
                                      break;
+// apparently necessary to get this to show up in declarations section?
+        case MemberType_Interface:   // fall through
+        case MemberType_Service:     // fall through
         case MemberType_Function:    // fall through
         case MemberType_Signal:      // fall through
         case MemberType_DCOP:        // fall through
@@ -157,7 +161,7 @@ void MemberList::countDecMembers(bool countEnumValues,GroupDef *gd)
         case MemberType_Friend:      m_friendCnt++,m_numDecMembers++;  
                                      break;
         default:
-          err("Error: Unknown member type found for member `%s'\n!",md->name().data());
+          err("Unknown member type found for member `%s'\n!",md->name().data());
       }
     }
   }
@@ -250,6 +254,8 @@ bool MemberList::declVisible() const
         case MemberType_Slot:      // fall through
         case MemberType_DCOP:      // fall through
         case MemberType_Property:  // fall through
+        case MemberType_Interface: // fall through
+        case MemberType_Service:   // fall through
         case MemberType_Event:  
           return TRUE;
         case MemberType_Enumeration: 
@@ -296,7 +302,8 @@ bool MemberList::declVisible() const
 }
 
 void MemberList::writePlainDeclarations(OutputList &ol,
-                       ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd,
+                       ClassDef *cd,NamespaceDef *nd,FileDef *fd,
+                       GroupDef *gd, const DefinitionIntf::DefType compoundType,
                        ClassDef *inheritedFrom,const char *inheritId
                       )
 {
@@ -333,10 +340,12 @@ void MemberList::writePlainDeclarations(OutputList &ol,
         case MemberType_Slot:      // fall through
         case MemberType_DCOP:      // fall through
         case MemberType_Property:  // fall through
+        case MemberType_Interface: // fall through
+        case MemberType_Service:   // fall through
         case MemberType_Event:  
           {
             if (first) ol.startMemberList(),first=FALSE;
-            md->writeDeclaration(ol,cd,nd,fd,gd,m_inGroup,inheritedFrom,inheritId);
+            md->writeDeclaration(ol,cd,nd,fd,gd,m_inGroup,compoundType,inheritedFrom,inheritId);
             break;
           }
         case MemberType_Enumeration: 
@@ -373,28 +382,33 @@ void MemberList::writePlainDeclarations(OutputList &ol,
               ol.startMemberItem(md->anchor(),0,inheritId);
               ol.writeString("enum ");
               ol.insertMemberAlign();
-              md->writeEnumDeclaration(ol,cd,nd,fd,gd);
+              md->writeEnumDeclaration(ol,cd,nd,fd,gd,compoundType);
               ol.endMemberItem();
               if (!md->briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC"))
               {
-                ol.startMemberDescription(md->anchor());
-                ol.parseDoc(
+                DocRoot *rootNode = validatingParseDoc(
                     md->briefFile(),md->briefLine(),
                     cd,md,
                     md->briefDescription(),
                     TRUE,FALSE,0,TRUE,FALSE
                     );
-                if (md->isDetailedSectionLinkable())
+                if (rootNode && !rootNode->isEmpty())
                 {
-                  ol.disableAllBut(OutputGenerator::Html);
-                  ol.docify(" ");
-                  ol.startTextLink(md->getOutputFileBase(),
-                                   md->anchor());
-                  ol.parseText(theTranslator->trMore());
-                  ol.endTextLink();
-                  ol.enableAll();
+                  ol.startMemberDescription(md->anchor());
+                  ol.writeDoc(rootNode,cd,md);
+                  if (md->isDetailedSectionLinkable())
+                  {
+                    ol.disableAllBut(OutputGenerator::Html);
+                    ol.docify(" ");
+                    ol.startTextLink(md->getOutputFileBase(),
+                        md->anchor());
+                    ol.parseText(theTranslator->trMore());
+                    ol.endTextLink();
+                    ol.enableAll();
+                  }
+                  ol.endMemberDescription();
                 }
-                ol.endMemberDescription();
+                delete rootNode;
               }
               ol.endMemberDeclaration(md->anchor(),inheritId);
             }
@@ -409,7 +423,7 @@ void MemberList::writePlainDeclarations(OutputList &ol,
               ol.startMemberList();
               first=FALSE;
             }
-            md->writeDeclaration(ol,cd,nd,fd,gd,m_inGroup,inheritedFrom,inheritId);
+            md->writeDeclaration(ol,cd,nd,fd,gd,m_inGroup,compoundType,inheritedFrom,inheritId);
             break;
           }
         case MemberType_EnumValue: 
@@ -418,7 +432,7 @@ void MemberList::writePlainDeclarations(OutputList &ol,
             {
               //printf("EnumValue!\n");
               if (first) ol.startMemberList(),first=FALSE;
-              md->writeDeclaration(ol,cd,nd,fd,gd,m_inGroup,inheritedFrom,inheritId);
+              md->writeDeclaration(ol,cd,nd,fd,gd,m_inGroup,compoundType,inheritedFrom,inheritId);
             }
           }
           break;
@@ -444,7 +458,7 @@ void MemberList::writePlainDeclarations(OutputList &ol,
             ol.startMemberList();
             first=FALSE;
           }
-          md->writeDeclaration(ol,cd,nd,fd,gd,m_inGroup);
+          md->writeDeclaration(ol,cd,nd,fd,gd,m_inGroup,compoundType);
         }
         md->setFromAnonymousScope(TRUE);
       }
@@ -468,6 +482,7 @@ void MemberList::writePlainDeclarations(OutputList &ol,
  *  @param gd non-null if this list is part of group documentation.
  *  @param title Title to use for the member list.
  *  @param subtitle Sub title to use for the member list.
+ *  @param compoundType Container type for this member list.
  *  @param showEnumValues Obsolete, always set to FALSE.
  *  @param showInline if set to TRUE if title is rendered differently
  *  @param inheritedFrom if not 0, the list is shown inside the
@@ -476,7 +491,8 @@ void MemberList::writePlainDeclarations(OutputList &ol,
  */
 void MemberList::writeDeclarations(OutputList &ol,
              ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd,
-             const char *title,const char *subtitle, bool showEnumValues,
+             const char *title,const char *subtitle,
+             const DefinitionIntf::DefType compoundType,bool showEnumValues,
              bool showInline,ClassDef *inheritedFrom)
 {
   (void)showEnumValues; // unused
@@ -543,7 +559,7 @@ void MemberList::writeDeclarations(OutputList &ol,
       if (!st.isEmpty())
       {
         ol.startMemberSubtitle();
-        ol.parseDoc("[generated]",-1,ctx,0,subtitle,FALSE,FALSE,0,FALSE,FALSE);
+        ol.generateDoc("[generated]",-1,ctx,0,subtitle,FALSE,FALSE,0,FALSE,FALSE);
         ol.endMemberSubtitle();
       }
     }
@@ -562,7 +578,7 @@ void MemberList::writeDeclarations(OutputList &ol,
     }
     else
     {
-      writePlainDeclarations(ol,cd,nd,fd,gd,inheritedFrom,inheritId);
+      writePlainDeclarations(ol,cd,nd,fd,gd,compoundType,inheritedFrom,inheritId);
     }
 
     //printf("memberGroupList=%p\n",memberGroupList);
@@ -586,7 +602,7 @@ void MemberList::writeDeclarations(OutputList &ol,
           {
             //printf("Member group has docs!\n");
             ol.startMemberGroupDocs();
-            ol.parseDoc("[generated]",-1,ctx,0,mg->documentation()+"\n",FALSE,FALSE);
+            ol.generateDoc("[generated]",-1,ctx,0,mg->documentation()+"\n",FALSE,FALSE);
             ol.endMemberGroupDocs();
           }
           ol.startMemberGroup();
@@ -747,8 +763,8 @@ void MemberList::addListReferences(Definition *def)
     if (md->getGroupDef()==0 || def->definitionType()==Definition::TypeGroup)
     {
       md->addListReference(def);
-      LockingPtr<MemberList> enumFields = md->enumFieldList();
-      if (md->memberType()==MemberType_Enumeration && enumFields!=0)
+      MemberList *enumFields = md->enumFieldList();
+      if (md->memberType()==MemberType_Enumeration && enumFields)
       {
         //printf("  Adding enum values!\n");
         MemberListIterator vmli(*enumFields);
@@ -889,6 +905,8 @@ QCString MemberList::listTypeAsString() const
     case MemberListType_dcopMethods: return "dcop-methods";
     case MemberListType_properties: return "properties";
     case MemberListType_events: return "events";
+    case MemberListType_interfaces: return "interfaces";
+    case MemberListType_services: return "services";
     case MemberListType_decDefineMembers: return "define-members";
     case MemberListType_decProtoMembers: return "proto-members";
     case MemberListType_decTypedefMembers: return "typedef-members";
@@ -926,7 +944,7 @@ int MemberSDict::compareItems(QCollection::Item item1, QCollection::Item item2)
   MemberDef *c1=(MemberDef *)item1;
   MemberDef *c2=(MemberDef *)item2;
   //printf("MemberSDict::compareItems(%s,%s)\n",c1->name().data(),c2->name().data());
-  int cmp = stricmp(c1->name(),c2->name());
+  int cmp = qstricmp(c1->name(),c2->name());
   if (cmp)
   {
     return cmp;
index a047300..ce5a3d2 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -56,11 +56,12 @@ class MemberList : public QList<MemberDef>
     void countDocMembers(bool countEnumValues=FALSE);
     int countInheritableMembers(ClassDef *inheritedFrom) const;
     void writePlainDeclarations(OutputList &ol,
-               ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd,
+               ClassDef *cd,NamespaceDef *nd,FileDef *fd,
+               GroupDef *gd,const DefinitionIntf::DefType compoundType,
                ClassDef *inheritedFrom,const char *inheritId);
     void writeDeclarations(OutputList &ol,
                ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd,
-               const char *title,const char *subtitle,
+               const char *title,const char *subtitle,const DefinitionIntf::DefType compoundType,
                bool showEnumValues=FALSE,bool showInline=FALSE,
                ClassDef *inheritedFrom=0);
     void writeDocumentation(OutputList &ol,const char *scopeName,
index 324db7f..58eaf8c 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -39,9 +39,9 @@ int MemberName::compareItems(QCollection::Item item1, QCollection::Item item2)
   FileDef  *f1=m1->getFileDef();
   FileDef  *f2=m2->getFileDef();
   if (c1 && c2)
-    return strcmp(c1->name(),c2->name());
+    return qstrcmp(c1->name(),c2->name());
   else if (f1 && f2)
-    return strcmp(f1->name(),f2->name());
+    return qstrcmp(f1->name(),f2->name());
   else 
     return 0;
 }
@@ -61,9 +61,9 @@ int MemberNameInfo::compareItems(QCollection::Item item1, QCollection::Item item
   FileDef  *f1=m1->memberDef->getFileDef();
   FileDef  *f2=m2->memberDef->getFileDef();
   if (c1 && c2)
-    return strcmp(c1->name(),c2->name());
+    return qstrcmp(c1->name(),c2->name());
   else if (f1 && f2)
-    return strcmp(f1->name(),f2->name());
+    return qstrcmp(f1->name(),f2->name());
   else 
     return 0;
 }
@@ -76,7 +76,7 @@ int MemberNameSDict::compareItems(QCollection::Item item1, QCollection::Item ite
 {
   MemberName *n1=(MemberName *)item1;
   MemberName *n2=(MemberName *)item2;
-  return stricmp(n1->memberName()+getPrefixIndex(n1->memberName()),
+  return qstricmp(n1->memberName()+getPrefixIndex(n1->memberName()),
                  n2->memberName()+getPrefixIndex(n2->memberName())
                 );
 }
index 2abcbf3..0004aea 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -94,7 +94,7 @@ class MemberNameInfoSDict : public SDict<MemberNameInfo>
     MemberNameInfoSDict(int size) : SDict<MemberNameInfo>(size) {}
    ~MemberNameInfoSDict() {}
     int compareItems(QCollection::Item item1,QCollection::Item item2) 
-    { return stricmp(
+    { return qstricmp(
                     ((MemberNameInfo *)item1)->memberName(),
                     ((MemberNameInfo *)item2)->memberName()
                    );
index ed438bb..dd1f05c 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -26,6 +26,8 @@
 #include "filedef.h"
 
 static QCString outputFormat;
+static const char *warning_str = "Warning: ";
+static const char *error_str = "Error: ";
 //static int warnFormatOrder; // 1 = $file,$line,$text
 //                            // 2 = $text,$line,$file
 //                            // 3 = $line,$text,$file
@@ -149,11 +151,17 @@ static void format_warn(const char *file,int line,const char *text)
   fwrite(msgText.data(),1,msgText.length(),warnFile);
 }
 
-static void do_warn(const char *tag, const char *file, int line, const char *fmt, va_list args)
+static void do_warn(const char *tag, const char *file, int line, const char *prefix, const char *fmt, va_list args)
 {
   if (!Config_getBool(tag)) return; // warning type disabled
   char text[4096];
-  vsnprintf(text, 4096, fmt, args);
+  int l=0;
+  if (prefix)
+  {
+    strcpy(text,prefix);
+    l=strlen(prefix);
+  }
+  vsnprintf(text+l, 4096-l, fmt, args);
   text[4095]='\0';
   format_warn(file,line,text);
 }
@@ -162,21 +170,21 @@ void warn(const char *file,int line,const char *fmt, ...)
 {
   va_list args;
   va_start(args, fmt);
-  do_warn("WARNINGS", file, line, fmt, args);
+  do_warn("WARNINGS", file, line, warning_str, fmt, args);
   va_end(args); 
 }
 
 void warn_simple(const char *file,int line,const char *text)
 {
   if (!Config_getBool("WARNINGS")) return; // warning type disabled
-  format_warn(file,line,text);
+  format_warn(file,line,QCString(warning_str) + text);
 }
 
 void warn_undoc(const char *file,int line,const char *fmt, ...)
 {
   va_list args;
   va_start(args, fmt);
-  do_warn("WARN_IF_UNDOCUMENTED", file, line, fmt, args);
+  do_warn("WARN_IF_UNDOCUMENTED", file, line, warning_str, fmt, args);
   va_end(args);
 }
   
@@ -184,14 +192,22 @@ void warn_doc_error(const char *file,int line,const char *fmt, ...)
 {
   va_list args;
   va_start(args, fmt);
-  do_warn("WARN_IF_DOC_ERROR", file, line, fmt, args);
+  do_warn("WARN_IF_DOC_ERROR", file, line, warning_str, fmt, args);
   va_end(args);
 }
 
+void warn_uncond(const char *fmt, ...)
+{
+  va_list args;
+  va_start(args, fmt);
+  vfprintf(warnFile, (QCString(warning_str) + fmt).data(), args);
+  va_end(args); 
+}
+
 void err(const char *fmt, ...)
 {
   va_list args;
   va_start(args, fmt);
-  vfprintf(warnFile, fmt, args);
+  vfprintf(warnFile, (QCString(error_str) + fmt).data(), args);
   va_end(args); 
 }
index 46b736c..e01b8be 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -25,6 +25,7 @@ extern void warn(const char *file,int line,const char *fmt, ...);
 extern void warn_simple(const char *file,int line,const char *text);
 extern void warn_undoc(const char *file,int line,const char *fmt, ...);
 extern void warn_doc_error(const char *file,int line,const char *fmt, ...);
+extern void warn_uncond(const char *fmt, ...);
 extern void err(const char *fmt, ...);
 void initWarningFormat();
 
index fadbc0c..f9b069e 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -34,7 +34,7 @@ static bool convertMapFile(QTextStream &t,const char *mapName,const QCString rel
   QFile f(mapName);
   if (!f.open(IO_ReadOnly))
   {
-    err("error: failed to open map file %s for inclusion in the docs!\n"
+    err("failed to open map file %s for inclusion in the docs!\n"
         "If you installed Graphviz/dot after a previous failing run, \n"
         "try deleting the output directory and rerun doxygen.\n",mapName);
     return FALSE;
@@ -50,7 +50,7 @@ static bool convertMapFile(QTextStream &t,const char *mapName,const QCString rel
     int numBytes = f.readLine(buf,maxLineLen);
     buf[numBytes-1]='\0';
     //printf("ReadLine `%s'\n",buf);
-    if (strncmp(buf,"rect",4)==0)
+    if (qstrncmp(buf,"rect",4)==0)
     {
       // obtain the url and the coordinates in the order used by graphviz-1.5
       sscanf(buf,"rect %s %d,%d %d,%d",url,&x1,&y1,&x2,&y2);
@@ -136,7 +136,7 @@ void writeMscGraphFromFile(const char *inFile,const char *outDir,
     portable_sysTimerStart();
     if (portable_system("epstopdf",epstopdfArgs)!=0)
     {
-      err("error: Problems running epstopdf. Check your TeX installation!\n");
+      err("Problems running epstopdf. Check your TeX installation!\n");
     }
     portable_sysTimerStop();
   }
index 98beb56..711e3de 100644 (file)
--- a/src/msc.h
+++ b/src/msc.h
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index c57c7ca..cfca6d6 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
 
 //------------------------------------------------------------------
 
-NamespaceDef::NamespaceDef(const char *df,int dl,
+NamespaceDef::NamespaceDef(const char *df,int dl,int dc,
                            const char *name,const char *lref,
-                           const char *fName) : 
-   Definition(df,dl,name)
+                           const char *fName, const char*type,
+                           bool isPublished) :
+   Definition(df,dl,dc,name)
+  ,m_isPublished(isPublished)
 {
   if (fName)
   {
@@ -58,6 +60,18 @@ NamespaceDef::NamespaceDef(const char *df,int dl,
   memberGroupSDict->setAutoDelete(TRUE);
   visited=FALSE;
   m_subGrouping=Config_getBool("SUBGROUPING");
+  if (type && !strcmp("module", type))
+  {
+    m_type = MODULE;
+  }
+  else if (type && !strcmp("constants", type))
+  {
+    m_type = CONSTANT_GROUP;
+  }
+  else
+  {
+    m_type = NAMESPACE;
+  }
 }
 
 NamespaceDef::~NamespaceDef()
@@ -254,7 +268,7 @@ void NamespaceDef::writeDetailedDescription(OutputList &ol,const QCString &title
     ol.startTextBlock();
     if (!briefDescription().isEmpty() && Config_getBool("REPEAT_BRIEF"))
     {
-      ol.parseDoc(briefFile(),briefLine(),this,0,briefDescription(),FALSE,FALSE);
+      ol.generateDoc(briefFile(),briefLine(),this,0,briefDescription(),FALSE,FALSE);
     }
     if (!briefDescription().isEmpty() && Config_getBool("REPEAT_BRIEF") &&
         !documentation().isEmpty())
@@ -270,7 +284,7 @@ void NamespaceDef::writeDetailedDescription(OutputList &ol,const QCString &title
     }
     if (!documentation().isEmpty())
     {
-      ol.parseDoc(docFile(),docLine(),this,0,documentation()+"\n",TRUE,FALSE);
+      ol.generateDoc(docFile(),docLine(),this,0,documentation()+"\n",TRUE,FALSE);
     }
     ol.endTextBlock();
   }
@@ -280,25 +294,30 @@ void NamespaceDef::writeBriefDescription(OutputList &ol)
 {
   if (!briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC"))
   {
-    ol.startParagraph();
-    ol.parseDoc(briefFile(),briefLine(),this,0,
-                briefDescription(),TRUE,FALSE,0,TRUE,FALSE);
-    ol.pushGeneratorState();
-    ol.disable(OutputGenerator::RTF);
-    ol.writeString(" \n");
-    ol.enable(OutputGenerator::RTF);
-
-    if (Config_getBool("REPEAT_BRIEF") ||
-        !documentation().isEmpty()
-       )
+    DocRoot *rootNode = validatingParseDoc(briefFile(),briefLine(),this,0,
+                        briefDescription(),TRUE,FALSE,0,TRUE,FALSE);
+    if (rootNode && !rootNode->isEmpty())
     {
-      ol.disableAllBut(OutputGenerator::Html);
-      ol.startTextLink(0,"details");
-      ol.parseText(theTranslator->trMore());
-      ol.endTextLink();
+      ol.startParagraph();
+      ol.writeDoc(rootNode,this,0);
+      ol.pushGeneratorState();
+      ol.disable(OutputGenerator::RTF);
+      ol.writeString(" \n");
+      ol.enable(OutputGenerator::RTF);
+
+      if (Config_getBool("REPEAT_BRIEF") ||
+          !documentation().isEmpty()
+         )
+      {
+        ol.disableAllBut(OutputGenerator::Html);
+        ol.startTextLink(0,"details");
+        ol.parseText(theTranslator->trMore());
+        ol.endTextLink();
+      }
+      ol.popGeneratorState();
+      ol.endParagraph();
     }
-    ol.popGeneratorState();
-    ol.endParagraph();
+    delete rootNode;
 
     // FIXME:PARA
     //ol.pushGeneratorState();
@@ -347,9 +366,10 @@ void NamespaceDef::writeInlineClasses(OutputList &ol)
   if (classSDict) classSDict->writeDocumentation(ol,this);
 }
 
-void NamespaceDef::writeNamespaceDeclarations(OutputList &ol,const QCString &title)
+void NamespaceDef::writeNamespaceDeclarations(OutputList &ol,const QCString &title,
+            bool const isConstantGroup)
 {
-  if (namespaceSDict) namespaceSDict->writeDeclaration(ol,title,TRUE);
+  if (namespaceSDict) namespaceSDict->writeDeclaration(ol,title,isConstantGroup,TRUE);
 }
 
 void NamespaceDef::writeMemberGroups(OutputList &ol)
@@ -421,6 +441,20 @@ void NamespaceDef::writeSummaryLinks(OutputList &ol)
   ol.popGeneratorState();
 }
 
+void NamespaceDef::addNamespaceAttributes(OutputList &ol)
+{
+  // UNO IDL constant groups may be published
+  if (getLanguage()==SrcLangExt_IDL && isConstantGroup() && m_isPublished)
+  {
+    ol.pushGeneratorState();
+    ol.disableAllBut(OutputGenerator::Html);
+    ol.startLabels();
+    ol.writeLabel("published",false);
+    ol.endLabels();
+    ol.popGeneratorState();
+  }
+}
+
 void NamespaceDef::writeDocumentation(OutputList &ol)
 {
   static bool generateTreeView = Config_getBool("GENERATE_TREEVIEW");
@@ -437,6 +471,12 @@ void NamespaceDef::writeDocumentation(OutputList &ol)
   {
     pageTitle = theTranslator->trModuleReference(displayName());
   }
+  else if (lang==SrcLangExt_IDL)
+  {
+    pageTitle = isConstantGroup()
+        ? theTranslator->trConstantGroupReference(displayName())
+        : theTranslator->trModuleReference(displayName());
+  }
   else
   {
     pageTitle = theTranslator->trNamespaceReference(displayName());
@@ -455,6 +495,7 @@ void NamespaceDef::writeDocumentation(OutputList &ol)
   startTitle(ol,getOutputFileBase(),this);
   ol.parseText(pageTitle);
   addGroupListToTitle(ol,this);
+  addNamespaceAttributes(ol);
   endTitle(ol,getOutputFileBase(),displayName());
   ol.startContents();
   
@@ -470,6 +511,11 @@ void NamespaceDef::writeDocumentation(OutputList &ol)
     Doxygen::tagFile << "  <compound kind=\"namespace\">" << endl;
     Doxygen::tagFile << "    <name>" << convertToXML(name()) << "</name>" << endl;
     Doxygen::tagFile << "    <filename>" << convertToXML(getOutputFileBase()) << Doxygen::htmlFileExtension << "</filename>" << endl;
+    QCString idStr = id();
+    if (!idStr.isEmpty())
+    {
+      Doxygen::tagFile << "    <clangid>" << convertToXML(idStr) << "</clangid>" << endl;
+    }
   }
 
   Doxygen::indexList->addIndexItem(this,0);
@@ -498,9 +544,15 @@ void NamespaceDef::writeDocumentation(OutputList &ol)
       case LayoutDocEntry::NamespaceNestedNamespaces: 
         {
           LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
-          writeNamespaceDeclarations(ol,ls->title(lang));
+          writeNamespaceDeclarations(ol,ls->title(lang),false);
         }
         break; 
+      case LayoutDocEntry::NamespaceNestedConstantGroups:
+        {
+          LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
+          writeNamespaceDeclarations(ol,ls->title(lang),true);
+        }
+        break;
       case LayoutDocEntry::MemberGroups: 
         writeMemberGroups(ol);
         break; 
@@ -546,6 +598,7 @@ void NamespaceDef::writeDocumentation(OutputList &ol)
       case LayoutDocEntry::ClassInlineClasses:
       case LayoutDocEntry::FileClasses:
       case LayoutDocEntry::FileNamespaces:
+      case LayoutDocEntry::FileConstantGroups:
       case LayoutDocEntry::FileIncludes:
       case LayoutDocEntry::FileIncludeGraph:
       case LayoutDocEntry::FileIncludedByGraph: 
@@ -720,8 +773,8 @@ void NamespaceDef::addListReferences()
 {
   //bool fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN");
   {
-    LockingPtr< QList<ListItemInfo> > xrefItems = xrefListItems();
-    addRefItem(xrefItems.pointer(),
+    QList<ListItemInfo> *xrefItems = xrefListItems();
+    addRefItem(xrefItems,
         qualifiedName(),
         getLanguage()==SrcLangExt_Fortran ? 
           theTranslator->trModule(TRUE,TRUE) : 
@@ -825,7 +878,8 @@ bool NamespaceSDict::declVisible() const
   return FALSE;
 }
 
-void NamespaceSDict::writeDeclaration(OutputList &ol,const char *title,bool localName)
+void NamespaceSDict::writeDeclaration(OutputList &ol,const char *title,
+        bool const isConstantGroup,bool localName)
 {
  
 
@@ -839,7 +893,27 @@ void NamespaceSDict::writeDeclaration(OutputList &ol,const char *title,bool loca
   bool found=FALSE;
   for (ni.toFirst();(nd=ni.current()) && !found;++ni)
   {
-    if (nd->isLinkable()) found=TRUE;
+    if (nd->isLinkable())
+    {
+      SrcLangExt lang = nd->getLanguage();
+      if (SrcLangExt_IDL==lang)
+      {
+        if (isConstantGroup == nd->isConstantGroup())
+        {
+          found=TRUE;
+          break;
+        }
+      }
+      else if (!isConstantGroup) // ensure we only get extra section in IDL
+      {
+        if (nd->isConstantGroup())
+        {
+          err("Internal inconsistency: constant group but not IDL?");
+        }
+        found=TRUE;
+        break;
+      }
+    }
   }
   if (!found) return; // no linkable namespaces in the list
 
@@ -855,6 +929,8 @@ void NamespaceSDict::writeDeclaration(OutputList &ol,const char *title,bool loca
     if (nd->isLinkable())
     {
       SrcLangExt lang = nd->getLanguage();
+      if (lang==SrcLangExt_IDL && (isConstantGroup != nd->isConstantGroup()))
+          continue; // will be output in another pass, see layout_default.xml
       ol.startMemberDeclaration();
       ol.startMemberItem(nd->getOutputFileBase(),0);
       if (lang==SrcLangExt_Java || lang==SrcLangExt_CSharp)
@@ -865,9 +941,20 @@ void NamespaceSDict::writeDeclaration(OutputList &ol,const char *title,bool loca
       {
         ol.docify("module ");
       }
-      else
+      else if (lang==SrcLangExt_IDL)
       {
-        ol.docify("namespace ");
+        if (nd->isModule())
+        {
+          ol.docify("module ");
+        }
+        else if (nd->isConstantGroup())
+        {
+          ol.docify("constants");
+        }
+        else
+        {
+          err("Internal inconsistency: namespace in IDL not module or cg");
+        }
       }
       ol.insertMemberAlign();
       QCString name;
@@ -888,7 +975,7 @@ void NamespaceSDict::writeDeclaration(OutputList &ol,const char *title,bool loca
       if (!nd->briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC"))
       {
         ol.startMemberDescription(nd->getOutputFileBase());
-        ol.parseDoc(nd->briefFile(),nd->briefLine(),nd,0,nd->briefDescription(),FALSE,FALSE,0,TRUE);
+        ol.generateDoc(nd->briefFile(),nd->briefLine(),nd,0,nd->briefDescription(),FALSE,FALSE,0,TRUE);
         ol.endMemberDescription();
       }
       ol.endMemberDeclaration(0,0);
@@ -965,7 +1052,7 @@ MemberList *NamespaceDef::getMemberList(MemberListType lt) const
 void NamespaceDef::writeMemberDeclarations(OutputList &ol,MemberListType lt,const QCString &title)
 {
   MemberList * ml = getMemberList(lt);
-  if (ml) ml->writeDeclarations(ol,0,this,0,0,title,0);
+  if (ml) ml->writeDeclarations(ol,0,this,0,0,title,0,DefinitionIntf::TypeNamespace);
 }
 
 void NamespaceDef::writeMemberDocumentation(OutputList &ol,MemberListType lt,const QCString &title)
index 8458a78..ff64107 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -37,9 +37,10 @@ class NamespaceSDict;
 class NamespaceDef : public Definition
 {
   public:
-    NamespaceDef(const char *defFileName,int defLine,
+    NamespaceDef(const char *defFileName,int defLine,int defColumn,
                  const char *name,const char *ref=0,
-                 const char *refFile=0);
+                 const char *refFile=0,const char*type=0,
+                 bool isPublished=false);
    ~NamespaceDef();
     DefType definitionType() const { return TypeNamespace; }
     QCString getOutputFileBase() const;
@@ -63,7 +64,10 @@ class NamespaceDef : public Definition
     void combineUsingRelations();
     QCString displayName(bool=TRUE) const;
     QCString localName() const;
-    
+
+    bool isConstantGroup() const { return CONSTANT_GROUP == m_type; }
+    bool isModule()        const { return MODULE == m_type; }
+
     bool isLinkableInProject() const;
     bool isLinkable() const;
     void addMembersToMemberGroup();
@@ -101,12 +105,14 @@ class NamespaceDef : public Definition
     void endMemberDeclarations(OutputList &ol);
     void writeClassDeclarations(OutputList &ol,const QCString &title);
     void writeInlineClasses(OutputList &ol);
-    void writeNamespaceDeclarations(OutputList &ol,const QCString &title);
+    void writeNamespaceDeclarations(OutputList &ol,const QCString &title,
+            bool isConstantGroup=false);
     void writeMemberGroups(OutputList &ol);
     void writeAuthorSection(OutputList &ol);
     void startMemberDocumentation(OutputList &ol);
     void endMemberDocumentation(OutputList &ol);
     void writeSummaryLinks(OutputList &ol);
+    void addNamespaceAttributes(OutputList &ol);
 
     QCString              fileName;
     QStrList              files;
@@ -121,6 +127,8 @@ class NamespaceDef : public Definition
     ClassSDict           *classSDict;
     NamespaceSDict       *namespaceSDict;
     bool                  m_subGrouping;
+    enum { NAMESPACE, MODULE, CONSTANT_GROUP } m_type;
+    bool m_isPublished;
 };
 
 /** A list of NamespaceDef objects. */
@@ -130,7 +138,7 @@ class NamespaceList : public QList<NamespaceDef>
    ~NamespaceList() {}
     int compareItems(QCollection::Item item1,QCollection::Item item2)
     {
-      return stricmp(((NamespaceDef *)item1)->name(),
+      return qstricmp(((NamespaceDef *)item1)->name(),
                     ((NamespaceDef *)item2)->name()
                    );
     }
@@ -160,11 +168,12 @@ class NamespaceSDict : public SDict<NamespaceDef>
    ~NamespaceSDict() {}
     int compareItems(QCollection::Item item1,QCollection::Item item2)
     {
-      return stricmp(((NamespaceDef *)item1)->name(),
+      return qstricmp(((NamespaceDef *)item1)->name(),
                     ((NamespaceDef *)item2)->name()
                    );
     }
-    void writeDeclaration(OutputList &ol,const char *title,bool localName=FALSE);
+    void writeDeclaration(OutputList &ol,const char *title,
+            bool isConstantGroup=false, bool localName=FALSE);
     bool declVisible() const;
 };
 
index 4258397..989811a 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -19,6 +19,9 @@
 #include <assert.h>
 #include <qglobal.h>
 #include "objcache.h"
+#if !defined(_OS_WIN32_)
+#include <stdint.h>
+#endif
 
 //----------------------------------------------------------------------
 
@@ -189,7 +192,7 @@ unsigned int ObjCache::hash(void *addr)
   else
   {
     // Thomas Wang's 32 bit Mix Function
-    unsigned long key = (unsigned long)addr;
+    uintptr_t key = (uintptr_t)addr;
     key += ~(key << 15);
     key ^=  (key >> 10);
     key +=  (key << 3);
index 71e7178..d93c1f6 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 13b6e62..89686e0 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 8d67e3d..2a959e4 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -71,8 +71,6 @@ class CodeOutputInterface
     virtual void startFontClass(const char *) = 0;
     virtual void endFontClass() = 0;
     virtual void writeCodeAnchor(const char *name) = 0;
-    virtual void linkableSymbol(int line,const char *symName,
-                 Definition *symDef,Definition *context) = 0;
     virtual void setCurrentDoc(Definition *context,const char *anchor,bool isSourceFile) = 0;
     virtual void addWord(const char *word,bool hiPriority) = 0;
 };
@@ -98,7 +96,7 @@ class BaseOutputDocInterface : public CodeOutputInterface
                         Examples 
                       };
 
-    virtual void parseText(const QCString &)  {}
+    virtual bool parseText(const QCString &s)  { return s.isEmpty(); }
     
     /*! Start of a bullet list: e.g. \c \<ul\> in html. startItemListItem() is
      *  Used for the bullet items.
@@ -406,6 +404,7 @@ class OutputGenerator : public BaseOutputDocInterface
     virtual void endParameterName(bool,bool,bool) = 0;
     virtual void startParameterList(bool) = 0;
     virtual void endParameterList() = 0;
+    virtual void exceptionEntry(const char*,bool) = 0;
 
     virtual void startConstraintList(const char *) = 0;
     virtual void startConstraintParam() = 0;
index 5ea2a21..2928400 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -130,14 +130,14 @@ void OutputList::popGeneratorState()
   }
 }
 
-void OutputList::parseDoc(const char *fileName,int startLine,
+bool OutputList::generateDoc(const char *fileName,int startLine,
                   Definition *ctx,MemberDef * md,
                   const QCString &docStr,bool indexWords,
                   bool isExample,const char *exampleName,
                   bool singleLine,bool linkFromIndex)
 {
   int count=0;
-  if (docStr.isEmpty()) return;
+  if (docStr.isEmpty()) return TRUE;
   
   OutputGenerator *og=outputs->first();
   while (og)
@@ -145,23 +145,25 @@ void OutputList::parseDoc(const char *fileName,int startLine,
     if (og->isEnabled()) count++;
     og=outputs->next();
   }
-  if (count==0) return; // no output formats enabled.
+  if (count==0) return TRUE; // no output formats enabled.
 
-  DocNode *root=0;
-  if (docStr.at(docStr.length()-1)=='\n')
-  {
-    root = validatingParseDoc(fileName,startLine,
-                              ctx,md,docStr,indexWords,isExample,exampleName,
-                              singleLine,linkFromIndex);
-  }
-  else
-  {
-    root = validatingParseDoc(fileName,startLine,
-                              ctx,md,docStr+"\n",indexWords,isExample,exampleName,
-                              singleLine,linkFromIndex);
-  }
+  DocRoot *root=0;
+  root = validatingParseDoc(fileName,startLine,
+                            ctx,md,docStr,indexWords,isExample,exampleName,
+                            singleLine,linkFromIndex);
 
-  og=outputs->first();
+  writeDoc(root,ctx,md);
+
+  bool isEmpty = root->isEmpty();
+
+  delete root;
+
+  return isEmpty;
+}
+
+void OutputList::writeDoc(DocRoot *root,Definition *ctx,MemberDef *md)
+{
+  OutputGenerator *og=outputs->first();
   while (og)
   {
     //printf("og->printDoc(extension=%s)\n",
@@ -171,11 +173,9 @@ void OutputList::parseDoc(const char *fileName,int startLine,
   }
 
   VhdlDocGen::setFlowMember(0);
-
-  delete root;
 }
 
-void OutputList::parseText(const QCString &textStr)
+bool OutputList::parseText(const QCString &textStr)
 {
   int count=0;
   OutputGenerator *og=outputs->first();
@@ -184,9 +184,9 @@ void OutputList::parseText(const QCString &textStr)
     if (og->isEnabled()) count++;
     og=outputs->next();
   }
-  if (count==0) return; // no output formats enabled.
+  if (count==0) return TRUE; // no output formats enabled.
 
-  DocNode *root = validatingParseText(textStr);
+  DocText *root = validatingParseText(textStr);
 
   og=outputs->first();
   while (og)
@@ -195,7 +195,11 @@ void OutputList::parseText(const QCString &textStr)
     og=outputs->next();
   }
 
+  bool isEmpty = root->isEmpty();
+
   delete root;
+
+  return isEmpty;
 }
 
 
index 23221d3..b328056 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -42,6 +42,7 @@ class DotInclDepGraph;
 class DotGfxHierarchyTable;
 class SectionDict;
 class DotGroupCollaboration;
+class DocRoot;
 
 /** Class representing a list of output generators that are written to
  *  in parallel. 
@@ -69,11 +70,12 @@ class OutputList : public OutputDocInterface
     // OutputDocInterface implementation
     //////////////////////////////////////////////////
 
-    void parseDoc(const char *fileName,int startLine,
-                  Definition *ctx,MemberDef *md,const QCString &docStr,
-                  bool indexWords,bool isExample,const char *exampleName=0,
-                  bool singleLine=FALSE,bool linkFromIndex=FALSE);
-    void parseText(const QCString &textStr);
+    bool generateDoc(const char *fileName,int startLine,
+                     Definition *ctx,MemberDef *md,const QCString &docStr,
+                     bool indexWords,bool isExample,const char *exampleName=0,
+                     bool singleLine=FALSE,bool linkFromIndex=FALSE);
+    void writeDoc(DocRoot *root,Definition *ctx,MemberDef *md);
+    bool parseText(const QCString &textStr);
     
 
     void startIndexSection(IndexSections is)
@@ -422,6 +424,8 @@ class OutputList : public OutputDocInterface
     { forall(&OutputGenerator::startParameterList,openBracket); }
     void endParameterList()
     { forall(&OutputGenerator::endParameterList); }
+    void exceptionEntry(const char* prefix,bool closeBracket)
+    { forall(&OutputGenerator::exceptionEntry,prefix,closeBracket); }
 
     void startConstraintList(const char *header) 
     { forall(&OutputGenerator::startConstraintList,header); }
@@ -493,9 +497,6 @@ class OutputList : public OutputDocInterface
         og=outputs->next();
       }
     }
-    void linkableSymbol(int,const char *,Definition *,Definition *) {}
-
-
 
   private:
     void debug();
index 7fc4639..e93b3fd 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -28,7 +28,7 @@
 
 PageDef::PageDef(const char *f,int l,const char *n,
                  const char *d,const char *t)
- : Definition(f,l,n), m_title(t)
+ : Definition(f,l,1,n), m_title(t)
 {
   setDocumentation(d,f,l);
   m_subPageDict = new PageSDict(7);
@@ -49,7 +49,7 @@ void PageDef::findSectionsInDocumentation()
 
 GroupDef *PageDef::getGroupDef() const 
 { 
-  LockingPtr<GroupList> groups = partOfGroups();
+  GroupList *groups = partOfGroups();
   return groups!=0 ? groups->getFirst() : 0; 
 }
 
@@ -90,8 +90,9 @@ void PageDef::writeDocumentation(OutputList &ol)
   static bool generateTreeView = Config_getBool("GENERATE_TREEVIEW");
 
   //outputList->disable(OutputGenerator::Man);
-  QCString pageName;
-  pageName=escapeCharsInString(name(),FALSE,TRUE);
+  QCString pageName,manPageName;
+  pageName    = escapeCharsInString(name(),FALSE,TRUE);
+  manPageName = escapeCharsInString(name(),TRUE,TRUE);
 
   //printf("PageDef::writeDocumentation: %s\n",getOutputFileBase().data());
 
@@ -110,7 +111,15 @@ void PageDef::writeDocumentation(OutputList &ol)
     ol.enable(OutputGenerator::Html);
   }
 
+  ol.pushGeneratorState();
+  //2.{ 
+  ol.disableAllBut(OutputGenerator::Man);
+  startFile(ol,getOutputFileBase(),manPageName,title(),HLI_Pages,!generateTreeView);
+  ol.enableAll();
+  ol.disable(OutputGenerator::Man);
   startFile(ol,getOutputFileBase(),pageName,title(),HLI_Pages,!generateTreeView);
+  ol.popGeneratorState();
+  //2.} 
 
   if (!generateTreeView)
   {
@@ -126,11 +135,11 @@ void PageDef::writeDocumentation(OutputList &ol)
   ol.pushGeneratorState();
   //2.{
   ol.disableAllBut(OutputGenerator::Man);
-  ol.startTitleHead(pageName);
-  ol.endTitleHead(pageName, pageName);
+  ol.startTitleHead(manPageName);
+  ol.endTitleHead(manPageName, manPageName);
   if (si)
   {
-    ol.parseDoc(docFile(),docLine(),this,0,si->title,TRUE,FALSE,0,TRUE,FALSE);
+    ol.generateDoc(docFile(),docLine(),this,0,si->title,TRUE,FALSE,0,TRUE,FALSE);
     ol.endSection(si->label,si->type);
   }
   ol.popGeneratorState();
@@ -146,7 +155,7 @@ void PageDef::writeDocumentation(OutputList &ol)
   {
     //ol.startSection(si->label,si->title,si->type);
     startTitle(ol,getOutputFileBase(),this);
-    ol.parseDoc(docFile(),docLine(),this,0,si->title,TRUE,FALSE,0,TRUE,FALSE);
+    ol.generateDoc(docFile(),docLine(),this,0,si->title,TRUE,FALSE,0,TRUE,FALSE);
     //stringToSearchIndex(getOutputFileBase(),
     //                    theTranslator->trPage(TRUE,TRUE)+" "+si->title,
     //                    si->title);
@@ -179,10 +188,10 @@ void PageDef::writeDocumentation(OutputList &ol)
 
   if (!Config_getString("GENERATE_TAGFILE").isEmpty())
   {
-    bool found=FALSE;
+    bool found = name()=="citelist";
     QDictIterator<RefList> rli(*Doxygen::xrefLists);
     RefList *rl;
-    for (rli.toFirst();(rl=rli.current());++rli)
+    for (rli.toFirst();(rl=rli.current()) && !found;++rli)
     {
       if (rl->listName()==name())
       {
@@ -214,7 +223,7 @@ void PageDef::writePageDocumentation(OutputList &ol)
   }
 
   ol.startTextBlock();
-  ol.parseDoc(
+  ol.generateDoc(
       docFile(),           // fileName
       docLine(),           // startLine
       this,                // context
@@ -265,16 +274,11 @@ void PageDef::writePageDocumentation(OutputList &ol)
 
 bool PageDef::visibleInIndex() const
 {
-  static bool allExternals = Config_getBool("ALLEXTERNALS");
+  static bool externalPages = Config_getBool("EXTERNAL_PAGES");
   return // not part of a group
          !getGroupDef() && 
          // not an externally defined page
-         (!isReference() || allExternals) 
-         // &&
-         // not a subpage
-         //(getOuterScope()==0 || 
-         // getOuterScope()->definitionType()!=Definition::TypePage
-         //)
+         (!isReference() || externalPages) 
          ;
 }
 
index b73ed3b..4670ecd 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -84,7 +84,7 @@ class PageSDict : public SDict<PageDef>
     virtual ~PageSDict() {}
     int compareItems(QCollection::Item i1,QCollection::Item i2)
     {
-      return stricmp(((PageDef *)i1)->name(),((PageDef *)i2)->name());
+      return qstricmp(((PageDef *)i1)->name(),((PageDef *)i2)->name());
     }
 };
 
index 7211274..0274c13 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -19,6 +19,7 @@
 #define PARSERINTF_H
 
 #include <qdict.h>
+#include <qstrlist.h>
 
 class Entry;
 class FileDef;
@@ -36,15 +37,37 @@ class ParserInterface
 {
   public:
     virtual ~ParserInterface() {}
+
+    /** Starts processing a translation unit (source files + headers).
+     *  After this call parseInput() is called with sameTranslationUnit
+     *  set to FALSE. If parseInput() returns additional include files,
+     *  these are also processed using parseInput() with 
+     *  sameTranslationUnit set to TRUE. After that
+     *  finishTranslationUnit() is called.
+     */
+    virtual void startTranslationUnit(const char *fileName) = 0;
+
+    /** Called after all files in a translation unit have been 
+     *  processed.
+     */
+    virtual void finishTranslationUnit() = 0;
+
     /** Parses a single input file with the goal to build an Entry tree. 
      *  @param[in] fileName    The full name of the file.
      *  @param[in] fileBuf     The contents of the file (zero terminated).
      *  @param[in,out] root    The root of the tree of Entry *nodes 
      *             representing the information extracted from the file.
+     *  @param[in] sameTranslationUnit TRUE if this file was found in the same
+     *             translation unit (in the filesInSameTranslationUnit list
+     *             returned for another file).
+     *  @param[in,out] filesInSameTranslationUnit other files expected to be
+     *              found in the same translation unit (used for libclang)
      */
     virtual void parseInput(const char *fileName,
                             const char *fileBuf,
-                            Entry *root) = 0;
+                            Entry *root,
+                            bool sameTranslationUnit,
+                            QStrList &filesInSameTranslationUnit) = 0;
 
     /** Returns TRUE if the language identified by \a extension needs
      *  the C preprocessor to be run before feed the result to the input
index 2a80f8f..9257df0 100644 (file)
@@ -3,7 +3,7 @@
  *
  *
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  * Authors: Dimitri van Heesch, Miguel Lobo.
  *
  * Permission to use, copy, modify, and distribute this software and its
@@ -642,7 +642,7 @@ void PerlModDocVisitor::visit(DocSymbol *sy)
     case DocSymbol::RightCeil:     symbol = "rceil"; break;
     case DocSymbol::LeftFloor:     symbol = "lfloor"; break;
     case DocSymbol::RightFloor:    symbol = "rfloor"; break;
-    case DocSymbol::Unknown: err("error: unknown symbol found\n");
+    case DocSymbol::Unknown: err("unknown symbol found\n");
                              break;
   }
   if (c != 0) 
@@ -718,14 +718,15 @@ void PerlModDocVisitor::visit(DocVerbatim *s)
       m_output.add("</programlisting>");
 #endif
       return;
-    case DocVerbatim::Verbatim:         type = "preformatted"; break;
-    case DocVerbatim::HtmlOnly:         type = "htmlonly";     break;
-    case DocVerbatim::RtfOnly:  type = "rtfonly";      break;
-    case DocVerbatim::ManOnly:  type = "manonly";      break;
+    case DocVerbatim::Verbatim:  type = "preformatted"; break;
+    case DocVerbatim::HtmlOnly:  type = "htmlonly";     break;
+    case DocVerbatim::RtfOnly:   type = "rtfonly";      break;
+    case DocVerbatim::ManOnly:   type = "manonly";      break;
     case DocVerbatim::LatexOnly: type = "latexonly";    break;
-    case DocVerbatim::XmlOnly:  type = "xmlonly";      break;
-    case DocVerbatim::Dot:      type = "dot";          break;
-    case DocVerbatim::Msc:      type = "msc";          break;
+    case DocVerbatim::XmlOnly:   type = "xmlonly";      break;
+    case DocVerbatim::DocbookOnly: type = "docbookonly"; break;
+    case DocVerbatim::Dot:         type = "dot"; break;
+    case DocVerbatim::Msc:       type = "msc";          break;
   }
   openItem(type);
   m_output.addFieldQuotedString("content", s->text());
@@ -909,7 +910,7 @@ void PerlModDocVisitor::visitPre(DocSimpleSect *s)
   case DocSimpleSect::User:            type = "par"; break;
   case DocSimpleSect::Rcs:             type = "rcs"; break;
   case DocSimpleSect::Unknown:
-    err("error: unknown simple section found\n");
+    err("unknown simple section found\n");
     break;
   }
   leaveText();
@@ -1282,7 +1283,7 @@ void PerlModDocVisitor::visitPre(DocParamSect *s)
   case DocParamSect::Exception: type = "exceptions"; break;
   case DocParamSect::TemplateParam: type = "templateparam"; break;
   case DocParamSect::Unknown:
-    err("error: unknown parameter section found\n");
+    err("unknown parameter section found\n");
     break;
   }
   openOther();
@@ -1574,6 +1575,8 @@ void PerlModGenerator::generatePerlModForMember(MemberDef *md,Definition *)
   case MemberType_DCOP:        memType="dcop";      isFunc=TRUE; break;
   case MemberType_Slot:        memType="slot";      isFunc=TRUE; break;
   case MemberType_Event:       memType="event";     break;
+  case MemberType_Interface:   memType="interface"; break;
+  case MemberType_Service:     memType="service";   break;
   }
 
   m_output.openHash()
@@ -1589,16 +1592,16 @@ void PerlModGenerator::generatePerlModForMember(MemberDef *md,Definition *)
       md->memberType()!=MemberType_Enumeration)
     m_output.addFieldQuotedString("type", md->typeString());
   
-  LockingPtr<ArgumentList> al = md->argumentList();
+  ArgumentList *al = md->argumentList();
   if (isFunc) //function
   {
     m_output.addFieldBoolean("const", al!=0 && al->constSpecifier)
       .addFieldBoolean("volatile", al!=0 && al->volatileSpecifier);
 
     m_output.openList("parameters");
-    LockingPtr<ArgumentList> declAl = md->declArgumentList();
-    LockingPtr<ArgumentList> defAl  = md->argumentList();
-    if (declAl!=0 && declAl->count()>0)
+    ArgumentList *declAl = md->declArgumentList();
+    ArgumentList *defAl  = md->argumentList();
+    if (declAl && declAl->count()>0)
     {
       ArgumentListIterator declAli(*declAl);
       ArgumentListIterator defAli(*defAl);
@@ -1659,8 +1662,8 @@ void PerlModGenerator::generatePerlModForMember(MemberDef *md,Definition *)
   
   if (md->memberType()==MemberType_Enumeration) // enum
   {
-    LockingPtr<MemberList> enumFields = md->enumFieldList();
-    if (enumFields!=0)
+    MemberList *enumFields = md->enumFieldList();
+    if (enumFields)
     {
       m_output.openList("values");
       MemberListIterator emli(*enumFields);
@@ -1689,8 +1692,8 @@ void PerlModGenerator::generatePerlModForMember(MemberDef *md,Definition *)
       .addFieldQuotedString("name", rmd->name())
       .closeHash();
 
-  LockingPtr<MemberList> rbml = md->reimplementedBy();
-  if (rbml!=0)
+  MemberList *rbml = md->reimplementedBy();
+  if (rbml)
   {
     MemberListIterator mli(*rbml);
     m_output.openList("reimplemented_by");
@@ -2255,13 +2258,13 @@ bool PerlModGenerator::createOutputDir(QDir &perlModDir)
       dir.setPath(QDir::currentDirPath());
       if (!dir.mkdir(outputDirectory))
       {
-       err("error: tag OUTPUT_DIRECTORY: Output directory `%s' does not "
+       err("tag OUTPUT_DIRECTORY: Output directory `%s' does not "
            "exist and cannot be created\n",outputDirectory.data());
        exit(1);
       }
-      else if (!Config_getBool("QUIET"))
+      else
       {
-       err("notice: Output directory `%s' does not exist. "
+       msg("Notice: Output directory `%s' does not exist. "
            "I have created it for you.\n", outputDirectory.data());
       }
       dir.cd(outputDirectory);
index 4307d9b..7f593b2 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 554bb0b..2083cbf 100644 (file)
@@ -190,15 +190,15 @@ void portable_setenv(const char *name,const char *value)
 #else
     register char **ep = 0;
     register size_t size;
-    const size_t namelen=strlen(name);
-    const size_t vallen=strlen(value) + 1;
+    const size_t namelen=qstrlen(name);
+    const size_t vallen=qstrlen(value) + 1;
 
     size = 0;
     if (environ!=0)
     {
       for (ep = environ; *ep; ++ep)
       {
-        if (!strncmp (*ep, name, (uint)namelen) &&
+        if (!qstrncmp (*ep, name, (uint)namelen) &&
             (*ep)[namelen] == '=')
           break;
         else
@@ -244,7 +244,7 @@ void portable_setenv(const char *name,const char *value)
     }
     else /* replace existing string */
     {
-      size_t len = strlen (*ep);
+      size_t len = qstrlen (*ep);
       if (len + 1 < namelen + 1 + vallen)
       {
         /* The existing string is too short; malloc a new one.  */
@@ -277,12 +277,12 @@ void portable_unsetenv(const char *variable)
       return; // not properly formatted
     }
 
-    len = strlen(variable);
+    len = qstrlen(variable);
 
     ep = environ;
     while (*ep != NULL)
     {
-      if (!strncmp(*ep, variable, (uint)len) && (*ep)[len]=='=')
+      if (!qstrncmp(*ep, variable, (uint)len) && (*ep)[len]=='=')
       {
         /* Found it.  Remove this pointer by moving later ones back.  */
         char **dp = ep;
@@ -304,7 +304,9 @@ const char *portable_getenv(const char *variable)
 
 portable_off_t portable_fseek(FILE *f,portable_off_t offset, int whence)
 {
-#if defined(_WIN32) && !defined(__CYGWIN__)
+#if defined(__MINGW32__)
+  return fseeko64(f,offset,whence);
+#elif defined(_WIN32) && !defined(__CYGWIN__)
   return _fseeki64(f,offset,whence);
 #else
   return fseeko(f,offset,whence);
@@ -313,7 +315,9 @@ portable_off_t portable_fseek(FILE *f,portable_off_t offset, int whence)
 
 portable_off_t portable_ftell(FILE *f)
 {
-#if defined(_WIN32) && !defined(__CYGWIN__)
+#if defined(__MINGW32__)
+  return ftello64(f);  
+#elif defined(_WIN32) && !defined(__CYGWIN__)
   return _ftelli64(f);
 #else
   return ftello(f);
index dff17a0..7deb23c 100644 (file)
--- a/src/pre.h
+++ b/src/pre.h
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index fdaee6f..ae2f43d 100644 (file)
--- a/src/pre.l
+++ b/src/pre.l
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
 #include "memberdef.h"
 #include "membername.h"
 
-#define YY_NEVER_INTERACTIVE 1
-enum GuardType
-{
-  Guard_Cond,
-  Guard_CondNot
-}; 
+// Toggle for some debugging info
+//#define DBG_CTX(x) fprintf x
+#define DBG_CTX(x) do { } while(0)
 
+#define YY_NEVER_INTERACTIVE 1
 struct FileState
 {
   FileState(int size) : fileBuf(size), 
@@ -223,7 +221,9 @@ class DefineManager
      */
     Define *isDefined(const char *name) const
     {
-      return m_contextDefines.find(name);
+      Define *d = m_contextDefines.find(name);
+      //printf("isDefined(%s)=%p\n",name,d);
+      return d;
     }
     /** Returns a reference to the defines found in the current context. */
     const DefineDict &defineContext() const
@@ -317,6 +317,8 @@ void DefineManager::DefinesPerFile::collectDefines(
  */
 
 static int                g_yyLineNr   = 1;
+static int                g_yyMLines   = 1;
+static int                g_yyColNr   = 1;
 static QCString           g_yyFileName;
 static FileDef           *g_yyFileDef;
 static FileDef           *g_inputFileDef;
@@ -363,8 +365,9 @@ static bool               g_insideCS; // C# has simpler preprocessor
 static bool               g_isSource;
 
 static bool               g_lexInit = FALSE;
+static int                g_fenceSize = 0;
+static bool               g_ccomment;
 
-static GuardType        guardType;           // kind of guard for conditional section
 //DefineDict* getGlobalDefineDict() 
 //{
 //  return g_globalDefineDict;
@@ -406,7 +409,7 @@ static void decrLevel()
   }
   else
   {
-    warn(g_yyFileName,g_yyLineNr,"warning: More #endif's than #if's found.\n");
+    warn(g_yyFileName,g_yyLineNr,"More #endif's than #if's found.\n");
   }
 }
 
@@ -414,7 +417,7 @@ static bool otherCaseDone()
 {
   if (g_level==0)
   {
-    warn(g_yyFileName,g_yyLineNr,"warning: Found an #else without a preceding #if.\n");
+    warn(g_yyFileName,g_yyLineNr,"Found an #else without a preceding #if.\n");
     return TRUE;
   }
   else
@@ -428,57 +431,6 @@ static void setCaseDone(bool value)
   g_levelGuard[g_level-1]=value;
 }
 
-#if 0
-static bool macroIsAccessible(Define *def)
-{
-  //printf("macroIsAccessible(%s) input=%s def=%s\n",
-  //    def->name.data(),g_inputFileDef?g_inputFileDef->name().data():"<none>",
-  //    def->fileDef ? def->fileDef->name().data() : "<none>");
-  if (def && def->isPredefined) // predefined macro -> globally accessible
-  {
-    //printf("%s: predefined macro %s\n",g_inputFileDef->name().data(),def->name.data());
-    return TRUE;
-  }
-  if (def && def->fileDef==g_inputFileDef)
-  {
-    //printf("%s: macro %s defined in this file at line %d now at %d\n",
-    // g_inputFileDef->name().data(),def->name.data(),def->lineNr,g_yyLineNr);
-    return def->lineNr<=g_yyLineNr;
-  }
-  if (g_inputFileDef && def && def->fileDef) // check if g_inputFileDef actually includes def->fileDef
-  {
-    QDict<FileDef> includedFiles(257);
-    bool b = g_inputFileDef->includes(def->fileDef,&includedFiles);
-    //printf("%s: Checking for accessibility of define '%s' (defined in %s): result=%d\n",
-    //       g_inputFileDef->name().data(),def->name.data(),def->fileDef->name().data(),b);
-    return b;
-  }
-  if (g_inputFileDef && def && !def->fileName.isEmpty())
-  {
-    bool b = g_inputFileDef->includesByName(def->fileName);
-    //printf("%s: Checking for accessibility of define '%s' (defined in %s): result=%d\n",
-    //       g_inputFileDef->name().data(),def->name.data(),def->fileName.data(),b);
-    return b;
-  }
-  //printf("not accessible!\n");
-  return FALSE;
-}
-
-static Define *isDefined(const char *name)
-{
-  Define *def=0;
-  if (name)
-  {
-    def=g_globalDefineDict->find(name);
-    if (def && def->undef) def=0;
-    if (def && !macroIsAccessible(def)) def=0;
-  }
-  //printf("isDefined(%s)=%p\n",name,def);
-  return def;
-}
-#endif
-
-
 static QDict<void> g_allIncludes(10009);
 
 static FileState *checkAndOpenFile(const QCString &fileName,bool &alreadyIncluded)
@@ -1200,7 +1152,7 @@ QCString removeIdsAndMarkers(const char *s)
       }
       else if (c=='d' && !inNum) // identifier starting with a `d'
       {
-       if (strncmp(p,"defined ",8)==0 || strncmp(p,"defined(",8)==0) 
+       if (qstrncmp(p,"defined ",8)==0 || qstrncmp(p,"defined(",8)==0) 
                   // defined keyword
        {
          p+=7; // skip defined
@@ -1398,7 +1350,8 @@ Define *newDefine()
   def->nargs      = g_defArgs;
   def->fileName   = g_yyFileName; 
   def->fileDef    = g_yyFileDef;
-  def->lineNr     = g_yyLineNr;
+  def->lineNr     = g_yyLineNr-g_yyMLines;
+  def->columnNr   = g_yyColNr;
   def->varArgs    = g_defVarArgs;
   //printf("newDefine: %s %s file: %s\n",def->name.data(),def->definition.data(),
   //    def->fileDef ? def->fileDef->name().data() : def->fileName.data());
@@ -1420,7 +1373,7 @@ void addDefine()
   //ArgumentList *al = new ArgumentList;
   //stringToArgumentList(g_defArgsStr,al);
   MemberDef *md=new MemberDef(
-      g_yyFileName,g_yyLineNr,
+      g_yyFileName,g_yyLineNr-g_yyMLines,g_yyColNr,
       "#define",g_defName,g_defArgsStr,0,
       Public,Normal,FALSE,Member,MemberType_Define,0,0);
   if (!g_defArgsStr.isEmpty())
@@ -1481,7 +1434,6 @@ static inline void outputArray(const char *a,int len)
 static void readIncludeFile(const QCString &inc)
 {
   static bool searchIncludes = Config_getBool("SEARCH_INCLUDES");
-  if (!searchIncludes) return; // do not read include files
   uint i=0;
 
   // find the start of the include file name
@@ -1516,7 +1468,6 @@ static void readIncludeFile(const QCString &inc)
     // absIncFileName avoids difficulties for incFileName starting with "../" (bug 641336)
     QCString absIncFileName = incFileName;
     {
-      static bool searchIncludes = Config_getBool("SEARCH_INCLUDES");
       QFileInfo fi(g_yyFileName);
       if (fi.exists())
       {
@@ -1600,7 +1551,7 @@ static void readIncludeFile(const QCString &inc)
       lineStr.sprintf("# 1 \"%s\" 1\n",g_yyFileName.data());
       outputArray(lineStr.data(),lineStr.length());
 
-      //fprintf(stderr,"Switching to include file %s\n",incFileName.data());
+      DBG_CTX((stderr,"Switching to include file %s\n",incFileName.data()));
       g_expectGuard=TRUE;
       g_inputBuf   = &fs->fileBuf;
       g_inputBufPos=0;
@@ -1649,7 +1600,7 @@ static void readIncludeFile(const QCString &inc)
       }
       if (g_curlyCount>0 && !alreadyIncluded) // failed to find #include inside { ... }
       {
-       warn(g_yyFileName,g_yyLineNr,"Warning: include file %s not found, perhaps you forgot to add its directory to INCLUDE_PATH?",incFileName.data());
+       warn(g_yyFileName,g_yyLineNr,"include file %s not found, perhaps you forgot to add its directory to INCLUDE_PATH?",incFileName.data());
       }
     }
   }
@@ -1659,23 +1610,15 @@ static void readIncludeFile(const QCString &inc)
 
 static void startCondSection(const char *sectId)
 {
+  //printf("startCondSection: skip=%d stack=%d\n",g_skip,g_condStack.count());
   CondParser prs;
   bool expResult = prs.parse(g_yyFileName,g_yyLineNr,sectId);
   g_condStack.push(new bool(g_skip));
-  if (guardType == Guard_Cond)
-  {
-    if (expResult)
-    {
-      g_skip=TRUE;
-    }
-  }
-  else if (guardType == Guard_CondNot)
+  if (!expResult)
   {
-    if (!expResult)
-    {
-      g_skip=TRUE;
-    }
+    g_skip=TRUE;
   }
+  //printf("  expResult=%d skip=%d\n",expResult,g_skip);
 }
 
 static void endCondSection()
@@ -1689,6 +1632,7 @@ static void endCondSection()
     bool *ctx = g_condStack.pop();
     g_skip=*ctx;
   }
+  //printf("endCondSection: skip=%d stack=%d\n",g_skip,g_condStack.count());
 }
 
 static void forceEndCondSection()
@@ -1789,7 +1733,9 @@ CHARLIT   (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
 %x     IgnoreLine
 %x     FindDefineArgs
 %x     ReadString
-%x     CondLine
+%x     CondLineC
+%x     CondLineCpp
+%x      SkipCond
 
 %%
 
@@ -1799,7 +1745,7 @@ CHARLIT   (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
 <*>"??"[=/'()!<>-]                     { // Trigraph
                                          unput(resolveTrigraph(yytext[2]));
                                        }
-<Start>^{B}*"#"                                { BEGIN(Command); }
+<Start>^{B}*"#"                                { BEGIN(Command); g_yyColNr+=yyleng; g_yyMLines=0;}
 <Start>^{B}*/[^#]                      {
                                          outputArray(yytext,(int)yyleng);
                                          BEGIN(CopyLine); 
@@ -1949,6 +1895,7 @@ CHARLIT   (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
                                          outputChar('\n');
                                          BEGIN(Start);
                                          g_yyLineNr++;
+                                         g_yyColNr=1;
                                        }
 <FindDefineArgs>"("                    {
                                          g_defArgsStr+='(';
@@ -2043,6 +1990,7 @@ CHARLIT   (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
                                        }
 <Command>("cmake")?"define"{B}+                { 
                                          //printf("!!!DefName\n"); 
+                                         g_yyColNr+=yyleng;
                                          BEGIN(DefName); 
                                        }
 <Command>"ifdef"/{B}*"("               {
@@ -2126,7 +2074,7 @@ CHARLIT   (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
                                          g_yyLineNr++;
                                        }
 <IgnoreLine>.
-<Command>.
+<Command>. {g_yyColNr+=yyleng;}
 <UndefName>{ID}                                {
                                          Define *def;
                                          if ((def=DefineManager::instance().isDefined(yytext)) 
@@ -2330,7 +2278,7 @@ CHARLIT   (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
                                          g_defVarArgs = FALSE;
                                          //printf("Guard check: %s!=%s || %d\n",
                                          //    g_defName.data(),g_lastGuardName.data(),g_expectGuard);
-                                         if ( g_defName!=g_lastGuardName || !g_expectGuard)
+                                         if (g_curlyCount>0 || g_defName!=g_lastGuardName || !g_expectGuard)
                                          { // define may appear in the output
                                            QCString tmp=(QCString)"#define "+g_defName;
                                            outputArray(tmp.data(),tmp.length());
@@ -2360,7 +2308,7 @@ CHARLIT   (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
                                          g_defVarArgs = FALSE;
                                          //printf("Guard check: %s!=%s || %d\n",
                                          //    g_defName.data(),g_lastGuardName.data(),g_expectGuard);
-                                         if ( g_defName!=g_lastGuardName || !g_expectGuard)
+                                         if (g_curlyCount>0 || g_defName!=g_lastGuardName || !g_expectGuard)
                                          { // define may appear in the output
                                            QCString tmp=(QCString)"#define "+g_defName;
                                            outputArray(tmp.data(),tmp.length());
@@ -2475,49 +2423,134 @@ CHARLIT   (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
 <SkipCComment>[\\@][\\@]("f{"|"f$"|"f[") {
                                          outputArray(yytext,(int)yyleng);
                                        }
-<SkipCComment>[\\@][\\@]("verbatim"|"latexonly"|"htmlonly"|"xmlonly"|"rtfonly"|"manonly"|"dot"|"code"){BN}+ {
+<SkipCComment>"~~~"[~]*                 {
+                                          static bool markdownSupport = Config_getBool("MARKDOWN_SUPPORT");
+                                          if (!markdownSupport)
+                                          {
+                                            REJECT;
+                                          }
+                                          else
+                                          {
+                                           outputArray(yytext,(int)yyleng);
+                                            g_fenceSize=yyleng;
+                                            BEGIN(SkipVerbatim);
+                                          }
+                                        }
+<SkipCComment>[\\@][\\@]("verbatim"|"latexonly"|"htmlonly"|"xmlonly"|"docbookonly"|"rtfonly"|"manonly"|"dot"|"code"("{"[^}]*"}")?){BN}+ {
                                          outputArray(yytext,(int)yyleng);
                                          g_yyLineNr+=QCString(yytext).contains('\n');
                                        }
-<SkipCComment>[\\@]("verbatim"|"latexonly"|"htmlonly"|"xmlonly"|"rtfonly"|"manonly"|"dot"|"code"){BN}+ {
+<SkipCComment>[\\@]("verbatim"|"latexonly"|"htmlonly"|"xmlonly"|"docbookonly"|"rtfonly"|"manonly"|"dot"|"code"("{"[^}]*"}")?){BN}+     {
                                          outputArray(yytext,(int)yyleng);
                                          g_yyLineNr+=QCString(yytext).contains('\n');
+                                          g_fenceSize=0;
                                          if (yytext[1]=='f')
                                          {
                                            g_blockName="f";
                                          }
                                          else
                                          {
-                                           g_blockName=QCString(&yytext[1]).stripWhiteSpace();
+                                            QCString bn=&yytext[1];
+                                            int i = bn.find('{'); // for \code{.c}
+                                            if (i!=-1) bn=bn.left(i);
+                                           g_blockName=bn.stripWhiteSpace();
                                          }
                                          BEGIN(SkipVerbatim);
                                        }
-<SkipCComment,SkipCPPComment>[\\@]"cond"[ \t]+ { // conditional section
-                                          guardType = Guard_Cond;
-                                         g_condCtx = YY_START;
-                                         outputArray(yytext,yyleng);
-                                         BEGIN(CondLine);
+<SkipCPPComment>[\\@]"cond"[ \t]+      { // conditional section
+                                          g_ccomment=TRUE;  
+                                          g_condCtx=YY_START;
+                                         BEGIN(CondLineCpp);
                                        }
-<CondLine>[!()&| \ta-z_A-Z0-9.\-]+      {
-                                         startCondSection(yytext);
-                                         outputArray(yytext,(int)yyleng);
-                                         BEGIN(g_condCtx);
-                                       }
-<SkipCComment,SkipCPPComment>[\\@]"cond"[ \t\r]*/\n {
-                                          guardType = Guard_Cond;
-                                         g_condCtx = YY_START;
-                                         outputArray(yytext,(int)yyleng);
+<SkipCComment>[\\@]"cond"[ \t]+        { // conditional section
+                                          g_ccomment=FALSE;  
+                                          g_condCtx=YY_START;
+                                         BEGIN(CondLineC);
                                        }
-<CondLine>.                            {
+<CondLineC,CondLineCpp>[!()&| \ta-z_A-Z0-9.\-]+      {
+                                         startCondSection(yytext);
+                                          if (g_skip)
+                                          {
+                                            if (YY_START==CondLineC)
+                                            {
+                                              // end C comment
+                                             outputArray("*/",2);
+                                              g_ccomment=TRUE;
+                                            }
+                                            else
+                                            {
+                                              g_ccomment=FALSE;
+                                            }
+                                            BEGIN(SkipCond);
+                                          }
+                                          else
+                                          {
+                                           BEGIN(g_condCtx);
+                                          }
+                                       }
+<CondLineC,CondLineCpp>.               { // non-guard character
                                          unput(*yytext);
                                          startCondSection(" ");
-                                         BEGIN(g_condCtx);
-                                       }
+                                          if (g_skip)
+                                          {
+                                            if (YY_START==CondLineC)
+                                            {
+                                              // end C comment
+                                             outputArray("*/",2);
+                                              g_ccomment=TRUE;
+                                            }
+                                            else
+                                            {
+                                              g_ccomment=FALSE;
+                                            }
+                                            BEGIN(SkipCond);
+                                          }
+                                          else
+                                          {
+                                           BEGIN(g_condCtx);
+                                          }
+                                       }
+<SkipCComment,SkipCPPComment>[\\@]"cond"[ \t\r]*/\n { // no guard
+                                          if (YY_START==SkipCComment)
+                                          {
+                                            g_ccomment=TRUE;
+                                            // end C comment
+                                           outputArray("*/",2);
+                                          }
+                                          else
+                                          {
+                                            g_ccomment=FALSE;
+                                          }
+                                          g_condCtx=YY_START;
+                                          startCondSection(" ");
+                                          BEGIN(SkipCond);
+                                       }
+<SkipCond>\n                            { g_yyLineNr++; outputChar('\n'); }
+<SkipCond>.                             { }
+<SkipCond>[^\/\!*\\@\n]+                { }
+<SkipCond>"//"[/!]                      { g_ccomment=FALSE; }
+<SkipCond>"/*"[*!]                      { g_ccomment=TRUE; }
+<SkipCond>[\\@]"endcond"/[^a-z_A-Z0-9]  { 
+                                          bool oldSkip = g_skip;
+                                          endCondSection(); 
+                                          if (oldSkip && !g_skip)
+                                          {
+                                            if (g_ccomment)
+                                            {
+                                              outputArray("/** ",4);
+                                            }
+                                            BEGIN(g_condCtx);
+                                          }
+                                        }
 <SkipCComment,SkipCPPComment>[\\@]"endcond"/[^a-z_A-Z0-9] {
-                                         outputArray(yytext,(int)yyleng);
+                                          bool oldSkip = g_skip;
                                          endCondSection();
+                                          if (oldSkip && !g_skip) 
+                                          {
+                                            BEGIN(g_condCtx);
+                                          }
                                        }
-<SkipVerbatim>[\\@]("endverbatim"|"endlatexonly"|"endhtmlonly"|"endxmlonly"|"endrtfonly"|"endmanonly"|"enddot"|"endcode"|"f$"|"f]"|"f}") { /* end of verbatim block */
+<SkipVerbatim>[\\@]("endverbatim"|"endlatexonly"|"endhtmlonly"|"endxmlonly"|"enddocbookonly"|"endrtfonly"|"endmanonly"|"enddot"|"endcode"|"f$"|"f]"|"f}") { /* end of verbatim block */
                                          outputArray(yytext,(int)yyleng);
                                          if (yytext[1]=='f' && g_blockName=="f")
                                          {
@@ -2528,10 +2561,17 @@ CHARLIT   (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
                                            BEGIN(SkipCComment);
                                          }
                                        }
+<SkipVerbatim>"~~~"[~]*                 {
+                                         outputArray(yytext,(int)yyleng);
+                                          if (g_fenceSize==yyleng)
+                                          {
+                                            BEGIN(SkipCComment);
+                                          }
+                                        }
 <SkipVerbatim>"*/"|"/*"                        {
                                          outputArray(yytext,(int)yyleng);
                                        }
-<SkipCComment,SkipVerbatim>[^*\\@\x06\n\/]+ {
+<SkipCComment,SkipVerbatim>[^*\\@\x06~\n\/]+ {
                                          outputArray(yytext,(int)yyleng);
                                        }
 <SkipCComment,SkipVerbatim>\n          { 
@@ -2639,7 +2679,9 @@ CHARLIT   (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
 <DefineText>\\[\r]?\n                  { 
                                          g_defLitText+=yytext;
                                          outputChar('\n');
-                                         g_defText += ' '; g_yyLineNr++; 
+                                         g_defText += ' ';
+                                         g_yyLineNr++;
+                                         g_yyMLines++;
                                        }
 <DefineText>\n                         {
                                          QCString comment=extractTrailingComment(g_defLitText);
@@ -2681,7 +2723,8 @@ CHARLIT   (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
                                              def->definition = g_defText.stripWhiteSpace();
                                              def->nargs = g_defArgs;
                                              def->fileName = g_yyFileName.copy(); 
-                                             def->lineNr = g_yyLineNr;
+                                             def->lineNr = g_yyLineNr-g_yyMLines;
+                                             def->columnNr = g_yyColNr;
                                            }
                                            else
                                            {
@@ -2690,6 +2733,7 @@ CHARLIT   (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
                                          }
                                          delete g_argDict; g_argDict=0;
                                          g_yyLineNr++;
+                                         g_yyColNr=1;
                                          g_lastGuardName.resize(0);
                                          BEGIN(Start);
                                        }
@@ -2728,11 +2772,11 @@ CHARLIT   (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
 <SkipSingleQuote>.                     { g_defText += *yytext; g_defLitText+=yytext; }
 <DefineText>.                          { g_defText += *yytext; g_defLitText+=yytext; }
 <<EOF>>                                        {
-                                          //fprintf(stderr,"End of include file\n");
+                                          DBG_CTX((stderr,"End of include file\n"));
                                          //printf("Include stack depth=%d\n",g_includeStack.count());
                                          if (g_includeStack.isEmpty())
                                          {
-                                           //fprintf(stderr,"Terminating scanner!\n");
+                                           DBG_CTX((stderr,"Terminating scanner!\n"));
                                            yyterminate();
                                          }
                                          else
@@ -2747,7 +2791,7 @@ CHARLIT   (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
                                             g_inputBuf    = fs->oldFileBuf;
                                            g_inputBufPos = fs->oldFileBufPos;
                                            setFileName(fs->fileName);
-                                           //fprintf(stderr,"######## FileName %s\n",g_yyFileName.data());
+                                           DBG_CTX((stderr,"######## FileName %s\n",g_yyFileName.data()));
                                            
                                             // Deal with file changes due to 
                                             // #include's within { .. } blocks
@@ -2760,17 +2804,31 @@ CHARLIT   (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
                                        }
 <*>"/*"/"*/"                           |
 <*>"/*"[*]?                            {
-                                         outputArray(yytext,(int)yyleng);
-                                         g_lastCContext=YY_START;
-                                         g_commentCount=1;
-                                         if (yyleng==3) g_lastGuardName.resize(0); // reset guard in case the #define is documented!
-                                         BEGIN(SkipCComment);
+                                          if (YY_START==SkipVerbatim || YY_START==SkipCond)
+                                          {
+                                            REJECT;
+                                          }
+                                          else
+                                          {
+                                           outputArray(yytext,(int)yyleng);
+                                           g_lastCContext=YY_START;
+                                           g_commentCount=1;
+                                           if (yyleng==3) g_lastGuardName.resize(0); // reset guard in case the #define is documented!
+                                           BEGIN(SkipCComment);
+                                          }
                                        }
 <*>"//"[/]?                            {
-                                         outputArray(yytext,(int)yyleng);
-                                         g_lastCPPContext=YY_START;
-                                         if (yyleng==3) g_lastGuardName.resize(0); // reset guard in case the #define is documented!
-                                         BEGIN(SkipCPPComment);
+                                          if (YY_START==SkipVerbatim || YY_START==SkipCond)
+                                          {
+                                            REJECT;
+                                          }
+                                          else
+                                          {
+                                           outputArray(yytext,(int)yyleng);
+                                           g_lastCPPContext=YY_START;
+                                           if (yyleng==3) g_lastGuardName.resize(0); // reset guard in case the #define is documented!
+                                           BEGIN(SkipCPPComment);
+                                          }
                                        }
 <*>\n                                  { 
                                          outputChar('\n');
@@ -2883,6 +2941,7 @@ void preprocessFile(const char *fileName,BufStr &input,BufStr &output)
 
   g_macroExpansion = Config_getBool("MACRO_EXPANSION");
   g_expandOnlyPredef = Config_getBool("EXPAND_ONLY_PREDEF");
+  g_skip=FALSE;
   g_curlyCount=0;
   g_nospaces=FALSE;
   g_inputBuf=&input;
@@ -3015,6 +3074,7 @@ void preprocessFile(const char *fileName,BufStr &input,BufStr &output)
   }
  
   g_yyLineNr = 1;
+  g_yyColNr  = 1;
   g_level    = 0;
   g_ifcount  = 0;
 
index 1138e8b..dc28d26 100644 (file)
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -19,6 +19,7 @@
 #ifndef _PRINTDOCVISITOR_H
 #define _PRINTDOCVISITOR_H
 
+#include <qglobal.h>
 #include "docvisitor.h"
 
 /*! Concrete visitor implementation for pretty printing */
@@ -57,104 +58,104 @@ class PrintDocVisitor : public DocVisitor
       indent_leaf();
       switch(s->symbol())
       {
-       case DocSymbol::BSlash:  printf("\\"); break;
-       case DocSymbol::At:      printf("@"); break;
-       case DocSymbol::Less:    printf("<"); break;
-       case DocSymbol::Greater: printf(">"); break;
-       case DocSymbol::Amp:     printf("&"); break;
-       case DocSymbol::Dollar:  printf("$"); break;
-       case DocSymbol::Hash:    printf("#"); break;
-       case DocSymbol::Percent: printf("%%"); break;
-       case DocSymbol::Pipe:    printf("|"); break;
-       case DocSymbol::Copy:    printf("&copy;"); break;
-       case DocSymbol::Apos:    printf("'"); break;
-       case DocSymbol::Quot:    printf("\""); break;
+        case DocSymbol::BSlash:  printf("\\"); break;
+        case DocSymbol::At:      printf("@"); break;
+        case DocSymbol::Less:    printf("<"); break;
+        case DocSymbol::Greater: printf(">"); break;
+        case DocSymbol::Amp:     printf("&"); break;
+        case DocSymbol::Dollar:  printf("$"); break;
+        case DocSymbol::Hash:    printf("#"); break;
+        case DocSymbol::Percent: printf("%%"); break;
+        case DocSymbol::Pipe:    printf("|"); break;
+        case DocSymbol::Copy:    printf("&copy;"); break;
+        case DocSymbol::Apos:    printf("'"); break;
+        case DocSymbol::Quot:    printf("\""); break;
         case DocSymbol::Lsquo:   printf("&lsquo;"); break;
         case DocSymbol::Rsquo:   printf("&rsquo;"); break;
         case DocSymbol::Ldquo:   printf("&ldquo;"); break;
         case DocSymbol::Rdquo:   printf("&rdquo;"); break;
         case DocSymbol::Ndash:   printf("&ndash;"); break;
         case DocSymbol::Mdash:   printf("&mdash;"); break;
-       case DocSymbol::Uml:     printf("&%cuml;",s->letter()); break;
-       case DocSymbol::Acute:   printf("&%cacute;",s->letter()); break;
-       case DocSymbol::Grave:   printf("&%cgrave;",s->letter()); break;
-       case DocSymbol::Circ:    printf("&%ccirc;",s->letter()); break;
-       case DocSymbol::Tilde:   printf("&%ctilde;",s->letter()); break;
-       case DocSymbol::Szlig:   printf("&szlig;"); break;
-       case DocSymbol::Cedil:   printf("&%ccedul;",s->letter()); break;
-       case DocSymbol::Ring:    printf("&%cring;",s->letter()); break;
-       case DocSymbol::Nbsp:    printf("&nbsp;"); break;
-       case DocSymbol::Aelig:   printf("&aelig;"); break;
-       case DocSymbol::AElig:   printf("&AElig;"); break;
-    case DocSymbol::GrkGamma:      printf("&Gamma;"); break;
-    case DocSymbol::GrkDelta:      printf("&Delta;"); break;
-    case DocSymbol::GrkTheta:      printf("&Theta;"); break;
-    case DocSymbol::GrkLambda:     printf("&Lambda;"); break;
-    case DocSymbol::GrkXi:         printf("&Xi;"); break;
-    case DocSymbol::GrkPi:         printf("&Pi;"); break;
-    case DocSymbol::GrkSigma:      printf("&Sigma;"); break;
-    case DocSymbol::GrkUpsilon:    printf("&Upsilon;"); break;
-    case DocSymbol::GrkPhi:        printf("&Phi;"); break;
-    case DocSymbol::GrkPsi:        printf("&Psi;"); break;
-    case DocSymbol::GrkOmega:      printf("&Omega;"); break;
-    case DocSymbol::Grkalpha:      printf("&alpha;"); break;
-    case DocSymbol::Grkbeta:       printf("&beta;"); break;
-    case DocSymbol::Grkgamma:      printf("&gamma;"); break;
-    case DocSymbol::Grkdelta:      printf("&delta;"); break;
-    case DocSymbol::Grkepsilon:    printf("&epsilon;"); break;
-    case DocSymbol::Grkzeta:       printf("&zeta;"); break;
-    case DocSymbol::Grketa:        printf("&eta;"); break;
-    case DocSymbol::Grktheta:      printf("&theta;"); break;
-    case DocSymbol::Grkiota:       printf("&iota;"); break;
-    case DocSymbol::Grkkappa:      printf("&kappa;"); break;
-    case DocSymbol::Grklambda:     printf("&lambda;"); break;
-    case DocSymbol::Grkmu:         printf("&mu;"); break;
-    case DocSymbol::Grknu:         printf("&nu;"); break;
-    case DocSymbol::Grkxi:         printf("&xi;"); break;
-    case DocSymbol::Grkpi:         printf("&pi;"); break;
-    case DocSymbol::Grkrho:        printf("&rho;"); break;
-    case DocSymbol::Grksigma:      printf("&sigma;"); break;
-    case DocSymbol::Grktau:        printf("&tau;"); break;
-    case DocSymbol::Grkupsilon:    printf("&upsilon;"); break;
-    case DocSymbol::Grkphi:        printf("&phi;"); break;
-    case DocSymbol::Grkchi:        printf("&chi;"); break;
-    case DocSymbol::Grkpsi:        printf("&psi;"); break;
-    case DocSymbol::Grkomega:      printf("&omega;"); break;
-    case DocSymbol::Grkvarsigma:   printf("&sigmaf;"); break;
-    case DocSymbol::Section:       printf("&sect;"); break;
-    case DocSymbol::Degree:        printf("&deg;"); break;
-    case DocSymbol::Prime:         printf("&prime;"); break;
-    case DocSymbol::DoublePrime:   printf("&Prime;"); break;
-    case DocSymbol::Infinity:      printf("&infin;"); break;
-    case DocSymbol::EmptySet:      printf("&empty;"); break;
-    case DocSymbol::PlusMinus:     printf("&plusmn;"); break;
-    case DocSymbol::Times:         printf("&times;"); break;
-    case DocSymbol::Minus:         printf("&minus;"); break;
-    case DocSymbol::CenterDot:     printf("&sdot;"); break;
-    case DocSymbol::Partial:       printf("&part;"); break;
-    case DocSymbol::Nabla:         printf("&nabla;"); break;
-    case DocSymbol::SquareRoot:    printf("&radic;"); break;
-    case DocSymbol::Perpendicular: printf("&perp;"); break;
-    case DocSymbol::Sum:           printf("&sum;"); break;
-    case DocSymbol::Integral:      printf("&int;"); break;
-    case DocSymbol::Product:       printf("&prod;"); break;
-    case DocSymbol::Similar:       printf("&sim;"); break;
-    case DocSymbol::Approx:        printf("&asymp;"); break;
-    case DocSymbol::NotEqual:      printf("&ne;"); break;
-    case DocSymbol::Equivalent:    printf("&equiv;"); break;
-    case DocSymbol::Proportional:  printf("&prop;"); break;
-    case DocSymbol::LessEqual:     printf("&le;"); break;
-    case DocSymbol::GreaterEqual:  printf("&ge;"); break;
-    case DocSymbol::LeftArrow:     printf("&larr;"); break;
-    case DocSymbol::RightArrow:    printf("&rarr;"); break;
-    case DocSymbol::SetIn:         printf("&isin;"); break;
-    case DocSymbol::SetNotIn:      printf("&notin;"); break;
-    case DocSymbol::LeftCeil:      printf("&lceil;"); break;
-    case DocSymbol::RightCeil:     printf("&rceil;"); break;
-    case DocSymbol::LeftFloor:     printf("&lfloor;"); break;
-    case DocSymbol::RightFloor:    printf("&rfloor;"); break;
-       default:
-         printf("Error: unknown symbol found\n");
+        case DocSymbol::Uml:     printf("&%cuml;",s->letter()); break;
+        case DocSymbol::Acute:   printf("&%cacute;",s->letter()); break;
+        case DocSymbol::Grave:   printf("&%cgrave;",s->letter()); break;
+        case DocSymbol::Circ:    printf("&%ccirc;",s->letter()); break;
+        case DocSymbol::Tilde:   printf("&%ctilde;",s->letter()); break;
+        case DocSymbol::Szlig:   printf("&szlig;"); break;
+        case DocSymbol::Cedil:   printf("&%ccedul;",s->letter()); break;
+        case DocSymbol::Ring:    printf("&%cring;",s->letter()); break;
+        case DocSymbol::Nbsp:    printf("&nbsp;"); break;
+        case DocSymbol::Aelig:   printf("&aelig;"); break;
+        case DocSymbol::AElig:   printf("&AElig;"); break;
+        case DocSymbol::GrkGamma:      printf("&Gamma;"); break;
+        case DocSymbol::GrkDelta:      printf("&Delta;"); break;
+        case DocSymbol::GrkTheta:      printf("&Theta;"); break;
+        case DocSymbol::GrkLambda:     printf("&Lambda;"); break;
+        case DocSymbol::GrkXi:         printf("&Xi;"); break;
+        case DocSymbol::GrkPi:         printf("&Pi;"); break;
+        case DocSymbol::GrkSigma:      printf("&Sigma;"); break;
+        case DocSymbol::GrkUpsilon:    printf("&Upsilon;"); break;
+        case DocSymbol::GrkPhi:        printf("&Phi;"); break;
+        case DocSymbol::GrkPsi:        printf("&Psi;"); break;
+        case DocSymbol::GrkOmega:      printf("&Omega;"); break;
+        case DocSymbol::Grkalpha:      printf("&alpha;"); break;
+        case DocSymbol::Grkbeta:       printf("&beta;"); break;
+        case DocSymbol::Grkgamma:      printf("&gamma;"); break;
+        case DocSymbol::Grkdelta:      printf("&delta;"); break;
+        case DocSymbol::Grkepsilon:    printf("&epsilon;"); break;
+        case DocSymbol::Grkzeta:       printf("&zeta;"); break;
+        case DocSymbol::Grketa:        printf("&eta;"); break;
+        case DocSymbol::Grktheta:      printf("&theta;"); break;
+        case DocSymbol::Grkiota:       printf("&iota;"); break;
+        case DocSymbol::Grkkappa:      printf("&kappa;"); break;
+        case DocSymbol::Grklambda:     printf("&lambda;"); break;
+        case DocSymbol::Grkmu:         printf("&mu;"); break;
+        case DocSymbol::Grknu:         printf("&nu;"); break;
+        case DocSymbol::Grkxi:         printf("&xi;"); break;
+        case DocSymbol::Grkpi:         printf("&pi;"); break;
+        case DocSymbol::Grkrho:        printf("&rho;"); break;
+        case DocSymbol::Grksigma:      printf("&sigma;"); break;
+        case DocSymbol::Grktau:        printf("&tau;"); break;
+        case DocSymbol::Grkupsilon:    printf("&upsilon;"); break;
+        case DocSymbol::Grkphi:        printf("&phi;"); break;
+        case DocSymbol::Grkchi:        printf("&chi;"); break;
+        case DocSymbol::Grkpsi:        printf("&psi;"); break;
+        case DocSymbol::Grkomega:      printf("&omega;"); break;
+        case DocSymbol::Grkvarsigma:   printf("&sigmaf;"); break;
+        case DocSymbol::Section:       printf("&sect;"); break;
+        case DocSymbol::Degree:        printf("&deg;"); break;
+        case DocSymbol::Prime:         printf("&prime;"); break;
+        case DocSymbol::DoublePrime:   printf("&Prime;"); break;
+        case DocSymbol::Infinity:      printf("&infin;"); break;
+        case DocSymbol::EmptySet:      printf("&empty;"); break;
+        case DocSymbol::PlusMinus:     printf("&plusmn;"); break;
+        case DocSymbol::Times:         printf("&times;"); break;
+        case DocSymbol::Minus:         printf("&minus;"); break;
+        case DocSymbol::CenterDot:     printf("&sdot;"); break;
+        case DocSymbol::Partial:       printf("&part;"); break;
+        case DocSymbol::Nabla:         printf("&nabla;"); break;
+        case DocSymbol::SquareRoot:    printf("&radic;"); break;
+        case DocSymbol::Perpendicular: printf("&perp;"); break;
+        case DocSymbol::Sum:           printf("&sum;"); break;
+        case DocSymbol::Integral:      printf("&int;"); break;
+        case DocSymbol::Product:       printf("&prod;"); break;
+        case DocSymbol::Similar:       printf("&sim;"); break;
+        case DocSymbol::Approx:        printf("&asymp;"); break;
+        case DocSymbol::NotEqual:      printf("&ne;"); break;
+        case DocSymbol::Equivalent:    printf("&equiv;"); break;
+        case DocSymbol::Proportional:  printf("&prop;"); break;
+        case DocSymbol::LessEqual:     printf("&le;"); break;
+        case DocSymbol::GreaterEqual:  printf("&ge;"); break;
+        case DocSymbol::LeftArrow:     printf("&larr;"); break;
+        case DocSymbol::RightArrow:    printf("&rarr;"); break;
+        case DocSymbol::SetIn:         printf("&isin;"); break;
+        case DocSymbol::SetNotIn:      printf("&notin;"); break;
+        case DocSymbol::LeftCeil:      printf("&lceil;"); break;
+        case DocSymbol::RightCeil:     printf("&rceil;"); break;
+        case DocSymbol::LeftFloor:     printf("&lfloor;"); break;
+        case DocSymbol::RightFloor:    printf("&rfloor;"); break;
+        default:
+          printf("unknown symbol found\n");
       }
     }
     void visit(DocURL *u)
@@ -178,35 +179,35 @@ class PrintDocVisitor : public DocVisitor
       switch (s->style())
       {
         case DocStyleChange::Bold:
-         if (s->enable()) printf("<bold>"); else printf("</bold>");
-         break;
+          if (s->enable()) printf("<bold>"); else printf("</bold>");
+          break;
         case DocStyleChange::Italic:
-         if (s->enable()) printf("<italic>"); else printf("</italic>");
-         break;
+          if (s->enable()) printf("<italic>"); else printf("</italic>");
+          break;
         case DocStyleChange::Code:
-         if (s->enable()) printf("<code>"); else printf("</code>");
-         break;
+          if (s->enable()) printf("<code>"); else printf("</code>");
+          break;
         case DocStyleChange::Subscript:
-         if (s->enable()) printf("<sub>"); else printf("</sub>");
-         break;
+          if (s->enable()) printf("<sub>"); else printf("</sub>");
+          break;
         case DocStyleChange::Superscript:
-         if (s->enable()) printf("<sup>"); else printf("</sup>");
-         break;
+          if (s->enable()) printf("<sup>"); else printf("</sup>");
+          break;
         case DocStyleChange::Center:
-         if (s->enable()) printf("<center>"); else printf("</center>");
-         break;
+          if (s->enable()) printf("<center>"); else printf("</center>");
+          break;
         case DocStyleChange::Small:
-         if (s->enable()) printf("<small>"); else printf("</small>");
-         break;
+          if (s->enable()) printf("<small>"); else printf("</small>");
+          break;
         case DocStyleChange::Preformatted:
-         if (s->enable()) printf("<pre>"); else printf("</pre>");
-         break;
+          if (s->enable()) printf("<pre>"); else printf("</pre>");
+          break;
         case DocStyleChange::Div:
-         if (s->enable()) printf("<div>"); else printf("</div>");
-         break;
+          if (s->enable()) printf("<div>"); else printf("</div>");
+          break;
         case DocStyleChange::Span:
-         if (s->enable()) printf("<span>"); else printf("</span>");
-         break;
+          if (s->enable()) printf("<span>"); else printf("</span>");
+          break;
       }
     }
     void visit(DocVerbatim *s)
@@ -221,6 +222,7 @@ class PrintDocVisitor : public DocVisitor
         case DocVerbatim::ManOnly: printf("<manonly>"); break;
         case DocVerbatim::LatexOnly: printf("<latexonly>"); break;
         case DocVerbatim::XmlOnly: printf("<xmlonly>"); break;
+        case DocVerbatim::DocbookOnly: printf("<docbookonly>"); break;
         case DocVerbatim::Dot: printf("<dot>"); break;
         case DocVerbatim::Msc: printf("<msc>"); break;
       }
@@ -234,6 +236,7 @@ class PrintDocVisitor : public DocVisitor
         case DocVerbatim::ManOnly: printf("</manonly>"); break;
         case DocVerbatim::LatexOnly: printf("</latexonly>"); break;
         case DocVerbatim::XmlOnly: printf("</xmlonly>"); break;
+        case DocVerbatim::DocbookOnly: printf("</docbookonly>"); break;
         case DocVerbatim::Dot: printf("</dot>"); break;
         case DocVerbatim::Msc: printf("</msc>"); break;
       }
index e7c1b8b..ef9d47c 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -28,6 +28,7 @@
 class CodeOutputInterface;
 class FileDef;
 class MemberDef;
+class QCString;
 class Definition;
 
 extern void parsePythonCode(CodeOutputInterface &,const char *,const QCString &, 
index df99758..c87f5bb 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
 #include "filedef.h"
 #include "namespacedef.h"
 
+// Toggle for some debugging info
+//#define DBG_CTX(x) fprintf x
+#define DBG_CTX(x) do { } while(0)
+
 #define YY_NEVER_INTERACTIVE 1
 #define YY_NO_INPUT 1
 
@@ -479,6 +483,15 @@ static void codifyLines(char *text)
   }
 }
 
+#if 0
+static QCString fileLocation() 
+{
+  QCString result = g_sourceFileDef?g_sourceFileDef->absFilePath():QCString("[unknown]");
+  result+=":"+QCString().setNum(g_yyLineNr);
+  result+=":"+QCString().setNum(1);
+  return result;
+}
+
 static void addDocCrossReference(MemberDef *src,MemberDef *dst)
 {
   static bool referencedByRelation = Config_getBool("REFERENCED_BY_RELATION");
@@ -489,13 +502,14 @@ static void addDocCrossReference(MemberDef *src,MemberDef *dst)
   //printf("addDocCrossReference src=%s,dst=%s\n",src->name().data(),dst->name().data());
   if ((referencedByRelation || callerGraph) && (src->isFunction() || src->isSlot()))
   {
-    dst->addSourceReferencedBy(src);
+    dst->addSourceReferencedBy(src,fileLocation());
   }
   if ((referencesRelation || callGraph) && (src->isFunction() || src->isSlot()))
   {
-    src->addSourceReferences(dst);
+    src->addSourceReferences(dst,fileLocation());
   }
 }
+#endif
 
 
 
@@ -580,7 +594,7 @@ static void generateClassOrGlobalLink(CodeOutputInterface &ol,char *clName,
   // Don't do anything for empty text
   if (className.isEmpty()) return;
 
-  //fprintf(stderr,"generateClassOrGlobalLink(className=%s)\n",className.data());
+  DBG_CTX((stderr,"generateClassOrGlobalLink(className=%s)\n",className.data()));
 
   ClassDef *cd=0,*lcd=0;  /** Class def that we may find */
   MemberDef *md=0;        /** Member def that we may find */
@@ -593,10 +607,10 @@ static void generateClassOrGlobalLink(CodeOutputInterface &ol,char *clName,
 
     cd = getResolvedClass(d,g_sourceFileDef,substitute(className,".","::"),&md);
 
-    //fprintf(stderr,"d=%s g_sourceFileDef=%s\n",
-    // d?d->displayName().data():"<null>",
-    // g_currentDefinition?g_currentDefinition->displayName().data():"<null>");
-    //fprintf(stderr,"is found as a type %s\n",cd?cd->name().data():"<null>");
+    DBG_CTX((stderr,"d=%s g_sourceFileDef=%s\n",
+        d?d->displayName().data():"<null>",
+        g_currentDefinition?g_currentDefinition->displayName().data():"<null>"));
+    DBG_CTX((stderr,"is found as a type %s\n",cd?cd->name().data():"<null>"));
 
     if (cd==0 && md==0) // also see if it is variable or enum or enum value
     {
@@ -620,7 +634,7 @@ static void generateClassOrGlobalLink(CodeOutputInterface &ol,char *clName,
       g_theCallContext.setClass(lcd);
     }
     //isLocal=TRUE;
-    //fprintf(stderr,"is a local variable cd=%p!\n",cd);
+    DBG_CTX((stderr,"is a local variable cd=%p!\n",cd));
   }
 
   if (cd && cd->isLinkable()) // is it a linkable class
@@ -646,7 +660,7 @@ static void generateClassOrGlobalLink(CodeOutputInterface &ol,char *clName,
       QCString scope = substitute(className.left(scopeEnd),".","::");
       QCString locName = className.right(className.length()-scopeEnd-1);
       ClassDef *mcd = getClass(scope);
-      //fprintf(stderr,"scope=%s locName=%s mcd=%p\n",scope.data(),locName.data(),mcd);
+      DBG_CTX((stderr,"scope=%s locName=%s mcd=%p\n",scope.data(),locName.data(),mcd));
       if (mcd)
       {
        MemberDef *md = mcd->getMemberByName(locName);
@@ -709,7 +723,7 @@ static void generateFunctionLink(CodeOutputInterface &ol,char *funcName)
   ClassDef *ccd=0;
   QCString locScope=g_classScope.copy();
   QCString locFunc=removeRedundantWhiteSpace(funcName);
-  //fprintf(stdout,"*** locScope=%s locFunc=%s\n",locScope.data(),locFunc.data());
+  DBG_CTX((stdout,"*** locScope=%s locFunc=%s\n",locScope.data(),locFunc.data()));
   int i=locFunc.findRev("::");
   if (i>0)
   {
@@ -759,7 +773,7 @@ static bool findMemberLink(CodeOutputInterface &ol,Definition *sym,const char *s
        addDocCrossReference(g_currentMemberDef,(MemberDef*)sym);
       }
     }
-    //fprintf(stderr,"cd=%s thisCd=%s\n",cd?cd->name().data():"<none>",thisCd?thisCd->name().data():"<none>");
+    DBG_CTX((stderr,"cd=%s thisCd=%s\n",cd?cd->name().data():"<none>",thisCd?thisCd->name().data():"<none>"));
 
     // TODO: find the nearest base class in case cd is a base class of
     // thisCd 
@@ -1045,7 +1059,7 @@ TARGET           ({IDENTIFIER}|"("{TARGET_LIST}")"|"["{TARGET_LIST}"]"|{ATTRIBUT
 
                                       // Push a class scope
 
-                                      ClassDef *classDefToAdd = new ClassDef("<code>",1,g_curClassName,ClassDef::Class,0,0,FALSE);
+                                      ClassDef *classDefToAdd = new ClassDef("<code>",1,1,g_curClassName,ClassDef::Class,0,0,FALSE);
                                       g_codeClassSDict.append(g_curClassName,classDefToAdd);
                                       char *s=g_curClassBases.first();
                                       while (s) 
@@ -1161,7 +1175,7 @@ TARGET           ({IDENTIFIER}|"("{TARGET_LIST}")"|"["{TARGET_LIST}"]"|{ATTRIBUT
                                          codifyLines(yytext);
                                          endFontClass();
 
-                                         // No indentation necesary
+                                         // No indentation necessary
                                          g_noSuiteFound = FALSE;
                                        }
 
@@ -1170,7 +1184,7 @@ TARGET           ({IDENTIFIER}|"("{TARGET_LIST}")"|"["{TARGET_LIST}"]"|{ATTRIBUT
                                          codifyLines(yytext);
                                          endFontClass();
 
-                                         // No indentation necesary
+                                         // No indentation necessary
                                          g_noSuiteFound = FALSE;
                                        }
     {IDENTIFIER}                       {
index ad7cfaa..707edbd 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -35,9 +35,13 @@ class PythonLanguageScanner : public ParserInterface
 {
   public:
     virtual ~PythonLanguageScanner() {}
+    void startTranslationUnit(const char *) {}
+    void finishTranslationUnit() {}
     void parseInput(const char * fileName, 
                     const char *fileBuf, 
-                    Entry *root);
+                    Entry *root,
+                    bool sameTranslationUnit,
+                    QStrList &filesInSameTranslationUnit);
     bool needsPreprocessing(const QCString &extension);
     void parseCode(CodeOutputInterface &codeOutIntf,
                    const char *scopeName,
index 4e031bb..69b7558 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
 #include "pycode.h"
 #include "arguments.h"
 
+// Toggle for some debugging info
+//#define DBG_CTX(x) fprintf x
+#define DBG_CTX(x) do { } while(0)
+
 #define YY_NEVER_INTERACTIVE 1
 #define YY_NO_INPUT 1
 
@@ -226,7 +230,7 @@ static QCString findPackageScope(const char *fileName)
 
 static void lineCount()
 {
-  //fprintf(stderr,"yyLineNr=%d\n",yyLineNr);
+  DBG_CTX((stderr,"yyLineNr=%d\n",yyLineNr));
   for (const char *p = yytext; *p; ++p)
   {
     yyLineNr += (*p == '\n') ;
@@ -235,7 +239,7 @@ static void lineCount()
 
 static void incLineNr()
 {
-  //fprintf(stderr,"yyLineNr=%d\n",yyLineNr);
+  DBG_CTX((stderr,"yyLineNr=%d\n",yyLineNr));
   yyLineNr++;
 }
 
@@ -537,7 +541,7 @@ STARTDOCSYMS      "##"
 <Search>{
 
     ^{B}"def"{BB}       { // start of a function/method definition with indent
-                         //fprintf(stderr,"Found def at %d\n",yyLineNr);
+                         DBG_CTX((stderr,"Found def at %d\n",yyLineNr));
                          g_indent=computeIndent(yytext);
                          searchFoundDef();
                          BEGIN( FunctionDec );
@@ -548,7 +552,7 @@ STARTDOCSYMS      "##"
                         }
 
      ^{B}"class"{BB}   { // start of a class definition with indent
-                                 //fprintf(stderr,"Found class at %d\n",yyLineNr);
+                                 DBG_CTX((stderr,"Found class at %d\n",yyLineNr));
                          g_indent=computeIndent(yytext);
                          searchFoundClass();
                          BEGIN( ClassDec ) ;
@@ -731,7 +735,7 @@ STARTDOCSYMS      "##"
 
 <SearchMemVars>{
     "self."{IDENTIFIER}/{B}"=" {
-                        //fprintf(stderr,"Found member variable %s in %s at %d\n",&yytext[5],current_root->name.data(),yyLineNr);
+                        DBG_CTX((stderr,"Found member variable %s in %s at %d\n",&yytext[5],current_root->name.data(),yyLineNr));
                        current->name=&yytext[5];
                        current->section=Entry::VARIABLE_SEC;
                        current->fileName  = yyFileName;
@@ -782,7 +786,7 @@ STARTDOCSYMS      "##"
 
 <FunctionBody>{
     \n{B}/{IDENTIFIER}{BB}  {
-                        //fprintf(stderr,"indent %d<=%d\n",computeIndent(&yytext[1]),g_indent);
+                        DBG_CTX((stderr,"indent %d<=%d\n",computeIndent(&yytext[1]),g_indent));
                         if (computeIndent(&yytext[1])<=g_indent) 
                        {
                          int i;
@@ -1002,7 +1006,7 @@ STARTDOCSYMS      "##"
                      }
     ^{BB}            { // something at indent >0
                         g_curIndent=computeIndent(yytext);
-                       //fprintf(stderr,"g_curIndent=%d g_indent=%d\n",g_curIndent,g_indent);
+                       DBG_CTX((stderr,"g_curIndent=%d g_indent=%d\n",g_curIndent,g_indent));
                         if (g_curIndent<=g_indent) 
                          // jumped out of the class/method
                        {
@@ -1133,7 +1137,7 @@ STARTDOCSYMS      "##"
                                 //current->startLine = yyLineNr;
                                 g_curIndent=computeIndent(yytext);
                                 bodyEntry = current;
-                                //fprintf(stderr,"setting indent %d\n",g_curIndent);
+                                DBG_CTX((stderr,"setting indent %d\n",g_curIndent));
                                 //printf("current->program=[%s]\n",current->program.data());
                                 //g_hideClassDocs = TRUE;
                                 BEGIN(ClassBody);
@@ -1155,36 +1159,38 @@ STARTDOCSYMS      "##"
 <VariableDec>{
    "="                { // the assignment operator
                         //printf("====== VariableDec at line %d\n",yyLineNr);
+                       current->initializer = yytext;
+                       current->initializer += " ";
                       }
    {B}                { // spaces
                      }
    {INTNUMBER}       { // integer value
                        current->type = "int";
-                       current->initializer = yytext;
+                       current->initializer += yytext;
                        BEGIN(VariableEnd);
                      }
    {FLOATNUMBER}      { // floating point value
                        current->type = "float";
-                       current->initializer = yytext;
+                       current->initializer += yytext;
                        BEGIN(VariableEnd);
                      }
    {STRINGPREFIX}?"'" { // string
                        current->type = "string";
-                       current->initializer = yytext;
+                       current->initializer += yytext;
                        g_copyString=&current->initializer;
                                g_stringContext=VariableEnd;
                         BEGIN( SingleQuoteString );
                      }
    {STRINGPREFIX}?"\"" { // string
                        current->type = "string";
-                       current->initializer = yytext;
+                       current->initializer += yytext;
                        g_copyString=&current->initializer;
                                g_stringContext=VariableEnd;
                         BEGIN( DoubleQuoteString );
                      }
    {TRIDOUBLEQUOTE}   { // start of a comment block
                        current->type = "string";
-                       current->initializer = yytext;
+                       current->initializer += yytext;
                        g_doubleQuote=TRUE;
                        g_copyString=&current->initializer;
                                g_stringContext=VariableEnd;
@@ -1193,7 +1199,7 @@ STARTDOCSYMS      "##"
 
    {TRISINGLEQUOTE}   { // start of a comment block
                        current->type = "string";
-                       current->initializer = yytext;
+                       current->initializer += yytext;
                        g_doubleQuote=FALSE;
                        g_copyString=&current->initializer;
                                g_stringContext=VariableEnd;
@@ -1350,11 +1356,11 @@ STARTDOCSYMS      "##"
                          { // strip g_curIndent amount of whitespace
                            int i;
                            for (i=0;i<indent-g_curIndent;i++) docBlock+=' ';
-                           //fprintf(stderr,"stripping indent %d\n",g_curIndent);
+                           DBG_CTX((stderr,"stripping indent %d\n",g_curIndent));
                          }
                          else
                          {
-                           //fprintf(stderr,"not stripping: %d<%d\n",indent,g_curIndent);
+                           DBG_CTX((stderr,"not stripping: %d<%d\n",indent,g_curIndent));
                            docBlock += yytext;
                          }
                        }
@@ -1673,7 +1679,11 @@ void pyscanFreeScanner()
 
 //----------------------------------------------------------------------------
 
-void PythonLanguageScanner::parseInput(const char *fileName,const char *fileBuf,Entry *root)
+void PythonLanguageScanner::parseInput(const char *fileName,
+                                       const char *fileBuf,
+                                       Entry *root,
+                                       bool /*sameTranslationUnit*/,
+                                       QStrList & /*filesInSameTranslationUnit*/)
 {
   g_thisParser = this;
   ::parseMain(fileName,fileBuf,root);
index 59eef3a..ab49733 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 8f103d7..70bd9ba 100644 (file)
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index a4a450e..3124582 100644 (file)
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -48,7 +48,7 @@ class SortedRefItems : public SDict<RefItem>
     {
       RefItem *r1 = (RefItem*)item1;
       RefItem *r2 = (RefItem*)item2;
-      return stricmp(r1->title,r2->title);
+      return qstricmp(r1->title,r2->title);
     }
 };
 
index 8365b25..a80dece 100644 (file)
@@ -38,7 +38,7 @@ function resizeWidth()
 {
   var windowWidth = $(window).width() + "px";
   var sidenavWidth = $(sidenav).outerWidth();
-  content.css({marginLeft:parseInt(sidenavWidth)+6+"px"}); //account for 6px-wide handle-bar
+  content.css({marginLeft:parseInt(sidenavWidth)+"px"}); 
   writeCookie('width',sidenavWidth, null);
 }
 
index e24c0b0..160b16c 100644 (file)
@@ -38,7 +38,7 @@
 "{\n"
 "  var windowWidth = $(window).width() + \"px\";\n"
 "  var sidenavWidth = $(sidenav).outerWidth();\n"
-"  content.css({marginLeft:parseInt(sidenavWidth)+6+\"px\"}); //account for 6px-wide handle-bar\n"
+"  content.css({marginLeft:parseInt(sidenavWidth)+\"px\"}); \n"
 "  writeCookie('width',sidenavWidth, null);\n"
 "}\n"
 "\n"
index d77a3d6..2d07957 100644 (file)
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -311,7 +311,7 @@ void RTFDocVisitor::visit(DocSymbol *s)
     case DocSymbol::LeftFloor:       m_t << "lfloor "; break;
     case DocSymbol::RightFloor:      m_t << "rfloor "; break;
     default:
-                             err("error: unknown symbol found\n");
+                             err("unknown symbol found\n");
   }
   m_lastIsPara=FALSE;
 }
@@ -446,7 +446,8 @@ void RTFDocVisitor::visit(DocVerbatim *s)
     case DocVerbatim::HtmlOnly: 
     case DocVerbatim::LatexOnly: 
     case DocVerbatim::XmlOnly: 
-    case DocVerbatim::ManOnly: 
+    case DocVerbatim::ManOnly:
+    case DocVerbatim::DocbookOnly:
       /* nothing */
       break;
     case DocVerbatim::Dot: 
index 2ad0d23..eb841e5 100644 (file)
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index b51245c..9a7dbee 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Parker Waechter & Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Parker Waechter & Dimitri van Heesch.
  *
  * Style sheet additions by Alexander Bartolich
  *
@@ -178,7 +178,7 @@ void RTFGenerator::init()
   while(def->reference != 0)
   {
     if (def->definition == 0)
-      err("Internal error: rtf_Style_Default[%s] has no definition.\n", def->name);
+      err("Internal: rtf_Style_Default[%s] has no definition.\n", def->name);
     StyleData* styleData = new StyleData(def->reference, def->definition);
     rtf_Style.insert(def->name, styleData);
     def++;
@@ -1773,21 +1773,6 @@ void RTFGenerator::codify(const char *str)
 
       c=*p++;
 
-#if 0
-      if( MultiByte )
-      {
-        t << getMultiByte( c );
-        MultiByte = FALSE;
-        continue;
-      }
-      if( c >= 0x80 )
-      {
-        MultiByte = TRUE;
-        t << getMultiByte( c );
-        continue;
-      }
-#endif
-
       switch(c)
       {
         case '\t':  spacesToNextTabStop = Config_getInt("TAB_SIZE") - (col%Config_getInt("TAB_SIZE"));
@@ -1800,7 +1785,7 @@ void RTFGenerator::codify(const char *str)
         case '{':   t << "\\{"; col++;          break;
         case '}':   t << "\\}"; col++;          break;
         case '\\':  t << "\\\\"; col++;         break;
-        default:    t << (char)c; col++;           break;
+        default:    p=(const unsigned char *)writeUtf8Char(t,(const char *)p-1); col++; break;
       }
     }
   }
@@ -2024,7 +2009,7 @@ void RTFGenerator::incrementIndentLevel()
   m_listLevel++;
   if (m_listLevel>rtf_maxIndentLevels-1)
   {
-    err("error: Maximum indent level (%d) exceeded while generating RTF output!\n",rtf_maxIndentLevels);
+    err("Maximum indent level (%d) exceeded while generating RTF output!\n",rtf_maxIndentLevels);
     m_listLevel=rtf_maxIndentLevels-1;
   }
 }
@@ -2034,7 +2019,7 @@ void RTFGenerator::decrementIndentLevel()
   m_listLevel--;
   if (m_listLevel<0)
   {
-    err("error: Negative indent level while generating RTF output!\n");
+    err("Negative indent level while generating RTF output!\n");
     m_listLevel=0;
   }
 }
@@ -2352,7 +2337,7 @@ static bool preProcessFile(QDir &d,QCString &infName, FTextStream &t, bool bIncl
   QFile f(infName);
   if (!f.open(IO_ReadOnly))
   {
-    err("error: problems opening rtf file %s for reading\n",infName.data());
+    err("problems opening rtf file %s for reading\n",infName.data());
     return FALSE;
   }
 
@@ -2367,7 +2352,7 @@ static bool preProcessFile(QDir &d,QCString &infName, FTextStream &t, bool bIncl
   {
     if (f.readLine(lineBuf.data(),maxLineLength)==-1)
     {
-      err("ERROR - read error in %s before end of RTF header!\n",infName.data());
+      err("read error in %s before end of RTF header!\n",infName.data());
       return FALSE;
     }
     if (bIncludeHeader) encodeForOutput(t,lineBuf);
@@ -2550,9 +2535,9 @@ void testRTFOutput(const char *name)
   }
   if (bcount==0) return; // file is OK.
 err:
-  err("error: RTF integrity test failed at line %d of %s due to a bracket mismatch.\n",line,name);
-  err("       Please try to create a small code example that produces this error \n"
-      "       and send that to dimitri@stack.nl.\n");
+  err("RTF integrity test failed at line %d of %s due to a bracket mismatch.\n"
+      "       Please try to create a small code example that produces this error \n"
+      "       and send that to dimitri@stack.nl.\n",line,name);
 }
 
 /**
@@ -2565,7 +2550,7 @@ bool RTFGenerator::preProcessFileInplace(const char *path,const char *name)
   // store the original directory
   if (!d.exists())
   {
-    err("error: Output dir %s does not exist!\n",path);
+    err("Output dir %s does not exist!\n",path);
     return FALSE;
   }
   QCString oldDir = QDir::currentDirPath().utf8();
@@ -2716,6 +2701,16 @@ void RTFGenerator::endParameterType()
   t << " ";
 }
 
+void RTFGenerator::exceptionEntry(const char* prefix,bool closeBracket)
+{
+  DBG_RTF(t << "{\\comment (exceptionEntry)}"    << endl)
+  if (prefix)
+      t << " " << prefix;
+  else if (closeBracket)
+      t << ")";
+  t << " ";
+}
+
 void RTFGenerator::writeDoc(DocNode *n,Definition *ctx,MemberDef *)
 {
   RTFDocVisitor *visitor = new RTFDocVisitor(t,*this,ctx?ctx->getDefFileExtension():QCString(""));
index 784cfcc..6c3393f 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Parker Waechter & Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Parker Waechter & Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -230,6 +230,7 @@ class RTFGenerator : public OutputGenerator
     void endParameterName(bool,bool,bool) {}
     void startParameterList(bool) {}
     void endParameterList() {}
+    void exceptionEntry(const char*,bool);
 
     void startConstraintList(const char  *);
     void startConstraintParam();
@@ -257,7 +258,6 @@ class RTFGenerator : public OutputGenerator
     void endFontClass() {}
 
     void writeCodeAnchor(const char *) {}
-    void linkableSymbol(int,const char *,Definition *,Definition *) {}
     void setCurrentDoc(Definition *,const char *,bool) {}
     void addWord(const char *,bool) {}
 
index 1c565e1..2bede42 100644 (file)
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -394,9 +394,9 @@ bool StyleData::setStyle(const char* s, const char* styleName)
     }
     else if (*end == '\\')
     {
-      if (0 == strncmp(end, "\\snext", 6))
+      if (0 == qstrncmp(end, "\\snext", 6))
         break;
-      if (0 == strncmp(end, "\\sbasedon", 9))
+      if (0 == qstrncmp(end, "\\sbasedon", 9))
         break;
       if (0 != any_clause.match(end, 0, &len))
         break;
index ef7cb9a..52488f1 100644 (file)
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 7e3b2a3..54a3c1c 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -30,9 +30,13 @@ class CLanguageScanner : public ParserInterface
 {
   public:
     virtual ~CLanguageScanner() {}
+    void startTranslationUnit(const char *fileName);
+    void finishTranslationUnit();
     void parseInput(const char *fileName,
                     const char *fileBuf,
-                    Entry *root);
+                    Entry *root,
+                    bool sameTranslationUnit,
+                    QStrList &filesInSameTranslationUnit);
     bool needsPreprocessing(const QCString &extension);
     void parseCode(CodeOutputInterface &codeOutIntf,
                    const char *scopeName,
index 8efca45..6bbf1c4 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
 #include "code.h"
 #include "arguments.h"
 
+#include "clangparser.h"
+
+// Toggle for some debugging info
+#define DBG_CTX(x) fprintf x
+//#define DBG_CTX(x) do { } while(0)
+
 #define YY_NEVER_INTERACTIVE 1
 #define YY_NO_INPUT 1
 
@@ -73,6 +79,7 @@ static int              lastRawStringContext;
 static int              lastCSConstraint;
 static int              lastHereDocContext;
 static int              lastDefineContext;
+static int              lastAlignAsContext;
 static Protection      protection;
 static Protection      baseProt;
 static int             sharpCount   = 0 ;
@@ -89,6 +96,9 @@ static Entry*         tempEntry    = 0 ;
 static Entry*          firstTypedefEntry = 0 ;
 static Entry*          memspecEntry = 0 ;
 static int             yyLineNr     = 1 ;
+static int             yyBegLineNr  = yyLineNr ;
+static int             yyColNr      = 1 ;
+static int             yyBegColNr   = yyColNr ;
 static int              anonCount    = 0 ;        
 static int              anonNSCount  = 0 ;        
 static QCString                yyFileName;
@@ -166,7 +176,6 @@ static QCString         g_skipBlockName;
 static QCString         oldStyleArgType;
 static QCString         docBackup;
 static QCString         briefBackup;
-static bool             g_inputFromFile;
 
 static int              docBlockContext;
 static QGString         docBlock;
@@ -185,6 +194,8 @@ static QCString         g_delimiter;
 
 static int              g_column;
 
+static int              g_fencedSize=0;
+
 //-----------------------------------------------------------------------------
 
 // forward declarations
@@ -216,6 +227,9 @@ static void initParser()
   insideCode=FALSE;
   insideCli=Config_getBool("CPP_CLI_SUPPORT");
   previous = 0;
+  firstTypedefEntry = 0;
+  tempEntry = 0;
+  memspecEntry =0;
 }
 
 static void initEntry()
@@ -285,12 +299,19 @@ static void lineCount()
   for (p = yytext ; *p ; ++p )
   {
     if (*p=='\n') 
-      yyLineNr++,g_column=0;
+    {
+      yyLineNr++,g_column=0,yyColNr=1;
+    }
     else if (*p=='\t') 
+    {
       g_column+=tabSize - (g_column%tabSize);
+    }
     else 
-      g_column++;
+    {
+      g_column++,yyColNr++;
+    }
   }
+  //printf("lineCount()=%d\n",g_column);
 }
 
 static inline int computeIndent(const char *s,int startIndent)
@@ -505,7 +526,7 @@ static void splitKnRArg(QCString &oldStyleArgPtr,QCString &oldStyleArgName)
       oldStyleArgName=current->args.copy().stripWhiteSpace();
     }
   }
-  //fprintf(stderr,"type=%s ptr=%s name=%s\n",oldStyleArgType.data(),oldStyleArgPtr.data(),oldStyleArgName.data());
+  DBG_CTX((stderr,"type=%s ptr=%s name=%s\n",oldStyleArgType.data(),oldStyleArgPtr.data(),oldStyleArgName.data()));
 }
 
 //-----------------------------------------------------------------------------
@@ -571,19 +592,11 @@ void fixArgumentListForJavaScript(ArgumentList *al)
 static int yyread(char *buf,int max_size)
 {
     int c=0;
-    if (g_inputFromFile)
+    while( c < max_size && inputString[inputPosition] )
     {
-       c = inputFile.readBlock(buf,max_size);
-       if (c==-1) yy_fatal_error("input in flex scanner failed");
-    }
-    else
-    {
-      while( c < max_size && inputString[inputPosition] )
-      {
-       *buf = inputString[inputPosition++] ;
-       //printf("%d (%c)\n",*buf,*buf);
-       c++; buf++;
-      }
+      *buf = inputString[inputPosition++] ;
+      //printf("%d (%c)\n",*buf,*buf);
+      c++; buf++;
     }
     return c;
 }
@@ -592,14 +605,11 @@ static int yyread(char *buf,int max_size)
 
        /* start command character */
 CMD      ("\\"|"@")
-SECTIONCMD {CMD}("image"|"author"|"internal"|"version"|"date"|"deprecated"|"param"|"exception"|"return"[s]?|"retval"|"bug"|"warning"|"par"|"sa"|"see"|"pre"|"post"|"invariant"|"note"|"remark"[s]?|"todo"|"test"|"xrefitem"|"ingroup"|"callgraph"|"callergraph"|"latexonly"|"htmlonly"|"xmlonly"|"manonly"|"{"|"verbatim"|"dotfile"|"dot"|"defgroup"|"addtogroup"|"weakgroup"|"class"|"namespace"|"union"|"struct"|"fn"|"var"|"details"|"typedef"|"def"|"overload")|("<"{PRE}">")
+SECTIONCMD {CMD}("image"|"author"|"internal"|"version"|"date"|"deprecated"|"param"|"exception"|"return"[s]?|"retval"|"bug"|"warning"|"par"|"sa"|"see"|"pre"|"post"|"invariant"|"note"|"remark"[s]?|"todo"|"test"|"xrefitem"|"ingroup"|"callgraph"|"callergraph"|"latexonly"|"htmlonly"|"xmlonly"|"docbookonly"|"manonly"|"{"|"verbatim"|"dotfile"|"dot"|"defgroup"|"addtogroup"|"weakgroup"|"class"|"namespace"|"union"|"struct"|"fn"|"var"|"details"|"typedef"|"def"|"overload")|("<"{PRE}">")
 BN        [ \t\n\r]
 BL        [ \t\r]*"\n" 
 B         [ \t]
 BS        ^(({B}*"//")?)(({B}*"*"+)?){B}*
-FILESCHAR [a-z_A-Z0-9\x80-\xFF\\:\\\/\-\+]
-FILEECHAR [a-z_A-Z0-9\x80-\xFF\-\+]
-FILE      ({FILESCHAR}*{FILEECHAR}+("."{FILESCHAR}*{FILEECHAR}+)*)|("\""[^\n\"]+"\"")
 ID        "$"?[a-z_A-Z\x80-\xFF][a-z_A-Z0-9\x80-\xFF]*
 SCOPEID   {ID}({ID}*{BN}*"::"{BN}*)*({ID}?)
 SCOPENAME "$"?(({ID}?{BN}*"::"{BN}*)*)(((~|!){BN}*)?{ID})
@@ -619,6 +629,8 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
 
   /* language parsing states */
 
+%x      AlignAs
+%x      AlignAsEnd
 %x     Define
 %x     DefineEnd
 %x     CompoundName
@@ -702,6 +714,7 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
 %x     QtPropRead
 %x     QtPropWrite
 %x     ReadInitializer
+%x     UNOIDLAttributeBlock
 %x     GetCallType
 %x     CppQuote
 %x     EndCppQuote
@@ -1081,6 +1094,7 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                            lineCount();
                                            current->fileName  = yyFileName;
                                            current->startLine = yyLineNr;
+                                           current->startColumn = yyColNr;
                                            current->bodyLine  = yyLineNr;
                                            current->section = Entry::FUNCTION_SEC;
                                            current->protection = protection = Public ;
@@ -1105,6 +1119,10 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                            current->type = "id";
                                          }
                                          current->name = yytext;
+                                          if (insideCpp || insideObjC) 
+                                          {
+                                            current->id = ClangParser::instance()->lookup(yyLineNr,yytext);
+                                          }
                                        }
 <ObjCMethod>":"{B}*                    { // start of parameter list
                                          current->name += ':';
@@ -1198,7 +1216,7 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                            roundCount=1;
                                            BEGIN( SkipRound );
                                          }
-                                         else if (strncmp(yytext,"@property",9)==0) // ObjC 2.0 property
+                                         else if (qstrncmp(yytext,"@property",9)==0) // ObjC 2.0 property
                                          {
                                            current->mtype = mtype = Property;
                                            current->spec|=Entry::Readable | Entry::Writable | Entry::Assign;
@@ -1255,17 +1273,17 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                          {
                                            // skip annotation
                                          }
-                                         else if (strcmp(yytext,"@property")==0) // ObjC 2.0 property
+                                         else if (qstrcmp(yytext,"@property")==0) // ObjC 2.0 property
                                          {
                                            current->mtype = mtype = Property;
                                            current->spec|=Entry::Writable | Entry::Readable;
                                            current->protection = Public ;
                                          }
-                                         else if (strcmp(yytext,"@synthesize")==0)
+                                         else if (qstrcmp(yytext,"@synthesize")==0)
                                          {
                                            BEGIN( ObjCSkipStatement );
                                          }
-                                         else if (strcmp(yytext,"@dynamic")==0)
+                                         else if (qstrcmp(yytext,"@dynamic")==0)
                                          {
                                            BEGIN( ObjCSkipStatement );
                                          }
@@ -1287,6 +1305,7 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                          current->type = "namespace" ;
                                          current->fileName  = yyFileName;
                                          current->startLine = yyLineNr;
+                                         current->startColumn = yyColNr;
                                          current->bodyLine  = yyLineNr;
                                          lineCount();
                                        }
@@ -1319,6 +1338,17 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                          current->virt = Virtual;
                                          lineCount();
                                        }
+<FindMembers>{B}*"published"{BN}+      { // UNO IDL published keyword
+                                         if (insideIDL)
+                                         {
+                                           lineCount();
+                                           current->spec |= Entry::Published;
+                                         }
+                                         else
+                                         {
+                                           REJECT;
+                                         }
+                                       }
 <FindMembers>{B}*"abstract"{BN}+       { 
                                           if (!insidePHP) 
                                          {
@@ -1360,6 +1390,7 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                          current->type = "namespace" ;
                                          current->fileName  = yyFileName;
                                          current->startLine = yyLineNr;
+                                         current->startColumn = yyColNr;
                                          current->bodyLine  = yyLineNr;
                                          lineCount();
                                          if (insidePHP)
@@ -1380,6 +1411,7 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                            current->type = "module" ;
                                            current->fileName  = yyFileName;
                                            current->startLine = yyLineNr;
+                                           current->startColumn = yyColNr;
                                            current->bodyLine  = yyLineNr;
                                            BEGIN( CompoundName ); 
                                          }
@@ -1403,6 +1435,7 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                            current->type = "library" ;
                                            current->fileName  = yyFileName;
                                            current->startLine = yyLineNr;
+                                           current->startColumn = yyColNr;
                                            current->bodyLine  = yyLineNr;
                                            BEGIN( CompoundName ); 
                                          }
@@ -1412,17 +1445,82 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                            current->name = QCString(yytext).stripWhiteSpace();
                                          }
                                        }
-<FindMembers>{B}*((("disp")?"interface")|"valuetype"){BN}+     { // M$/Corba IDL/Java interface
+<FindMembers>{B}*"constants"{BN}+      {  // UNO IDL constant group
+                                         lineCount();
+                                         if (insideIDL)
+                                         {
+                                           isTypedef=FALSE;
+                                           current->section = Entry::NAMESPACE_SEC;
+                                           current->type = "constants";
+                                           current->fileName  = yyFileName;
+                                           current->startLine = yyLineNr;
+                                           current->startColumn = yyColNr;
+                                           current->bodyLine  = yyLineNr;
+                                           BEGIN( CompoundName );
+                                         }
+                                         else
+                                         {
+                                           addType( current ) ;
+                                           current->name = QCString(yytext).stripWhiteSpace();
+                                         }
+                                       }
+<FindMembers>{BN}*("service"){BN}+     { // UNO IDL service
+                                         lineCount();
+                                         if (insideIDL)
+                                         {
+                                           isTypedef=FALSE;
+                                           current->section = Entry::CLASS_SEC;
+                                           current->spec = Entry::Service |
+                                             // preserve UNO IDL [optional] or published
+                                             (current->spec & (Entry::Optional|Entry::Published));
+                                           addType( current ) ;
+                                           current->type += " service " ;
+                                           current->fileName  = yyFileName;
+                                           current->startLine = yyLineNr;
+                                           current->bodyLine  = yyLineNr;
+                                           BEGIN( CompoundName );
+                                         }
+                                         else // TODO is addType right? just copy/pasted
+                                         {
+                                           addType( current ) ;
+                                           current->name = QCString(yytext).stripWhiteSpace();
+                                         }
+                                       }
+<FindMembers>{BN}*("singleton"){BN}+   { // UNO IDL singleton
+                                         lineCount();
+                                         if (insideIDL)
+                                         {
+                                           isTypedef=FALSE;
+                                           current->section = Entry::CLASS_SEC;
+                                           current->spec = Entry::Singleton |
+                                             (current->spec & Entry::Published); // preserve
+                                           addType( current ) ;
+                                           current->type += " singleton " ;
+                                           current->fileName  = yyFileName;
+                                           current->startLine = yyLineNr;
+                                           current->bodyLine  = yyLineNr;
+                                           BEGIN( CompoundName );
+                                         }
+                                         else // TODO is addType right? just copy/pasted
+                                         {
+                                           addType( current ) ;
+                                           current->name = QCString(yytext).stripWhiteSpace();
+                                         }
+                                       }
+<FindMembers>{BN}*((("disp")?"interface")|"valuetype"){BN}+    { // M$/Corba/UNO IDL/Java interface
                                          lineCount();
                                           if (insideIDL || insideJava || insideCS || insideD || insidePHP)
                                          {
                                            isTypedef=FALSE;
                                            current->section = Entry::CLASS_SEC;
-                                            current->spec = Entry::Interface;
+                        current->spec = Entry::Interface |
+                          // preserve UNO IDL [optional] or published
+                          (current->spec & (Entry::Optional|Entry::Published));
                                            addType( current ) ;
                                            current->type += " interface" ;
                                            current->fileName  = yyFileName;
                                            current->startLine = yyLineNr;
+                                           current->startColumn = yyColNr;
                                            current->bodyLine  = yyLineNr;
                                            BEGIN( CompoundName );
                                          }
@@ -1461,6 +1559,7 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                          current->type += " interface" ;
                                          current->fileName  = yyFileName;
                                          current->startLine = yyLineNr;
+                                         current->startColumn = yyColNr;
                                          current->bodyLine  = yyLineNr;
                                          BEGIN( CompoundName );
                                        }
@@ -1476,17 +1575,20 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                          current->type += " protocol" ;
                                          current->fileName  = yyFileName;
                                          current->startLine = yyLineNr;
+                                         current->startColumn = yyColNr;
                                          current->bodyLine  = yyLineNr;
                                          BEGIN( CompoundName );
                                        }
 <FindMembers>{B}*"exception"{BN}+      { // Corba IDL exception
                                          isTypedef=FALSE;
                                          current->section = Entry::CLASS_SEC;
-                                          current->spec = Entry::Exception;
+                                         current->spec    = Entry::Exception |
+                                           (current->spec & Entry::Published); // preserve UNO IDL
                                          addType( current ) ;
                                          current->type += " exception" ;
                                          current->fileName  = yyFileName;
                                          current->startLine = yyLineNr;
+                                         current->startColumn = yyColNr;
                                          current->bodyLine  = yyLineNr;
                                          lineCount();
                                          BEGIN( CompoundName );
@@ -1500,6 +1602,7 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                          current->type += " class" ;
                                          current->fileName  = yyFileName;
                                          current->startLine = yyLineNr;
+                                         current->startColumn = yyColNr;
                                          current->bodyLine  = yyLineNr;
                                          if (yytext[0]=='@')
                                          {
@@ -1524,6 +1627,7 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                          current->type += " value class" ;
                                          current->fileName  = yyFileName;
                                          current->startLine = yyLineNr;
+                                         current->startColumn = yyColNr;
                                          current->bodyLine  = yyLineNr;
                                          lineCount() ;
                                          if (yytext[yyleng-1]=='{') unput('{');
@@ -1538,6 +1642,7 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                          current->type += " ref class" ;
                                          current->fileName  = yyFileName;
                                          current->startLine = yyLineNr;
+                                         current->startColumn = yyColNr;
                                          current->bodyLine  = yyLineNr;
                                          lineCount() ;
                                          if (yytext[yyleng-1]=='{') unput('{');
@@ -1552,6 +1657,7 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                          current->type += " interface class" ;
                                          current->fileName  = yyFileName;
                                          current->startLine = yyLineNr;
+                                         current->startColumn = yyColNr;
                                          current->bodyLine  = yyLineNr;
                                          lineCount() ;
                                          if (yytext[yyleng-1]=='{') unput('{');
@@ -1566,6 +1672,7 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                            current->type += " coclass" ;
                                            current->fileName  = yyFileName;
                                            current->startLine = yyLineNr;
+                                           current->startColumn = yyColNr;
                                            current->bodyLine  = yyLineNr;
                                            lineCount() ;
                                            BEGIN( CompoundName ) ;
@@ -1582,13 +1689,15 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
 <FindMembers>{B}*{TYPEDEFPREFIX}"struct"/{BN}+ { 
                                          isTypedef=((QCString)yytext).find("typedef")!=-1;
                                          current->section = Entry::CLASS_SEC ;
-                                          current->spec    = Entry::Struct;
+                                         current->spec    = Entry::Struct |
+                                           (current->spec & Entry::Published); // preserve UNO IDL
                                          // bug 582676: can be a struct nested in an interface so keep insideObjC state
                                          //current->objc    = insideObjC = FALSE;
                                          addType( current ) ;
                                          current->type += " struct" ;
                                          current->fileName  = yyFileName;
                                          current->startLine = yyLineNr;
+                                         current->startColumn = yyColNr;
                                          current->bodyLine  = yyLineNr;
                                          lineCount() ;
                                          if (yytext[yyleng-1]=='{') unput('{');
@@ -1603,6 +1712,7 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                          current->type += " value struct" ;
                                          current->fileName  = yyFileName;
                                          current->startLine = yyLineNr;
+                                         current->startColumn = yyColNr;
                                          current->bodyLine  = yyLineNr;
                                          lineCount() ;
                                          if (yytext[yyleng-1]=='{') unput('{');
@@ -1617,6 +1727,7 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                          current->type += " ref struct" ;
                                          current->fileName  = yyFileName;
                                          current->startLine = yyLineNr;
+                                         current->startColumn = yyColNr;
                                          current->bodyLine  = yyLineNr;
                                          lineCount() ;
                                          if (yytext[yyleng-1]=='{') unput('{');
@@ -1631,6 +1742,7 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                          current->type += " interface struct";
                                          current->fileName  = yyFileName;
                                          current->startLine = yyLineNr;
+                                         current->startColumn = yyColNr;
                                          current->bodyLine  = yyLineNr;
                                          lineCount() ;
                                          if (yytext[yyleng-1]=='{') unput('{');
@@ -1647,6 +1759,7 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                          current->type += " union" ;
                                          current->fileName  = yyFileName;
                                          current->startLine = yyLineNr;
+                                         current->startColumn = yyColNr;
                                          current->bodyLine  = yyLineNr;
                                          lineCount() ;
                                          if (yytext[yyleng-1]=='{') unput('{');
@@ -1674,6 +1787,7 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                           }
                                          current->fileName  = yyFileName;
                                          current->startLine = yyLineNr;
+                                         current->startColumn = yyColNr;
                                          current->bodyLine  = yyLineNr;
                                          lineCount() ;
                                          if (yytext[yyleng-1]=='{') unput('{');
@@ -1819,6 +1933,7 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                        }
 <FindMembers>"using"{BN}+              { 
                                          current->startLine=yyLineNr; 
+                                         current->startColumn = yyColNr;
                                           lineCount(); 
                                           BEGIN(Using); 
                                         }
@@ -1840,6 +1955,7 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                            current->name=yytext;
                                            current->fileName = yyFileName; 
                                            current->startLine = yyLineNr;
+                                           current->startColumn = yyColNr;
                                            current->section=Entry::USINGDIR_SEC;
                                            current_root->addSubEntry(current);
                                            current             = new Entry ;
@@ -1923,9 +2039,12 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                          // *currentTemplateSpec+=yytext; 
                                        }
 <EndTemplate>"<"                       { 
-                                         current->name+='<';
-                                         // *currentTemplateSpec+='<'; 
-                                         sharpCount++; 
+                                          if (roundCount==0)
+                                          {
+                                           // *currentTemplateSpec+='<'; 
+                                           sharpCount++; 
+                                          }
+                                         current->name+=yytext;
                                        }
 <ClassTemplSpec,EndTemplate>">>"       {
                                          if (insideJava || insideCS || insideCli || roundCount==0)
@@ -1943,7 +2062,7 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
 <EndTemplate>">"                       {
                                          current->name+='>';
                                          // *currentTemplateSpec+='>';
-                                         if (--sharpCount<=0)
+                                         if (roundCount==0 && --sharpCount<=0)
                                          {  
                                            //printf("Found %s\n",current->name.data());
                                            BEGIN(FindMembers);
@@ -1953,7 +2072,7 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                          lineCount();
                                          current->name+='>';
                                          // *currentTemplateSpec+='>';
-                                         if (--sharpCount<=0)
+                                         if (roundCount==0 && --sharpCount<=0)
                                          {
                                            current->bodyLine = yyLineNr;
                                            current->args = "(";
@@ -1967,13 +2086,16 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
 <EndTemplate>">"{BN}*/"("({BN}*{ID}{BN}*"::")*({BN}*"*"{BN}*)+ { // function pointer returning a template instance
                                          lineCount();
                                          current->name+='>';
-                                         BEGIN(FindMembers);
+                                          if (roundCount==0)
+                                          {
+                                           BEGIN(FindMembers);
+                                          }
                                        }
 <EndTemplate>">"{BN}*/"::"             {
                                          lineCount();
                                          current->name+='>';
                                          // *currentTemplateSpec+='>';
-                                         if (--sharpCount<=0)
+                                         if (roundCount==0 && --sharpCount<=0)
                                          {
                                            BEGIN(FindMemberName);
                                          }
@@ -2090,57 +2212,68 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                          BEGIN(FindMembers);
                                        }
 <FindMembers,FindMemberName>{SCOPENAME}        {
+                                          if (insideCpp || insideObjC) 
+                                          {
+                                            current->id = ClangParser::instance()->lookup(yyLineNr,yytext);
+                                          }
+                                         yyBegColNr=yyColNr;
+                                         yyBegLineNr=yyLineNr;
                                          lineCount();
-                                          if (insideIDL && yyleng==9 && strcmp(yytext,"cpp_quote")==0)
+                                          if (insideIDL && yyleng==9 && qstrcmp(yytext,"cpp_quote")==0)
                                          {
                                            BEGIN(CppQuote);
                                          }
-                                         else if ((insideIDL || insideJava || insideD) && yyleng==6 && strcmp(yytext,"import")==0)
+                                         else if ((insideIDL || insideJava || insideD) && yyleng==6 && qstrcmp(yytext,"import")==0)
                                          {
                                            if (insideIDL)
                                              BEGIN(NextSemi);
                                            else // insideJava or insideD
                                              BEGIN(JavaImport);
                                          }
-                                         else if (insidePHP && strcmp(yytext,"use")==0)
+                                         else if (insidePHP && qstrcmp(yytext,"use")==0)
                                          {
                                            BEGIN(PHPUse);
                                          }
-                                         else if (insideJava && strcmp(yytext,"package")==0)
+                                         else if (insideJava && qstrcmp(yytext,"package")==0)
                                          {
                                            lineCount();
                                            BEGIN(PackageName);
                                          }
-                                         else if (insideIDL && strcmp(yytext,"case")==0)
+                                         else if (insideIDL && qstrcmp(yytext,"case")==0)
                                          {
                                            BEGIN(IDLUnionCase);
                                          }
-                                         else if (insideTryBlock && strcmp(yytext,"catch")==0)
+                                         else if (insideTryBlock && qstrcmp(yytext,"catch")==0)
                                          {
                                            insideTryBlock=FALSE;
                                            BEGIN(TryFunctionBlock);
                                          }
-                                         else if (insideJS && strcmp(yytext,"var")==0)
+                                          else if (insideCpp && qstrcmp(yytext,"alignas")==0)
+                                          {
+                                            lastAlignAsContext = YY_START;
+                                            BEGIN(AlignAs);
+                                          }
+                                         else if (insideJS && qstrcmp(yytext,"var")==0)
                                          { // javascript variable
                                            current->type="var";
                                          }
-                                         else if (insideJS && strcmp(yytext,"function")==0)
+                                         else if (insideJS && qstrcmp(yytext,"function")==0)
                                          { // javascript function
                                            current->type="function";
                                          }
-                                         else if (insideCS && strcmp(yytext,"this")==0)
+                                         else if (insideCS && qstrcmp(yytext,"this")==0)
                                          {
                                            // C# indexer
                                            addType( current ) ;
                                            current->name="this";
                                            BEGIN(CSIndexer);
                                          }
-                                          else if (insideCpp && strcmp(yytext,"static_assert")==0)
+                                          else if (insideCpp && qstrcmp(yytext,"static_assert")==0)
                                           {
                                             // C++11 static_assert
                                             BEGIN(StaticAssert);
                                           }
-                                          else if (insideCpp && strcmp(yytext,"decltype")==0)
+                                          else if (insideCpp && qstrcmp(yytext,"decltype")==0)
                                           {
                                             // C++11 decltype(x)
                                            current->type+=yytext;
@@ -2153,23 +2286,23 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                              addType( current ) ;
                                            }
                                            bool javaLike = insideJava || insideCS || insideD || insidePHP || insideJS;
-                                           if (javaLike && strcmp(yytext,"public")==0)
+                                           if (javaLike && qstrcmp(yytext,"public")==0)
                                            {
                                              current->protection = Public;
                                            }
-                                           else if (javaLike && strcmp(yytext,"protected")==0)
+                                           else if (javaLike && qstrcmp(yytext,"protected")==0)
                                            {
                                              current->protection = Protected;
                                            }
-                                           else if (javaLike && strcmp(yytext,"internal")==0)
+                                           else if (javaLike && qstrcmp(yytext,"internal")==0)
                                            {
                                              current->protection = Package;
                                            }
-                                           else if (javaLike && strcmp(yytext,"private")==0)
+                                           else if (javaLike && qstrcmp(yytext,"private")==0)
                                            {
                                              current->protection = Private;
                                            }
-                                           else if (javaLike && strcmp(yytext,"static")==0)
+                                           else if (javaLike && qstrcmp(yytext,"static")==0)
                                            {
                                              if (YY_START==FindMembers)
                                                current->name  = yytext;
@@ -2366,6 +2499,10 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
   */
 <Define>{ID}                           {
                                          //printf("Define `%s' without args\n",yytext);
+                                          if (insideCpp || insideObjC) 
+                                          {
+                                            current->id = ClangParser::instance()->lookup(yyLineNr,yytext);
+                                          }
                                          current->bodyLine = yyLineNr;
                                          current->name = yytext;
                                          BEGIN(DefineEnd);
@@ -2375,6 +2512,7 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                           lineCount();
                                          current->fileName   = yyFileName;
                                          current->startLine  = yyLineNr;
+                                         current->startColumn = yyColNr;
                                          current->type.resize(0);
                                          current->args       = current->args.simplifyWhiteSpace();
                                          current->name       = current->name.stripWhiteSpace();
@@ -2388,6 +2526,7 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                          //printf("End define\n");
                                          current->fileName   = yyFileName;
                                          current->startLine  = yyLineNr;
+                                         current->startColumn = yyColNr;
                                          current->type.resize(0);
                                           current->type       = "const";
                                           QCString init = current->initializer.data();
@@ -2445,7 +2584,6 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                          addType( current );
                                        }
 <FindMembers,MemberSpec,Function,NextSemi,EnumBaseType,BitFields,ReadInitializer,OldStyleArgs>";"{BN}*("/**"|"//!"|"/*!"|"///")"<" {
-                                         lineCount();
                                          if (current->bodyLine==-1)
                                          {
                                            current->bodyLine=yyLineNr;
@@ -2456,8 +2594,10 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                                              ( yytext[yyleng-2]=='!' && Config_getBool("QT_AUTOBRIEF") );
 
                                           QCString indent;
-                                          indent.fill(' ',computeIndent(yytext+1,g_column));
+                                          indent.fill(' ',computeIndent(yytext,g_column));
                                           docBlock=indent;
+                                          //printf("indent=%d\n",computeIndent(yytext+1,g_column));
+                                         lineCount();
 
                                          docBlockTerm = ';';
                                           if (YY_START==EnumBaseType && current->section==Entry::ENUM_SEC)
@@ -2478,15 +2618,15 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                          }
                                        }
 <MemberSpec,FindFields,FindMembers,NextSemi,EnumBaseType,BitFields,ReadInitializer,OldStyleArgs>","{BN}*("/**"|"//!"|"/*!"|"///")"<" {
-                                         lineCount();
                                          docBlockContext   = YY_START;
                                          docBlockInBody    = FALSE;
                                          docBlockAutoBrief = ( yytext[yyleng-2]=='*' && Config_getBool("JAVADOC_AUTOBRIEF") ) ||
                                                              ( yytext[yyleng-2]=='!' && Config_getBool("QT_AUTOBRIEF") );
 
                                           QCString indent;
-                                          indent.fill(' ',computeIndent(yytext+1,g_column));
+                                          indent.fill(' ',computeIndent(yytext,g_column));
                                           docBlock=indent;
+                                         lineCount();
 
                                          docBlockTerm = ',';
                                           if (YY_START==EnumBaseType && current->section==Entry::ENUM_SEC)
@@ -2507,7 +2647,6 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                          }
                                        }
 <DefineEnd,FindFields,FindFieldArg,ReadInitializer,OldStyleArgs>{BN}*("/**"|"//!"|"/*!"|"///")"<" {
-                                         lineCount();
                                          if (current->bodyLine==-1)
                                          {
                                            current->bodyLine=yyLineNr;
@@ -2519,6 +2658,7 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                           QCString indent;
                                           indent.fill(' ',computeIndent(yytext,g_column));
                                           docBlock=indent;
+                                         lineCount();
 
                                          docBlockTerm = 0;
                                          if (yytext[yyleng-3]=='/')
@@ -2595,6 +2735,15 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                          initBracketCount=0;
                                          BEGIN(ReadInitializer);
                                        }
+<UNOIDLAttributeBlock>{BN}*[gs]"et"{BN}+"raises"{BN}*"("{BN}*{SCOPENAME}{BN}*(","{BN}*{SCOPENAME}{BN}*)*")"{BN}*";"    {
+                                         lineCount();
+                                         current->exception += " ";
+                                         current->exception += removeRedundantWhiteSpace(yytext);
+                                       }
+<UNOIDLAttributeBlock>"}"              {
+                                         current->exception += " }";
+                                         BEGIN(FindMembers);
+                                       }
   /* Read initializer rules */
 <ReadInitializer>"("                   {
                                          lastRoundContext=YY_START;
@@ -2616,6 +2765,7 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                          {
                                            current->fileName   = yyFileName;
                                            current->startLine  = yyLineNr;
+                                           current->startColumn = yyColNr;
                                            current->args       = current->args.simplifyWhiteSpace();
                                            current->name       = current->name.stripWhiteSpace();
                                            current->section    = Entry::VARIABLE_SEC;
@@ -3000,7 +3150,7 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                          yyLineNr = line.mid(s,e-s).toInt();
                                          if (yytext[yyleng-1]=='\n')
                                          {
-                                           yyLineNr++;
+                                            lineCount();
                                             g_column=0;
                                          }
                                        }
@@ -3108,7 +3258,8 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                            }
                                            current->section = Entry::VARIABLE_SEC ;
                                            current->fileName = yyFileName;
-                                           current->startLine = yyLineNr;
+                                           current->startLine = yyBegLineNr;
+                                           current->startColumn = yyBegColNr;
                                            current_root->addSubEntry( current ) ;
                                            needNewCurrent=TRUE;
                                          }
@@ -3201,6 +3352,39 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                          }
                                          current->spec |= Entry::Gettable;
                                        }
+<IDLAttribute>"property" { // UNO IDL property
+                                         current->spec |= Entry::Property;
+                                       }
+<IDLAttribute>"attribute" { // UNO IDL attribute
+                                         current->spec |= Entry::Attribute;
+                                       }
+<IDLAttribute>"optional" { // on UNO IDL interface/service/attribute/property
+                           current->spec |= Entry::Optional;
+                         }
+<IDLAttribute>"readonly" { // on UNO IDL attribute or property
+                                         current->spec |= Entry::Readonly;
+                                       }
+<IDLAttribute>"bound" { // on UNO IDL attribute or property
+                                         current->spec |= Entry::Bound;
+                                       }
+<IDLAttribute>"removable" { // on UNO IDL property
+                                         current->spec |= Entry::Removable;
+                                       }
+<IDLAttribute>"constrained" { // on UNO IDL property
+                                         current->spec |= Entry::Constrained;
+                                       }
+<IDLAttribute>"transient" { // on UNO IDL property
+                                         current->spec |= Entry::Transient;
+                                       }
+<IDLAttribute>"maybevoid" { // on UNO IDL property
+                                         current->spec |= Entry::MaybeVoid;
+                                       }
+<IDLAttribute>"maybedefault" { // on UNO IDL property
+                                         current->spec |= Entry::MaybeDefault;
+                                       }
+<IDLAttribute>"maybeambiguous" { // on UNO IDL property
+                                         current->spec |= Entry::MaybeAmbiguous;
+                                       }
 <IDLAttribute>.                                {
                                        }
 <IDLPropName>{BN}*{ID}{BN}*            {
@@ -3210,6 +3394,7 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                          current->name = yytext;
                                          current->name = current->name.left(current->name.length()-1).stripWhiteSpace();
                                          current->startLine = yyLineNr;
+                                         current->startColumn = yyColNr;
                                          BEGIN( IDLProp );
                                        }
 <IDLProp>{BN}*"["[^\]]*"]"{BN}*                {  // attribute of a parameter
@@ -3291,6 +3476,10 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                        }
 <Sharp>.                               { current->type += *yytext ; }
 <FindFields>{ID}                       {
+                                          if (insideCpp || insideObjC) 
+                                          {
+                                            current->id = ClangParser::instance()->lookup(yyLineNr,yytext);
+                                          }
                                          current->bodyLine = yyLineNr;
                                          current->name     = yytext;
                                        }
@@ -3315,6 +3504,7 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                            {
                                              current->fileName   = yyFileName;
                                              current->startLine  = yyLineNr;
+                                             current->startColumn = yyColNr;
                                              current->type       = "@"; // enum marker
                                              current->args       = current->args.simplifyWhiteSpace();
                                              current->name       = current->name.stripWhiteSpace();
@@ -3343,6 +3533,7 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                          {
                                            current->fileName   = yyFileName;
                                            current->startLine  = yyLineNr;
+                                           current->startColumn = yyColNr;
                                            if (!(current_root->spec&Entry::Enum))
                                            {
                                              current->type       = "@"; // enum marker
@@ -3503,7 +3694,9 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                                }
                                                else
                                                {
-                                                 if (!isTypedef) // not typedef 
+                                                  static QRegExp re("@[0-9]+$");
+                                                 if (!isTypedef && memspecEntry &&
+                                                      memspecEntry->name.find(re)==-1) // not typedef or anonymous type (see bug691071)
                                                  {
                                                    // enabled the next two lines for bug 623424
                                                    current->doc.resize(0);
@@ -3691,6 +3884,7 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                              }
                                              varEntry->fileName = yyFileName;
                                              varEntry->startLine = yyLineNr;
+                                             varEntry->startColumn = yyColNr;
                                              varEntry->doc = current->doc.copy();
                                              varEntry->brief = current->brief.copy();
                                              varEntry->mGrpId = current->mGrpId;
@@ -4131,7 +4325,7 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                          fullArgString+=yytext;
                                          BEGIN(CopyArgVerbatim);
                                         }
-<CopyArgVerbatim>[\\@]("endverbatim"|"endlatexonly"|"endhtmlonly"|"endxmlonly"|"endmanonly"|"enddot"|"endcode"|"f$"|"f]"|"f}")/[^a-z_A-Z0-9] { // end of verbatim block
+<CopyArgVerbatim>[\\@]("endverbatim"|"endlatexonly"|"endhtmlonly"|"endxmlonly"|"enddocbookonly"|"endmanonly"|"enddot"|"endcode"|"f$"|"f]"|"f}")/[^a-z_A-Z0-9] { // end of verbatim block
                                          fullArgString+=yytext;
                                          if (yytext[1]=='f') // end of formula
                                          {
@@ -4148,7 +4342,7 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
 <CopyArgComment,CopyArgVerbatim>.      { fullArgString+=*yytext; }
 <CopyArgComment>{CMD}("brief"|"short"){B}+ {
                                          warn(yyFileName,yyLineNr,
-                                             "warning: Ignoring %cbrief command inside argument documentation",*yytext
+                                             "Ignoring %cbrief command inside argument documentation",*yytext
                                             );
                                           fullArgString+=' ';
                                         }
@@ -4264,7 +4458,7 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                        }
   */
 <FuncQual>[{:;,]                        {
-                                          if ( strcmp(yytext,";")==0 && 
+                                          if ( qstrcmp(yytext,";")==0 && 
                                               insidePHP && 
                                               !containsWord(current->type,"function") )
                                           {
@@ -4446,7 +4640,7 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                           lineCount();
                                        }
 <FuncQual>{ID}                         { // typically a K&R style C function
-                                          if (insideCS && strcmp(yytext,"where")==0)
+                                          if (insideCS && qstrcmp(yytext,"where")==0)
                                          { 
                                            // type contraint for a method
                                             delete current->typeConstr;
@@ -4457,7 +4651,7 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                          }
                                          else if (checkForKnRstyleC())
                                          {
-                                           //fprintf(stderr,"===> got a K&R style function\n");
+                                           DBG_CTX((stderr,"===> got a K&R style function\n"));
                                             current->args = yytext; 
                                            oldStyleArgType.resize(0);
                                            BEGIN(OldStyleArgs);
@@ -4562,7 +4756,8 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                          current->args=removeRedundantWhiteSpace(current->args);
                                                        // was: current->args.simplifyWhiteSpace();
                                          current->fileName = yyFileName;
-                                         current->startLine = yyLineNr;
+                                         current->startLine = yyBegLineNr;
+                                         current->startColumn = yyBegColNr;
                                          static QRegExp re("([^)]*[*&][^)]*)"); // (...*...)
                                          if (*yytext!=';' || (current_root->section&Entry::COMPOUND_MASK) )
                                          {
@@ -4846,7 +5041,7 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                        }
 <SkipInits>;                           {
                                          warn(yyFileName,yyLineNr,
-                                             "warning: Found ';' while parsing initializer list! "
+                                             "Found ';' while parsing initializer list! "
                                              "(doxygen could be confused by a macro call without semicolon)"
                                             );
                                          BEGIN( FindMembers );
@@ -4892,7 +5087,7 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                          unput(':');
                                          BEGIN(ClassVar);
                                        }
-<Bases,CompoundName>";"                        { 
+<CompoundName>";"                      {
                                          current->section = Entry::EMPTY_SEC ;
                                          current->type.resize(0) ;
                                          current->name.resize(0) ;
@@ -4900,6 +5095,37 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                          current->argList->clear();
                                          BEGIN( FindMembers ) ;
                                        }
+<Bases>";"                     {
+                                         if (insideIDL && (current->spec & (Entry::Singleton |
+                                                                            Entry::Service)))
+                                         {
+                                           // in UNO IDL a service or singleton may be defined
+                                           // completely like this: "service Foo : XFoo;"
+                                           if (!current->name.isEmpty() && !current_root->name.isEmpty())
+                                           {
+                                             prependScope();
+                                           }
+                                           current->name = current->name.stripWhiteSpace();
+                                           // there can be only one base class here
+                                           if (!baseName.isEmpty())
+                                           {
+                                             current->extends->append(
+                                               new BaseInfo(baseName,Public,Normal));
+                                             baseName.resize(0);
+                                           }
+                                           current_root->addSubEntry( current ) ;
+                                           current = new Entry;
+                                         }
+                                         else
+                                         {
+                                           current->section = Entry::EMPTY_SEC ;
+                                           current->type.resize(0) ;
+                                           current->name.resize(0) ;
+                                           current->args.resize(0) ;
+                                           current->argList->clear();
+                                         }
+                                         BEGIN( FindMembers ) ;
+                                       }
 <CompoundName>{SCOPENAME}{BN}*/"<"     {
                                          sharpCount = 0;
                                          current->name = yytext ;
@@ -4979,9 +5205,37 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                             current->name = yytext;
                                             current->name=current->name.left(current->name.length()-1).stripWhiteSpace();
                                             //printf("template class declaration for %s!\n",current->name.data());
+                                           QCString rn = current_root->name.copy();
+                                           //printf("cn=`%s' rn=`%s' isTypedef=%d\n",cn.data(),rn.data(),isTypedef);
+                                           if (!current->name.isEmpty() && !rn.isEmpty())
+                                           {
+                                             prependScope();
+                                           }
                                             current_root->addSubEntry(current);
                                             current = new Entry;
                                           }
+                                         else if (insideIDL &&
+                                                  (((current_root->spec & (Entry::Interface |
+                                                                           Entry::Service)) &&
+                                                    (current->spec & Entry::Interface)) ||
+                                                   ((current_root->spec & (Entry::Service |
+                                                                           Entry::Singleton)) &&
+                                                    (current->spec & Entry::Service))))
+                                         {
+                                           // interface inside of UNO IDL service or interface
+                                           // service inside of UNO IDL service or singleton
+                                           // there may be documentation on the member,
+                                           // so do not throw it away...
+                                           current->name = yytext;
+                                           current->name=current->name.left(current->name.length()-1).stripWhiteSpace();
+                                           current->section = (current->spec & Entry::Interface)
+                                               ? Entry::EXPORTED_INTERFACE_SEC
+                                               : Entry::INCLUDED_SERVICE_SEC;
+//                                         current->section = Entry::MEMBERDOC_SEC;
+                                           current->spec &= ~(Entry::Interface|Entry::Service); // FIXME: horrible: Interface == Gettable, so need to clear it - actually we're mixing values from different enums in this case... granted only Optional and Interface are actually valid in this context but urgh...
+                                           current_root->addSubEntry(current);
+                                           current = new Entry;
+                                         }
 
                                          unput(';');
                                          current->reset();
@@ -4995,12 +5249,33 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
 <CompoundName>{SCOPENAME}/{BN}*"("     { 
                                          current->name = yytext ;
                                          lineCount();
-                                         if (current->spec & Entry::Protocol)
-                                         {
-                                           current->name += "-p";
-                                         }
-                                         BEGIN( ClassVar );
+                                          if (insideCpp && current->name=="alignas") // C++11
+                                          {
+                                            lastAlignAsContext = YY_START;
+                                            BEGIN( AlignAs );
+                                          }
+                                          else
+                                          {
+                                            if (current->spec & Entry::Protocol)
+                                            {
+                                              current->name += "-p";
+                                            }
+                                            BEGIN( ClassVar );
+                                          }
                                        }
+<AlignAs>"("                            { roundCount=1; 
+                                          BEGIN( AlignAsEnd ); 
+                                        }
+<AlignAs>\n                             { lineCount(); }
+<AlignAs>.
+<AlignAsEnd>"("                         { roundCount++; }
+<AlignAsEnd>")"                         { if (--roundCount<=0) 
+                                          {
+                                            BEGIN( lastAlignAsContext ); 
+                                          }
+                                        }
+<AlignAsEnd>\n                          { lineCount(); }
+<AlignAsEnd>.
 <CompoundName>{SCOPENAME}/{BN}*","     {  // multiple forward declarations on one line
                                            // e.g. @protocol A,B;
                                          current->reset();
@@ -5008,6 +5283,10 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                        }
 <CompoundName>{SCOPENAME}              { 
                                          current->name = yytext ;
+                                          if (insideCpp || insideObjC) 
+                                          {
+                                            current->id = ClangParser::instance()->lookup(yyLineNr,yytext);
+                                          }
                                          lineCount();
                                          if (current->spec & Entry::Protocol)
                                          {
@@ -5026,7 +5305,7 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                          BEGIN( ClassVar );
                                         }
 <ClassVar>{SCOPENAME}{BN}*/"("         {
-                                         if (insideIDL && strncmp(yytext,"switch",6)==0 && !isId(yytext[6]))
+                                         if (insideIDL && qstrncmp(yytext,"switch",6)==0 && !isId(yytext[6]))
                                          {
                                            // Corba IDL style union
                                            roundCount=0;
@@ -5069,13 +5348,17 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                          }
                                        }
 <ClassVar>{ID}                         {
-                                         if (insideIDL && strcmp(yytext,"switch")==0)
+                                          if (insideCpp || insideObjC) 
+                                          {
+                                            current->id = ClangParser::instance()->lookup(yyLineNr,yytext);
+                                          }
+                                         if (insideIDL && qstrcmp(yytext,"switch")==0)
                                          {
                                            // Corba IDL style union
                                            roundCount=0;
                                            BEGIN(SkipUnionSwitch);
                                          }
-                                         else if ((insideJava || insidePHP || insideJS) && (strcmp(yytext,"implements")==0 || strcmp(yytext,"extends")==0))
+                                         else if ((insideJava || insidePHP || insideJS) && (qstrcmp(yytext,"implements")==0 || qstrcmp(yytext,"extends")==0))
                                          {
                                            current->type.resize(0);
                                            baseProt=Public;
@@ -5083,7 +5366,7 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                            baseName.resize(0);
                                            BEGIN( BasesProt ) ;
                                          }
-                                         else if (insideCS && strcmp(yytext,"where")==0) // C# type contraint
+                                         else if (insideCS && qstrcmp(yytext,"where")==0) // C# type contraint
                                          {
                                             delete current->typeConstr;
                                             current->typeConstr = new ArgumentList;
@@ -5091,15 +5374,15 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                            lastCSConstraint = YY_START;
                                            BEGIN( CSConstraintName );
                                          }
-                                         else if (insideCli &&  strcmp(yytext,"abstract")==0)
+                                         else if (insideCli &&  qstrcmp(yytext,"abstract")==0)
                                          {
                                            current->spec|=Entry::Abstract;
                                          }
-                                         else if (insideCli &&  strcmp(yytext,"sealed")==0)
+                                         else if (insideCli &&  qstrcmp(yytext,"sealed")==0)
                                          {
                                            current->spec|=Entry::Sealed;
                                          }
-                                          else if (strcmp(yytext,"final")==0)
+                                          else if (qstrcmp(yytext,"final")==0)
                                           {
                                             current->spec|=Entry::Final;
                                           }
@@ -5229,7 +5512,7 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                                (current->spec & Entry::Struct)    || 
                                                (current->spec & Entry::Ref)       || 
                                                (current->spec & Entry::Value)     || 
-                                               insidePHP || insideCS || insideD || insideObjC
+                                               insidePHP || insideCS || insideD || insideObjC || insideIDL
                                               )
                                              baseProt=Public;
                                            else
@@ -5263,6 +5546,7 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                            current->program+=yytext;
                                             current->fileName = yyFileName ;
                                            current->startLine = yyLineNr ;
+                                           current->startColumn = yyColNr;
                                            curlyCount=0;
                                            BEGIN( ReadBodyIntf );
                                          }
@@ -5281,6 +5565,7 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                            current->program+=yytext;
                                             current->fileName = yyFileName ;
                                            current->startLine = yyLineNr ;
+                                           current->startColumn = yyColNr;
                                            curlyCount=0;
                                            BEGIN( ReadBodyIntf );
                                          }
@@ -5288,6 +5573,7 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
 <CompoundName,ClassVar>{B}*"{"{B}*     { 
                                           current->fileName = yyFileName ;
                                          current->startLine = yyLineNr ;
+                                         current->startColumn = yyColNr;
                                          current->name = removeRedundantWhiteSpace(current->name);
                                          if (current->name.isEmpty() && !isTypedef) // anonymous compound
                                          {
@@ -5510,7 +5796,7 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                          }
                                          if ((current->spec & (Entry::Interface|Entry::Struct)) || 
                                              insideJava || insidePHP || insideCS || 
-                                             insideD || insideObjC)
+                                             insideD || insideObjC || insideIDL)
                                          {
                                            baseProt=Public;
                                          }
@@ -5543,6 +5829,7 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                        }
 <Bases>{B}*"{"{B}*                     { current->fileName = yyFileName ;
                                          current->startLine = yyLineNr ;
+                                         current->startColumn = yyColNr;
                                          current->name = removeRedundantWhiteSpace(current->name);
                                          if (!baseName.isEmpty())
                                            current->extends->append(
@@ -5610,7 +5897,11 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                          docBlockContext   = YY_START;
                                          docBlockInBody    = YY_START==SkipCurly;
                                          docBlockAutoBrief = Config_getBool("QT_AUTOBRIEF");
-                                         docBlock.resize(0);
+
+                                          QCString indent;
+                                          indent.fill(' ',computeIndent(yytext,g_column));
+                                          docBlock=indent;
+
                                          if (docBlockAutoBrief)
                                          {
                                            current->briefLine = yyLineNr;
@@ -5657,7 +5948,11 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                          docBlockContext   = YY_START;
                                          docBlockInBody    = YY_START==SkipCurly;
                                          docBlockAutoBrief = FALSE;
-                                         docBlock.resize(0);
+
+                                          QCString indent;
+                                          indent.fill(' ',computeIndent(yytext,g_column));
+                                          docBlock=indent;
+
                                          startCommentBlock(current->brief.isEmpty());
                                          BEGIN( DocLine );
                                        }
@@ -5671,7 +5966,9 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                          docBlockContext   = YY_START;
                                          docBlockInBody    = YY_START==SkipCurly;
                                          docBlockAutoBrief = FALSE;
-                                         docBlock.resize(0);
+                                          QCString indent;
+                                          indent.fill(' ',computeIndent(yytext,g_column));
+                                          docBlock=indent;
                                          startCommentBlock(current->brief.isEmpty());
                                          BEGIN( DocLine );
                                        }
@@ -5700,6 +5997,13 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                            curlyCount=0;
                                            BEGIN( CSAccessorDecl );
                                          }
+                                         else if (insideIDL && (current->spec & Entry::Attribute))
+                                         {
+                                           // UNO IDL: attributes may have setter and getter
+                                           // exception specifications
+                                           current->exception = " {";
+                                           BEGIN(UNOIDLAttributeBlock);
+                                         }
                                          else
                                          {
                                            if ((insideJava || insideCS || insideD) &&
@@ -5774,6 +6078,10 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                           docBlock.resize(docBlock.length() - 3);
                                            lineCount();
                                         }
+<DocLine>{B}*"///"[/]+{B}*/"\n"                { // ignore marker line (see bug700345)
+                                         handleCommentBlock(docBlock.data(),current->brief.isEmpty());
+                                         BEGIN( docBlockContext );
+                                       }
 <DocLine>[^\n]*/"\n"                   { // whole line
                                          docBlock+=yytext;
                                          handleCommentBlock(docBlock.data(),current->brief.isEmpty());
@@ -5786,6 +6094,12 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                          handleCommentBlock(docBlock.data(),FALSE);
                                          BEGIN(docBlockContext);
                                        }
+<DocBlock>^{B}*"*"+/[^/]               { 
+
+                                          QCString indent;
+                                          indent.fill(' ',computeIndent(yytext,g_column));
+                                          docBlock+=indent;
+                                       }
 <DocBlock>^{B}*("//")?{B}*"*"+/[^//a-z_A-Z0-9*]        { // start of a comment line
                                           QCString indent;
                                           indent.fill(' ',computeIndent(yytext,g_column));
@@ -5810,18 +6124,26 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                          {
                                            docBlockName.at(1)='}';
                                          }
+                                          g_fencedSize=0;
                                          BEGIN(DocCopyBlock);
                                         }
 <DocBlock>"<"{PRE}">"                  {
                                           docBlock+=yytext;
                                          docBlockName="<pre>";
+                                          g_fencedSize=0;
                                          BEGIN(DocCopyBlock);
                                        }
 <DocBlock>{CMD}("verbatim"|"latexonly"|"htmlonly"|"xmlonly"|"manonly"|"dot"|"code")/[^a-z_A-Z0-9]      { // verbatim command (which could contain nested comments!)
                                           docBlock+=yytext;
                                          docBlockName=&yytext[1];
+                                          g_fencedSize=0;
                                          BEGIN(DocCopyBlock);
                                        }
+<DocBlock>"~~~"[~]*                     {
+                                          docBlock+=yytext;
+                                          g_fencedSize=yyleng;
+                                          BEGIN(DocCopyBlock);
+                                        }
 <DocBlock>{B}*"<code>"                  {
                                          if (insideCS)
                                          {
@@ -5834,7 +6156,7 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                            REJECT;
                                          }
                                        }
-<DocBlock>[^@*\/\\\n]+                 { // any character that isn't special
+<DocBlock>[^@*~\/\\\n]+                        { // any character that isn't special
                                          docBlock+=yytext;
                                        }
 <DocBlock>\n                           { // newline
@@ -5865,7 +6187,7 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                          docBlock+=yytext;
                                          BEGIN(DocBlock);
                                        }
-<DocCopyBlock>[\\@]("endverbatim"|"endlatexonly"|"endhtmlonly"|"endxmlonly"|"endmanonly"|"enddot"|"endcode")/[^a-z_A-Z0-9] { // end of verbatim block
+<DocCopyBlock>[\\@]("endverbatim"|"endlatexonly"|"endhtmlonly"|"endxmlonly"|"enddocbookonly"|"endmanonly"|"enddot"|"endcode")/[^a-z_A-Z0-9] { // end of verbatim block
                                          docBlock+=yytext;
                                          if (&yytext[4]==docBlockName)
                                          {
@@ -5877,6 +6199,10 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                          {
                                            REJECT;
                                          }
+                                         else if (docBlockName=="code")
+                                         {
+                                           REJECT;
+                                         }
                                           else
                                           {
                                             QCString indent;
@@ -5884,7 +6210,26 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                             docBlock+=indent;
                                           }
                                        }
-<DocCopyBlock>[^\<@/*\]\$\\\n]+                { // any character that is not special
+<DocCopyBlock>^{B}*"*"+/{BN}*          { // start of a comment line
+                                         if (docBlockName=="code")
+                                          {
+                                            QCString indent;
+                                            indent.fill(' ',computeIndent(yytext,0));
+                                            docBlock+=indent;
+                                          }
+                                          else
+                                         {
+                                           REJECT;
+                                         }
+                                       }
+<DocCopyBlock>"~~~"[~]*                 {
+                                          docBlock+=yytext;
+                                          if (g_fencedSize==yyleng)
+                                          {
+                                            BEGIN(DocBlock);
+                                          }
+                                        }
+<DocCopyBlock>[^\<@/*\]~\$\\\n]+       { // any character that is not special
                                          docBlock+=yytext;
                                        }
 <DocCopyBlock>"/*"|"*/"|"//"           {
@@ -5899,7 +6244,7 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                        }
 <DocCopyBlock><<EOF>>                  {
                                          warn(yyFileName,yyLineNr,
-                                             "warning: reached end of file while inside a %s block!\n"
+                                             "reached end of file while inside a %s block!\n"
                                              "The command that should end the block seems to be missing!\n",
                                              docBlockName.data());
                                          yyterminate();
@@ -6174,7 +6519,6 @@ static void handleParametersCommentBlocks(ArgumentList *al)
 static void parseCompounds(Entry *rt)
 {
   //printf("parseCompounds(%s)\n",rt->name.data());
-  g_inputFromFile = FALSE;
   EntryListIterator eli(*rt->children());
   Entry *ce;
   for (;(ce=eli.current());++eli)
@@ -6198,19 +6542,19 @@ static void parseCompounds(Entry *rt)
       yyFileName = ce->fileName;
       //setContext();
       yyLineNr = ce->startLine ;
+      yyColNr = ce->startColumn ;
       insideObjC = ce->lang==SrcLangExt_ObjC;
       //printf("---> Inner block starts at line %d objC=%d\n",yyLineNr,insideObjC);
       //current->reset();
       if (current) delete current;
       current = new Entry;
-      initEntry();
       gstat = FALSE;
+      initEntry();
       int ni=ce->name.findRev("::"); if (ni==-1) ni=0; else ni+=2;
       // set default protection based on the compound type
       if( ce->section==Entry::CLASS_SEC ) // class
       {
-
-        if (insidePHP || insideD || insideJS)
+        if (insidePHP || insideD || insideJS || insideIDL)
        {
           current->protection = protection = Public ; 
        }
@@ -6280,14 +6624,16 @@ static void parseCompounds(Entry *rt)
 
 //----------------------------------------------------------------------------
 
-static void parseMain(const char *fileName,const char *fileBuf,Entry *rt)
+static void parseMain(const char *fileName,
+                      const char *fileBuf,
+                      Entry *rt,
+                      bool sameTranslationUnit,
+                      QStrList & filesInSameTranslationUnit)
 {
   initParser();
-  //g_inputFromFile = TRUE;
 
   inputString = fileBuf;
   inputPosition = 0;
-  g_inputFromFile = FALSE;
   g_column = 0;
 
   //anonCount     = 0;  // don't reset per file
@@ -6304,6 +6650,18 @@ static void parseMain(const char *fileName,const char *fileBuf,Entry *rt)
     yyLineNr= 1 ; 
     yyFileName = fileName;
     setContext();
+    bool processWithClang = insideCpp || insideObjC;
+    if (processWithClang)
+    {
+      if (!sameTranslationUnit) // new file
+      {
+        ClangParser::instance()->start(fileName,filesInSameTranslationUnit);
+      }
+      else
+      {
+        ClangParser::instance()->switchToFile(fileName);
+      }
+    }
     rt->lang = language;
     msg("Parsing file %s...\n",yyFileName.data());
 
@@ -6337,7 +6695,7 @@ static void parseMain(const char *fileName,const char *fileBuf,Entry *rt)
 
     if (YY_START==Comment)
     {
-      warn(yyFileName,yyLineNr,"warning: File ended in the middle of a comment block! Perhaps a missing \\endcode?");
+      warn(yyFileName,yyLineNr,"File ended in the middle of a comment block! Perhaps a missing \\endcode?");
     }
 
     //forceEndGroup();
@@ -6361,6 +6719,7 @@ static void parseMain(const char *fileName,const char *fileBuf,Entry *rt)
     inputFile.close();
 
     anonNSCount++;
+
   }
 }
 
@@ -6374,24 +6733,25 @@ static void parsePrototype(const QCString &text)
     warn(yyFileName,yyLineNr,"Empty prototype found!");
     return;
   }
+  if (!current) // nothing to store (see bug683516)
+  {
+    return;
+  }
 
   const char *orgInputString;
   int orgInputPosition;
   YY_BUFFER_STATE orgState;
-  bool orgInputFromFile;
   
   // save scanner state
   orgState = YY_CURRENT_BUFFER;
   yy_switch_to_buffer(yy_create_buffer(scanYYin, YY_BUF_SIZE));
   orgInputString = inputString; 
   orgInputPosition = inputPosition;
-  orgInputFromFile = g_inputFromFile;
 
   // set new string
   inputString = text;
   inputPosition = 0;
   g_column = 0;
-  g_inputFromFile = FALSE;
   scanYYrestart( scanYYin );
   BEGIN(Prototype);
   scanYYlex();
@@ -6407,7 +6767,6 @@ static void parsePrototype(const QCString &text)
   yy_delete_buffer(tmpState);
   inputString = orgInputString; 
   inputPosition = orgInputPosition;
-  g_inputFromFile = orgInputFromFile;
 
   //printf("**** parsePrototype end\n");
 }
@@ -6436,10 +6795,28 @@ void scanFreeScanner()
 
 //----------------------------------------------------------------------------
 
-void CLanguageScanner::parseInput(const char *fileName,const char *fileBuf,Entry *root)
+void CLanguageScanner::startTranslationUnit(const char *)
+{
+}
+
+void CLanguageScanner::finishTranslationUnit()
+{
+  bool processWithClang = insideCpp || insideObjC;
+  if (processWithClang)
+  {
+    ClangParser::instance()->finish();
+  }
+}
+
+void CLanguageScanner::parseInput(const char *fileName,
+                                  const char *fileBuf,
+                                  Entry *root,
+                                  bool sameTranslationUnit,
+                                  QStrList & filesInSameTranslationUnit)
 {
   g_thisParser = this;
-  ::parseMain(fileName,fileBuf,root);
+  ::parseMain(fileName,fileBuf,root,
+              sameTranslationUnit,filesInSameTranslationUnit);
 }
 
 void CLanguageScanner::parseCode(CodeOutputInterface & codeOutIntf,
@@ -6464,7 +6841,8 @@ void CLanguageScanner::parseCode(CodeOutputInterface & codeOutIntf,
 bool CLanguageScanner::needsPreprocessing(const QCString &extension)
 {
   QCString fe=extension.lower();
-  return 
+  SrcLangExt lang = getLanguageFromFileName(extension);
+  return (SrcLangExt_Cpp == lang) ||
    !( fe==".java" || fe==".as"  || fe==".d"    || fe==".php" || 
       fe==".php4" || fe==".inc" || fe==".phtml" 
     );
index e467ae0..a77ab21 100644 (file)
@@ -48,7 +48,7 @@
     height:19px;
     background:url('search_m.png') repeat-x;
     border:none;
-    width:116px;
+    width:111px;
     margin-left:20px;
     padding-left:4px;
     color: #909090;
index 9c3b08a..48c4df9 100644 (file)
@@ -48,7 +48,7 @@
 "    height:19px;\n"
 "    background:url('search_m.png') repeat-x;\n"
 "    border:none;\n"
-"    width:116px;\n"
+"    width:111px;\n"
 "    margin-left:20px;\n"
 "    padding-left:4px;\n"
 "    color: #909090;\n"
index fef0f13..0380b33 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -92,7 +92,9 @@ void SearchIndex::setCurrentDoc(Definition *ctx,const char *anchor,bool isSource
   //printf("SearchIndex::setCurrentDoc(%s,%s,%s)\n",name,baseName,anchor);
   QCString url=isSourceFile ? ((FileDef*)ctx)->getSourceFileBase() : ctx->getOutputFileBase();
   url+=Config_getString("HTML_FILE_EXTENSION");
+  QCString baseUrl = url;
   if (anchor) url+=QCString("#")+anchor;  
+  if (!isSourceFile) baseUrl=url;
   QCString name=ctx->qualifiedName();
   if (ctx->definitionType()==Definition::TypeMember)
   {
@@ -164,11 +166,11 @@ void SearchIndex::setCurrentDoc(Definition *ctx,const char *anchor,bool isSource
     }
   }
 
-  int *pIndex = m_url2IdMap.find(url);
+  int *pIndex = m_url2IdMap.find(baseUrl);
   if (pIndex==0)
   {
     ++m_urlIndex;
-    m_url2IdMap.insert(url,new int(m_urlIndex));
+    m_url2IdMap.insert(baseUrl,new int(m_urlIndex));
     m_urls.insert(m_urlIndex,new URL(name,url));
   }
   else
@@ -414,7 +416,7 @@ struct SearchDocEntry
   QCString type;
   QCString name;
   QCString args;
-  QCString tagFile;
+  QCString extId;
   QCString url; 
   GrowBuf  importantText;
   GrowBuf  normalText;
@@ -422,11 +424,7 @@ struct SearchDocEntry
 
 struct SearchIndexExternal::Private
 {
-  Private() : docEntries(257) {}
-  //QFile f;
-  //bool openOk;
-  //FTextStream t;
-  //bool insideDoc;
+  Private() : docEntries(12251) {}
   SDict<SearchDocEntry> docEntries;
   SearchDocEntry *current;
 };
@@ -436,29 +434,11 @@ SearchIndexExternal::SearchIndexExternal() : SearchIndexIntf(External)
   p = new SearchIndexExternal::Private;
   p->docEntries.setAutoDelete(TRUE);
   p->current=0;
-  //p->f.setName(fileName);
-  //p->openOk = p->f.open(IO_WriteOnly);
-  //if (p->openOk) 
-  //{
-  //  p->t.setDevice(&p->f);
-  //  p->t << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" << endl;
-  //  p->t << "<add>" << endl;
-  //  p->insideDoc=FALSE;
-  //}
 }
 
 SearchIndexExternal::~SearchIndexExternal()
 {
-  //if (p->openOk)
-  //{
-  //  if (p->insideDoc)
-  //  {
-  //    p->t << "  </doc>" << endl;
-  //  }
-  //  p->t << "</add>" << endl;
-  //  p->f.close();
-  //  p->openOk=FALSE;
-  //}
+  //printf("p->docEntries.count()=%d\n",p->docEntries.count());
   delete p;
 }
 
@@ -519,13 +499,14 @@ static QCString definitionToName(Definition *ctx)
 
 void SearchIndexExternal::setCurrentDoc(Definition *ctx,const char *anchor,bool isSourceFile)
 {
-  QCString tagFile = stripPath(Config_getString("GENERATE_TAGFILE"));
+  QCString extId = stripPath(Config_getString("EXTERNAL_SEARCH_ID"));
   QCString baseName = isSourceFile ? ((FileDef*)ctx)->getSourceFileBase() : ctx->getOutputFileBase();
   QCString url = baseName + Doxygen::htmlFileExtension;
   if (anchor) url+=QCString("#")+anchor;
-  QCString key = tagFile+";"+url;
+  QCString key = extId+";"+url;
 
   p->current = p->docEntries.find(key);
+  //printf("setCurrentDoc(url=%s,isSourceFile=%d) current=%p\n",url.data(),isSourceFile,p->current);
   if (!p->current)
   {
     SearchDocEntry *e = new SearchDocEntry;
@@ -535,7 +516,7 @@ void SearchIndexExternal::setCurrentDoc(Definition *ctx,const char *anchor,bool
     {
       e->args = ((MemberDef*)ctx)->argsString();
     }
-    e->tagFile = tagFile;
+    e->extId = extId;
     e->url  = url;
     p->current = e;
     p->docEntries.append(key,e);
@@ -573,9 +554,9 @@ void SearchIndexExternal::write(const char *fileName)
       {
         t << "    <field name=\"args\">"     << convertToXML(doc->args) << "</field>" << endl;
       }
-      if (!doc->tagFile.isEmpty())
+      if (!doc->extId.isEmpty())
       {
-        t << "    <field name=\"tag\">"      << convertToXML(doc->tagFile)  << "</field>" << endl;
+        t << "    <field name=\"tag\">"      << convertToXML(doc->extId)  << "</field>" << endl;
       }
       t << "    <field name=\"url\">"      << convertToXML(doc->url)  << "</field>" << endl;
       t << "    <field name=\"keywords\">" << convertToXML(doc->importantText.get())  << "</field>" << endl;
@@ -649,7 +630,7 @@ class SearchIndexList : public SDict< QList<Definition> >
       QList<Definition> *md2=(QList<Definition> *)item2;
       QCString n1 = md1->first()->localName();
       QCString n2 = md2->first()->localName();
-      return stricmp(n1.data(),n2.data());
+      return qstricmp(n1.data(),n2.data());
     }
 };
 
index ddfe384..2ce80e8 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index d3dfc7e..486656d 100644 (file)
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/src/settings.h b/src/settings.h
new file mode 100644 (file)
index 0000000..a9fd128
--- /dev/null
@@ -0,0 +1,12 @@
+#ifndef SETTINGS_H
+#define SETTINGS_H
+
+#define USE_SQLITE3  0
+#define USE_LIBCLANG 0
+
+#define IS_SUPPORTED(x) \
+  ((USE_SQLITE3  && strcmp("USE_SQLITE3",(x))==0)  || \
+   (USE_LIBCLANG && strcmp("USE_LIBCLANG",(x))==0) || \
+  0)
+
+#endif
index 02f1f7b..14a221b 100644 (file)
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/src/sqlite3gen.cpp b/src/sqlite3gen.cpp
new file mode 100644 (file)
index 0000000..931341d
--- /dev/null
@@ -0,0 +1,1361 @@
+/******************************************************************************
+ *
+ * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include "settings.h"
+#include "message.h"
+
+#if USE_SQLITE3
+
+#include "qtbc.h"
+#include "sqlite3gen.h"
+#include "doxygen.h"
+#include "config.h"
+#include "util.h"
+#include "docparser.h"
+#include "language.h"
+
+#include "arguments.h"
+#include "classlist.h"
+#include "filedef.h"
+#include "namespacedef.h"
+#include "filename.h"
+
+#include <qdir.h>
+#include <string.h>
+#include <sqlite3.h>
+
+//#define DBG_CTX(x) printf x
+#define DBG_CTX(x) do { } while(0)
+
+//////////////////////////////////////////////////////
+const char *i_q_includes="INSERT OR REPLACE INTO includes "
+                            "( refid, local, name ) "
+                            "VALUES "
+                            "(:refid,:local,:name )" ;
+const char *c_q_includes="SELECT count(*) from includes where refid=:refid and local=:local and name=:name";
+static sqlite3_stmt *i_s_includes=0;
+static sqlite3_stmt *c_s_includes=0;
+//////////////////////////////////////////////////////
+const char *i_q_innerclass="INSERT OR REPLACE INTO innerclass "
+                            "( refid, prot, name )"
+                            "VALUES "
+                            "(:refid,:prot,:name )";
+static sqlite3_stmt *i_s_innerclass=0;
+//////////////////////////////////////////////////////
+const char *i_q_files="INSERT OR REPLACE INTO files "
+                            "( name )"
+                            "VALUES "
+                            "(:name )";
+const char *id_q_files="SELECT id from files where name=:name";
+static sqlite3_stmt *id_s_files=0;
+static sqlite3_stmt *i_s_files=0;
+//////////////////////////////////////////////////////
+const char *i_q_xrefs="INSERT OR REPLACE INTO xrefs "
+                            "( src, dst, id_file, line, column )"
+                            "VALUES "
+                            "(:src,:dst,:id_file,:line,:column )";
+static sqlite3_stmt *i_s_xrefs=0;
+//////////////////////////////////////////////////////
+const char *i_q_memberdef="INSERT OR REPLACE INTO memberdef "
+                            "( refid, prot, static, const, explicit, inline, final, sealed, new, optional, required, virt, mutable, initonly, readable, writable, gettable, settable, accessor, addable, removable, raisable, name, type, definition, argsstring, scope, kind, id_bfile, bline, bcolumn, id_file, line, column)"
+                            "VALUES "
+                            "(:refid,:prot,:static,:const,:explicit,:inline,:final,:sealed,:new,:optional,:required,:virt,:mutable,:initonly,:readable,:writable,:gettable,:settable,:accessor,:addable,:removable,:raisable,:name,:type,:definition,:argsstring,:scope,:kind,:id_bfile,:bline,:bcolumn,:id_file,:line,:column)";
+const char *id_q_memberdef="SELECT id from memberdef where refid=:refid and id is not null";
+static sqlite3_stmt *id_s_memberdef=0;
+static sqlite3_stmt *i_s_memberdef=0;
+//////////////////////////////////////////////////////
+const char *i_q_compounddef="INSERT OR REPLACE INTO compounddef "
+                            "( name, kind, prot, refid, id_file, line, column ) "
+                            "VALUES "
+                            "(:name,:kind,:prot,:refid,:id_file,:line,:column )";
+static sqlite3_stmt *i_s_compounddef=0;
+//////////////////////////////////////////////////////
+const char *i_q_basecompoundref="INSERT OR REPLACE INTO  basecompoundref "
+                            "( base, derived, refid, prot, virt ) "
+                            "VALUES "
+                            "(:base,:derived,:refid,:prot,:virt )" ;
+static sqlite3_stmt *i_s_basecompoundref=0;
+//////////////////////////////////////////////////////
+const char *i_q_derivedcompoundref="INSERT OR REPLACE INTO  derivedcompoundref "
+                            "( refid, prot, virt, base, derived ) "
+                            "VALUES "
+                            "(:refid,:prot,:virt,:base,:derived )" ;
+static sqlite3_stmt *i_s_derivedcompoundref=0;
+//////////////////////////////////////////////////////
+
+const char * schema_queries[][2] = 
+{
+  {
+    "compounddef",
+    "CREATE TABLE IF NOT EXISTS compounddef ("
+      "id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,"
+      "name TEXT NOT NULL,"
+      "kind TEXT NOT NULL,"
+      "prot INTEGER NOT NULL,"
+      "refid TEXT NOT NULL,"
+      "id_file INTEGER NOT NULL,"
+      "line INTEGER NOT NULL,"
+      "column INTEGER NOT NULL)"
+  },
+  {
+    "basecompoundref",
+    "CREATE TABLE IF NOT EXISTS basecompoundref ("
+      "id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "
+      "base TEXT NOT NULL,"
+      "derived TEXT NOT NULL,"
+      "refid TEXT NOT NULL,"
+      "prot INTEGER NOT NULL,"
+      "virt INTEGER NOT NULL)"
+  },
+  {
+    "derivedcompoundref",
+    "CREATE TABLE IF NOT EXISTS derivedcompoundref ("
+      "id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "
+      "base TEXT NOT NULL,"
+      "derived TEXT NOT NULL,"
+      "refid TEXT NOT NULL,"
+      "prot INTEGER NOT NULL,"
+      "virt INTEGER NOT NULL)"
+  },
+  {
+    "includes",
+    "CREATE TABLE IF NOT EXISTS includes ("
+      "id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "
+      "refid TEXT NOT NULL,"
+      "local INTEGER NOT NULL,"
+      "name TEXT NOT NULL)"
+  },
+  {
+    "innerclass",
+    "CREATE TABLE IF NOT EXISTS innerclass ("
+      "id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "
+      "refid TEXT NOT NULL,"
+      "prot INTEGER NOT NULL,"
+      "name TEXT NOT NULL)"
+  },
+  {
+    "files",
+    "CREATE TABLE IF NOT EXISTS files ("
+    "id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "
+    "name TEXT NOT NULL)"
+  },
+  {
+    "xrefs",
+    "CREATE TABLE IF NOT EXISTS xrefs ("
+    "id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "
+    "src TEXT NOT NULL, "
+    "dst TEXT NOT NULL, "
+    "id_file INTEGER NOT NULL, "
+    "line INTEGER, "
+    "column INTEGER)"
+  },
+  {
+    "memberdef",
+    "CREATE TABLE IF NOT EXISTS memberdef ("
+      "id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "
+      "name TEXT NOT NULL,"
+      "definition TEXT,"
+      "type TEXT,"
+      "argsstring TEXT,"
+      "scope TEXT,"
+      "prot INTEGER NOT NULL,"
+      "static INTEGER NOT NULL,"
+      "const INTEGER,"
+      "explicit INTEGER,"
+      "inline INTEGER,"
+      "final INTEGER,"
+      "sealed INTEGER,"
+      "new INTEGER,"
+      "optional INTEGER,"
+      "required INTEGER,"
+      "virt INTEGER,"
+      "mutable INTEGER,"
+      "initonly INTEGER,"
+      "readable INTEGER,"
+      "writable INTEGER,"
+      "gettable INTEGER,"
+      "settable INTEGER,"
+      "accessor INTEGER,"
+      "addable INTEGER,"
+      "removable INTEGER,"
+      "raisable INTEGER,"
+      "kind INTEGER,"
+      "refid TEXT NOT NULL,"
+      "id_bfile INTEGER,"
+      "bline INTEGER,"
+      "bcolumn INTEGER,"
+      "id_file INTEGER NOT NULL,"
+      "line INTEGER NOT NULL,"
+      "column INTEGER NOT NULL)"
+  },
+};
+
+
+class TextGeneratorSqlite3Impl : public TextGeneratorIntf
+{
+  public:
+    TextGeneratorSqlite3Impl(StringList &l) : l(l) {
+      l.setAutoDelete(TRUE);
+    }
+    void writeString(const char * /*s*/,bool /*keepSpaces*/) const
+    {
+    }
+    void writeBreak(int) const
+    {
+      DBG_CTX(("writeBreak\n"));
+    }
+    void writeLink(const char * /*extRef*/,const char *file,
+                   const char *anchor,const char * /*text*/
+                  ) const
+    {
+      QCString *rs=new QCString(file);
+      if (anchor)
+      {
+        rs->append("_1").append(anchor);
+      }
+      l.append(rs);
+    }
+  private:
+    StringList &l;
+    // the list is filled by linkifyText and consumed by the caller
+};
+
+static void generateSqlite3ForMember(sqlite3*db,MemberDef *md,Definition *def);
+
+
+static void bindTextParameter(sqlite3_stmt *stmt,const char *name,const char *value)
+{
+  int idx = sqlite3_bind_parameter_index(stmt, name);
+  sqlite3_bind_text(id_s_files, idx, value, -1, SQLITE_STATIC);
+}
+
+static void bindIntParameter(sqlite3_stmt *stmt,const char *name,int value)
+{
+  int idx = sqlite3_bind_parameter_index(stmt, name);
+  sqlite3_bind_int(stmt, idx, value);
+}
+
+static int step(sqlite3 *db, sqlite3_stmt *stmt,bool getRowId=FALSE)
+{
+  int id=-1;
+  int rc = sqlite3_step(stmt);
+  if (rc!=SQLITE_DONE && rc!=SQLITE_ROW) 
+  {
+    msg("failed count files: %s\n", sqlite3_errmsg(db));
+  }
+  if (getRowId) id = sqlite3_column_int(stmt, 0);
+  sqlite3_reset(stmt);
+  return id;
+}
+
+#if 0
+static QCString memberOutputFileBase(MemberDef *md)
+{
+  //static bool inlineGroupedClasses = Config_getBool("INLINE_GROUPED_CLASSES");
+  //if (inlineGroupedClasses && md->getClassDef() && md->getClassDef()->partOfGroups()!=0)
+  //  return md->getClassDef()->getXmlOutputFileBase();
+  //else
+  //  return md->getOutputFileBase();
+  return md->getOutputFileBase();
+}
+#endif
+
+static int insertFile(sqlite3 *db, const char* name)
+{
+  int id=-1;
+  if (name==0) return -1;
+  // see if it's already in DB
+
+  bindTextParameter(id_s_files,":name",name);
+  id=step(db,i_s_files,TRUE);
+  if (id==0)
+  {
+    // insert it
+    bindTextParameter(i_s_files,":name",name);
+
+    step(db,i_s_files);
+    id=sqlite3_last_insert_rowid(db);
+  }
+  return id;
+}
+
+static void insertMemberReference(sqlite3 *db, const char*src, const char*dst, const char *file, int line, int column)
+{
+#if 0
+  QCString scope = dst->getScopeString();
+  QCString src_name = src->name();
+  QCString dst_name = dst->name();
+  if (!dst->getScopeString().isEmpty() && dst->getScopeString()!=def->name())
+  {
+    dst_name.prepend(scope+getLanguageSpecificSeparator(dst->getLanguage()));
+  }
+  if (!src->getScopeString().isEmpty() && src->getScopeString()!=def->name())
+  {
+    src_name.prepend(scope+getLanguageSpecificSeparator(src->getLanguage()));
+  }
+#endif
+    //
+  bindTextParameter(i_s_xrefs,":src",src);
+  bindTextParameter(i_s_xrefs,":dst",dst);
+
+  int id_file = insertFile(db,file);
+
+  bindIntParameter(i_s_xrefs,":id_file",id_file);
+  bindIntParameter(i_s_xrefs,":line",line);
+  bindIntParameter(i_s_xrefs,":column",column);
+
+  step(db,i_s_xrefs);
+}
+
+static void insertMemberReference(sqlite3 *db, MemberDef *src, MemberDef *dst, const char*floc)
+{
+  if (dst->getStartBodyLine()!=-1 && dst->getBodyDef())
+  {
+    char file[4096] = { 0 };
+    int line=0,column=0;
+    if (floc)
+    {
+      sscanf(floc,"%[^:]:%d:%d",file,&line,&column);
+    }
+    insertMemberReference(db,src->anchor().data(),dst->anchor().data(),file,line,column);
+  }
+}
+
+static void stripQualifiers(QCString &typeStr)
+{
+  bool done=FALSE;
+  while (!done)
+  {
+    if      (typeStr.stripPrefix("static "));
+    else if (typeStr.stripPrefix("virtual "));
+    else if (typeStr.stripPrefix("volatile "));
+    else if (typeStr=="virtual") typeStr="";
+    else done=TRUE;
+  }
+}
+
+////////////////////////////////////////////
+static void writeInnerClasses(sqlite3*db,const ClassSDict *cl)
+{
+  if (!cl) return;
+
+  ClassSDict::Iterator cli(*cl);
+  ClassDef *cd;
+  for (cli.toFirst();(cd=cli.current());++cli)
+  {
+    if (!cd->isHidden() && cd->name().find('@')==-1) // skip anonymous scopes
+    {
+      bindTextParameter(i_s_innerclass,":refid",cd->getOutputFileBase());
+      bindIntParameter(i_s_innerclass,":prot",cd->protection());
+      bindTextParameter(i_s_innerclass,":name",cd->name());
+      step(db,i_s_innerclass);
+    }
+  }
+}
+
+static void writeInnerNamespaces(sqlite3 * /*db*/,const NamespaceSDict *nl)
+{
+  if (nl)
+  {
+    NamespaceSDict::Iterator nli(*nl);
+    NamespaceDef *nd;
+    for (nli.toFirst();(nd=nli.current());++nli)
+    {
+      if (!nd->isHidden() && nd->name().find('@')==-1) // skip anonymouse scopes
+      {
+//        t << "    <innernamespace refid=\"" << nd->getOutputFileBase()
+//          << "\">" << convertToXML(nd->name()) << "</innernamespace>" << endl;
+      }
+    }
+  }
+}
+
+static void writeTemplateArgumentList(sqlite3* /*db*/,
+                                      ArgumentList * /*al*/,
+                                      Definition * /*scope*/,
+                                      FileDef * /*fileScope*/,
+                                      int /*indent*/)
+{
+#if 0
+  QCString indentStr;
+  indentStr.fill(' ',indent);
+  if (al)
+  {
+    t << indentStr << "<templateparamlist>" << endl;
+    ArgumentListIterator ali(*al);
+    Argument *a;
+    for (ali.toFirst();(a=ali.current());++ali)
+    {
+      t << indentStr << "  <param>" << endl;
+      if (!a->type.isEmpty())
+      {
+        t << indentStr <<  "    <type>";
+        linkifyText(TextGeneratorXMLImpl(t),scope,fileScope,0,a->type);
+        t << "</type>" << endl;
+      }
+      if (!a->name.isEmpty())
+      {
+        t << indentStr <<  "    <declname>" << a->name << "</declname>" << endl;
+        t << indentStr <<  "    <defname>" << a->name << "</defname>" << endl;
+      }
+      if (!a->defval.isEmpty())
+      {
+        t << indentStr << "    <defval>";
+        linkifyText(TextGeneratorXMLImpl(t),scope,fileScope,0,a->defval);
+        t << "</defval>" << endl;
+      }
+      t << indentStr << "  </param>" << endl;
+    }
+    t << indentStr << "</templateparamlist>" << endl;
+  }
+#endif
+}
+
+static void writeTemplateList(sqlite3*db,ClassDef *cd)
+{
+  writeTemplateArgumentList(db,cd->templateArguments(),cd,0,4);
+}
+
+static void generateSqlite3Section(sqlite3*db,
+                      Definition *d,
+                      MemberList *ml,const char * /*kind*/,const char * /*header*/=0,
+                      const char * /*documentation*/=0)
+{
+  if (ml==0) return;
+  MemberListIterator mli(*ml);
+  MemberDef *md;
+  int count=0;
+  for (mli.toFirst();(md=mli.current());++mli)
+  {
+    // namespace members are also inserted in the file scope, but
+    // to prevent this duplication in the XML output, we filter those here.
+    if (d->definitionType()!=Definition::TypeFile || md->getNamespaceDef()==0)
+    {
+      count++;
+    }
+  }
+  if (count==0) return; // empty list
+#if 0
+
+  t << "      <sectiondef kind=\"" << kind << "\">" << endl;
+  if (header)
+  {
+    t << "      <header>" << convertToXML(header) << "</header>" << endl;
+  }
+  if (documentation)
+  {
+    t << "      <description>";
+    writeXMLDocBlock(t,d->docFile(),d->docLine(),d,0,documentation);
+    t << "</description>" << endl;
+  }
+#endif
+  for (mli.toFirst();(md=mli.current());++mli)
+  {
+    // namespace members are also inserted in the file scope, but
+    // to prevent this duplication in the XML output, we filter those here.
+    //if (d->definitionType()!=Definition::TypeFile || md->getNamespaceDef()==0)
+    {
+      generateSqlite3ForMember(db,md,d);
+    }
+  }
+  //t << "      </sectiondef>" << endl;
+}
+
+static int prepareStatements(sqlite3 *db)
+{
+  int rc;
+  rc = sqlite3_prepare_v2(db,id_q_memberdef,-1,&id_s_memberdef,0);
+  if (rc!=SQLITE_OK) 
+  {
+    msg("prepare failed for %s\n%s\n", id_q_memberdef, sqlite3_errmsg(db));
+    return -1;
+  }
+  rc = sqlite3_prepare_v2(db,id_q_files,-1,&id_s_files,0);
+  if (rc!=SQLITE_OK) 
+  {
+    msg("prepare failed for %s\n%s\n", id_q_files, sqlite3_errmsg(db));
+    return -1;
+  }
+  rc = sqlite3_prepare_v2(db,i_q_files,-1,&i_s_files,0);
+  if (rc!=SQLITE_OK) 
+  {
+    msg("prepare failed for %s\n%s\n",i_q_files,sqlite3_errmsg(db));
+    return -1;
+  }
+  rc = sqlite3_prepare_v2(db,i_q_xrefs,-1,&i_s_xrefs,0);
+  if (rc!=SQLITE_OK) 
+  {
+    msg("prepare failed for %s\n%s\n", i_q_xrefs, sqlite3_errmsg(db));
+    return -1;
+  }
+  rc = sqlite3_prepare_v2(db, i_q_innerclass, -1, &i_s_innerclass, 0);
+  if (rc!=SQLITE_OK) 
+  {
+    msg("prepare failed for %s\n%s\n", i_q_innerclass, sqlite3_errmsg(db));
+    return -1;
+  }
+  rc = sqlite3_prepare_v2(db,i_q_memberdef,-1,&i_s_memberdef,0);
+  if (rc!=SQLITE_OK) 
+  {
+    msg("prepare failed for %s\n%s\n",i_q_memberdef,sqlite3_errmsg(db));
+    return -1;
+  }
+  rc = sqlite3_prepare_v2(db,i_q_compounddef,-1,&i_s_compounddef,0);
+  if (rc!=SQLITE_OK) 
+  {
+    msg("prepare failed for %s\n%s\n",i_q_compounddef,sqlite3_errmsg(db));
+    return -1;
+  }
+  rc = sqlite3_prepare_v2(db,i_q_basecompoundref,-1,&i_s_basecompoundref,0);
+  if (rc!=SQLITE_OK) 
+  {
+    msg("prepare failed for %s\n%s\n",i_q_basecompoundref,sqlite3_errmsg(db));
+    return -1;
+  }
+  rc = sqlite3_prepare_v2(db,i_q_derivedcompoundref,-1,&i_s_derivedcompoundref,0);
+  if (rc!=SQLITE_OK) 
+  {
+    msg("prepare failed for %s\n%s\n",i_q_derivedcompoundref,sqlite3_errmsg(db));
+    return -1;
+  }
+  rc = sqlite3_prepare_v2(db, i_q_includes, -1, &i_s_includes, 0);
+  if (rc!=SQLITE_OK) 
+  {
+    msg("prepare failed for %s\n%s\n", i_q_includes, sqlite3_errmsg(db));
+    return -1;
+  }
+  rc = sqlite3_prepare_v2(db, c_q_includes, -1, &c_s_includes, 0);
+  if (rc!=SQLITE_OK) 
+  {
+    msg("prepare failed for %s\n%s\n", c_q_includes, sqlite3_errmsg(db));
+    return -1;
+  }
+  return 0;
+}
+
+static void beginTransaction(sqlite3 *db)
+{
+  char * sErrMsg = 0;
+  sqlite3_exec(db, "BEGIN TRANSACTION", NULL, NULL, &sErrMsg);
+}
+
+static void endTransaction(sqlite3 *db)
+{
+  char * sErrMsg = 0;
+  sqlite3_exec(db, "END TRANSACTION", NULL, NULL, &sErrMsg);
+}
+
+static void pragmaTuning(sqlite3 *db)
+{
+  char * sErrMsg = 0;
+  sqlite3_exec(db, "PRAGMA synchronous = OFF", NULL, NULL, &sErrMsg);
+  sqlite3_exec(db, "PRAGMA journal_mode = MEMORY", NULL, NULL, &sErrMsg);
+}
+
+static void initializeSchema(sqlite3* db) 
+{
+  int rc;
+  sqlite3_stmt *stmt = 0;
+
+  msg("Initializing DB schema...\n");
+  for (unsigned int k = 0; k < sizeof(schema_queries) / sizeof(schema_queries[0]); k++) 
+  {
+    //const char *tname = schema_queries[k][0];
+    const char *q = schema_queries[k][1];
+    // create table
+    rc = sqlite3_prepare_v2(db, q, -1, &stmt, 0);
+    if (rc != SQLITE_OK) 
+    {
+      msg("failed to prepare query: %s\n\t%s\n", q, sqlite3_errmsg(db));
+      exit(-1);
+    }
+    rc = sqlite3_step(stmt);
+    if (rc != SQLITE_DONE) 
+    {
+      msg("failed to execute query: %s\n\t%s\n", q, sqlite3_errmsg(db));
+      exit(-1);
+    }
+    sqlite3_finalize(stmt);
+
+  }
+}
+
+//////////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////
+
+static void generateSqlite3ForNamespace(sqlite3 *db, NamespaceDef *nd)
+{
+  // + contained class definitions
+  // + contained namespace definitions
+  // + member groups
+  // + normal members
+  // + brief desc
+  // + detailed desc
+  // + location
+  // - files containing (parts of) the namespace definition
+
+  if (nd->isReference() || nd->isHidden()) return; // skip external references
+#if 0
+  ti << "  <compound refid=\"" << nd->getOutputFileBase()
+     << "\" kind=\"namespace\"" << "><name>"
+     << convertToXML(nd->name()) << "</name>" << endl;
+
+  QCString outputDirectory = Config_getString("XML_OUTPUT");
+  QCString fileName=outputDirectory+"/"+nd->getOutputFileBase()+".xml";
+  QFile f(fileName);
+  if (!f.open(IO_WriteOnly))
+  {
+    err("Cannot open file %s for writing!\n",fileName.data());
+    return;
+  }
+  FTextStream t(&f);
+  //t.setEncoding(FTextStream::UnicodeUTF8);
+
+  writeXMLHeader(t);
+  t << "  <compounddef id=\""
+    << nd->getOutputFileBase() << "\" kind=\"namespace\">" << endl;
+  t << "    <compoundname>";
+  writeXMLString(t,nd->name());
+  t << "</compoundname>" << endl;
+#endif
+  writeInnerClasses(db,nd->getClassSDict());
+  writeInnerNamespaces(db,nd->getNamespaceSDict());
+
+  if (nd->getMemberGroupSDict())
+  {
+    MemberGroupSDict::Iterator mgli(*nd->getMemberGroupSDict());
+    MemberGroup *mg;
+    for (;(mg=mgli.current());++mgli)
+    {
+      generateSqlite3Section(db,nd,mg->members(),"user-defined",mg->header(),
+          mg->documentation());
+    }
+  }
+
+  QListIterator<MemberList> mli(nd->getMemberLists());
+  MemberList *ml;
+  for (mli.toFirst();(ml=mli.current());++mli)
+  {
+    if ((ml->listType()&MemberListType_declarationLists)!=0)
+    {
+      generateSqlite3Section(db,nd,ml,"user-defined");//g_xmlSectionMapper.find(ml->listType()));
+    }
+  }
+#if 0
+  generateXMLSection(nd,ti,t,&nd->decDefineMembers,"define");
+  generateXMLSection(nd,ti,t,&nd->decProtoMembers,"prototype");
+  generateXMLSection(nd,ti,t,&nd->decTypedefMembers,"typedef");
+  generateXMLSection(nd,ti,t,&nd->decEnumMembers,"enum");
+  generateXMLSection(nd,ti,t,&nd->decFuncMembers,"func");
+  generateXMLSection(nd,ti,t,&nd->decVarMembers,"var");
+
+  t << "    <briefdescription>" << endl;
+  writeXMLDocBlock(t,nd->briefFile(),nd->briefLine(),nd,0,nd->briefDescription());
+  t << "    </briefdescription>" << endl;
+  t << "    <detaileddescription>" << endl;
+  writeXMLDocBlock(t,nd->docFile(),nd->docLine(),nd,0,nd->documentation());
+  t << "    </detaileddescription>" << endl;
+  t << "    <location file=\""
+    << nd->getDefFileName() << "\" line=\""
+    << nd->getDefLine() << "\"" << " column=\""
+    << nd->getDefColumn() << "\"/>" << endl ;
+  t << "  </compounddef>" << endl;
+  t << "</doxygen>" << endl;
+
+  ti << "  </compound>" << endl;
+#endif
+}
+
+
+static void generateSqlite3ForFile(sqlite3 *db, FileDef *fd)
+{
+  // + includes files
+  // + includedby files
+  // + include graph
+  // + included by graph
+  // + contained class definitions
+  // + contained namespace definitions
+  // + member groups
+  // + normal members
+  // + brief desc
+  // + detailed desc
+  // + source code
+  // + location
+  // - number of lines
+
+  if (fd->isReference()) return; // skip external references
+#if 0
+  ti << "  <compound refid=\"" << fd->getOutputFileBase()
+     << "\" kind=\"file\"><name>" << convertToXML(fd->name())
+     << "</name>" << endl;
+
+  QCString outputDirectory = Config_getString("XML_OUTPUT");
+  QCString fileName=outputDirectory+"/"+fd->getOutputFileBase()+".xml";
+  QFile f(fileName);
+  if (!f.open(IO_WriteOnly))
+  {
+    err("Cannot open file %s for writing!\n",fileName.data());
+    return;
+  }
+  FTextStream t(&f);
+  //t.setEncoding(FTextStream::UnicodeUTF8);
+
+  writeXMLHeader(t);
+  t << "  <compounddef id=\""
+    << fd->getOutputFileBase() << "\" kind=\"file\">" << endl;
+  t << "    <compoundname>";
+  writeXMLString(t,fd->name());
+  t << "</compoundname>" << endl;
+
+  IncludeInfo *inc;
+
+  if (fd->includeFileList())
+  {
+    QListIterator<IncludeInfo> ili1(*fd->includeFileList());
+    for (ili1.toFirst();(inc=ili1.current());++ili1)
+    {
+      t << "    <includes";
+      if (inc->fileDef && !inc->fileDef->isReference()) // TODO: support external references
+      {
+        t << " refid=\"" << inc->fileDef->getOutputFileBase() << "\"";
+      }
+      t << " local=\"" << (inc->local ? "yes" : "no") << "\">";
+      t << inc->includeName;
+      t << "</includes>" << endl;
+    }
+  }
+
+  if (fd->includedByFileList())
+  {
+    QListIterator<IncludeInfo> ili2(*fd->includedByFileList());
+    for (ili2.toFirst();(inc=ili2.current());++ili2)
+    {
+      t << "    <includedby";
+      if (inc->fileDef && !inc->fileDef->isReference()) // TODO: support external references
+      {
+        t << " refid=\"" << inc->fileDef->getOutputFileBase() << "\"";
+      }
+      t << " local=\"" << (inc->local ? "yes" : "no") << "\">";
+      t << inc->includeName;
+      t << "</includedby>" << endl;
+    }
+  }
+
+  DotInclDepGraph incDepGraph(fd,FALSE);
+  if (!incDepGraph.isTrivial())
+  {
+    t << "    <incdepgraph>" << endl;
+    incDepGraph.writeXML(t);
+    t << "    </incdepgraph>" << endl;
+  }
+
+  DotInclDepGraph invIncDepGraph(fd,TRUE);
+  if (!invIncDepGraph.isTrivial())
+  {
+    t << "    <invincdepgraph>" << endl;
+    invIncDepGraph.writeXML(t);
+    t << "    </invincdepgraph>" << endl;
+  }
+#endif
+  if (fd->getClassSDict())
+  {
+    writeInnerClasses(db,fd->getClassSDict());
+  }
+  if (fd->getNamespaceSDict())
+  {
+    writeInnerNamespaces(db,fd->getNamespaceSDict());
+  }
+
+  if (fd->getMemberGroupSDict())
+  {
+    MemberGroupSDict::Iterator mgli(*fd->getMemberGroupSDict());
+    MemberGroup *mg;
+    for (;(mg=mgli.current());++mgli)
+    {
+      generateSqlite3Section(db,fd,mg->members(),"user-defined",mg->header(),
+          mg->documentation());
+    }
+  }
+
+  QListIterator<MemberList> mli(fd->getMemberLists());
+  MemberList *ml;
+  for (mli.toFirst();(ml=mli.current());++mli)
+  {
+    if ((ml->listType()&MemberListType_declarationLists)!=0)
+    {
+      generateSqlite3Section(db,fd,ml,"user-defined");//g_xmlSectionMapper.find(ml->listType()));
+    }
+  }
+#if 0
+  generateXMLSection(fd,ti,t,fd->decDefineMembers,"define");
+  generateXMLSection(fd,ti,t,fd->decProtoMembers,"prototype");
+  generateXMLSection(fd,ti,t,fd->decTypedefMembers,"typedef");
+  generateXMLSection(fd,ti,t,fd->decEnumMembers,"enum");
+  generateXMLSection(fd,ti,t,fd->decFuncMembers,"func");
+  generateXMLSection(fd,ti,t,fd->decVarMembers,"var");
+#endif
+#if 0
+  t << "    <briefdescription>" << endl;
+  writeXMLDocBlock(t,fd->briefFile(),fd->briefLine(),fd,0,fd->briefDescription());
+  t << "    </briefdescription>" << endl;
+  t << "    <detaileddescription>" << endl;
+  writeXMLDocBlock(t,fd->docFile(),fd->docLine(),fd,0,fd->documentation());
+  t << "    </detaileddescription>" << endl;
+  if (Config_getBool("XML_PROGRAMLISTING"))
+  {
+    t << "    <programlisting>" << endl;
+    writeXMLCodeBlock(t,fd);
+    t << "    </programlisting>" << endl;
+  }
+  t << "    <location file=\"" << fd->getDefFileName() << "\"/>" << endl;
+  t << "  </compounddef>" << endl;
+  t << "</doxygen>" << endl;
+
+  ti << "  </compound>" << endl;
+#endif
+}
+
+
+
+
+static void generateSqlite3ForMember(sqlite3*db,MemberDef *md,Definition *def)
+{
+  // + declaration/definition arg lists
+  // + reimplements
+  // + reimplementedBy
+  // + exceptions
+  // + const/volatile specifiers
+  // - examples
+  // + source definition
+  // + source references
+  // + source referenced by
+  // - body code
+  // + template arguments
+  //     (templateArguments(), definitionTemplateParameterLists())
+  // - call graph
+
+  // enum values are written as part of the enum
+  if (md->memberType()==MemberType_EnumValue) return;
+  if (md->isHidden()) return;
+  //if (md->name().at(0)=='@') return; // anonymous member
+
+  // group members are only visible in their group
+  //if (def->definitionType()!=Definition::TypeGroup && md->getGroupDef()) return;
+  QCString memType;
+#if 0
+  // member
+  idx = sqlite3_bind_parameter_index(stmt, ":refid");
+  sqlite3_bind_text(stmt, idx, memberOutputFileBase(md).data(),-1,SQLITE_TRANSIENT);
+
+  idx = sqlite3_bind_parameter_index(stmt,":kind");
+  sqlite3_bind_int(stmt, idx, md->memberType());
+
+  idx = sqlite3_bind_parameter_index(stmt, ":name");
+  sqlite3_bind_text(stmt, idx, md->name().data(),-1,SQLITE_TRANSIENT);
+#endif
+  // memberdef
+  bindTextParameter(i_s_memberdef,":refid",md->anchor());
+  bindIntParameter(i_s_memberdef,":kind",md->memberType());
+  bindIntParameter(i_s_memberdef,":prot",md->protection());
+  bindIntParameter(i_s_memberdef,":static",md->isStatic());
+
+  bool isFunc=FALSE;
+  switch (md->memberType())
+  {
+    case MemberType_Function: // fall through
+    case MemberType_Signal:   // fall through
+    case MemberType_Friend:   // fall through
+    case MemberType_DCOP:     // fall through
+    case MemberType_Slot:        
+      isFunc=TRUE; 
+      break;
+    default: 
+      break;
+  }
+  if (isFunc)
+  {
+    LockingPtr<ArgumentList> al = md->argumentList();
+    if (al!=0 && al->constSpecifier) 
+    {
+      bindIntParameter(i_s_memberdef,":const",al->constSpecifier);
+    }
+
+    bindIntParameter(i_s_memberdef,":explicit",md->isExplicit());
+    bindIntParameter(i_s_memberdef,":inline",md->isInline());
+    bindIntParameter(i_s_memberdef,":final",md->isFinal());
+    bindIntParameter(i_s_memberdef,":sealed",md->isSealed());
+    bindIntParameter(i_s_memberdef,":new",md->isNew());
+    bindIntParameter(i_s_memberdef,":optional",md->isOptional());
+    bindIntParameter(i_s_memberdef,":required",md->isRequired());
+    bindIntParameter(i_s_memberdef,":virt",md->virtualness());
+  }
+  // place in the arguments and linkify the arguments
+
+  if (md->memberType() == MemberType_Variable)
+  {
+    bindIntParameter(i_s_memberdef,":mutable",md->isMutable());
+    bindIntParameter(i_s_memberdef,":initonly",md->isInitonly());
+  }
+  else if (md->memberType() == MemberType_Property)
+  {
+    bindIntParameter(i_s_memberdef,":readable",md->isReadable());
+    bindIntParameter(i_s_memberdef,":writable",md->isWritable());
+    bindIntParameter(i_s_memberdef,":gettable",md->isGettable());
+    bindIntParameter(i_s_memberdef,":settable",md->isSettable());
+
+    if (md->isAssign() || md->isCopy() || md->isRetain())
+    {
+      int accessor = md->isAssign() ? md->isAssign() :
+          (md->isCopy() ? md->isCopy() : md->isRetain()) ;
+
+      bindIntParameter(i_s_memberdef,":accessor",accessor);
+    }
+  }
+  else if (md->memberType() == MemberType_Event)
+  {
+    bindIntParameter(i_s_memberdef,":addable",md->isAddable());
+    bindIntParameter(i_s_memberdef,":removable",md->isRemovable());
+    bindIntParameter(i_s_memberdef,":raisable",md->isRaisable());
+  }
+
+  if (md->memberType()!=MemberType_Define &&
+      md->memberType()!=MemberType_Enumeration
+     )
+  {
+    QCString typeStr = md->typeString();
+    stripQualifiers(typeStr);
+    StringList l;
+    linkifyText(TextGeneratorSqlite3Impl(l),def,md->getBodyDef(),md,typeStr);
+    if (typeStr.data()) 
+    {
+      bindTextParameter(i_s_memberdef,":type",typeStr);
+    }
+
+    if (md->definition()) 
+    {
+      bindTextParameter(i_s_memberdef,":definition",md->definition());
+    }
+
+    if (md->argsString()) 
+    {
+      bindTextParameter(i_s_memberdef,":argsstring",md->argsString());
+    }
+  }
+
+  bindTextParameter(i_s_memberdef,":name",md->name());
+
+  if (md->memberType() == MemberType_Property)
+  {
+    if (md->isReadable())
+    {
+      DBG_CTX(("<read>\n"));
+    }
+    if (md->isWritable())
+    {
+      DBG_CTX(("<write>\n"));
+    }
+  }
+#if 0
+  if (md->memberType()==MemberType_Variable && md->bitfieldString())
+  {
+    QCString bitfield = md->bitfieldString();
+    if (bitfield.at(0)==':') bitfield=bitfield.mid(1);
+    t << "        <bitfield>" << bitfield << "</bitfield>" << endl;
+  }
+
+  MemberDef *rmd = md->reimplements();
+  if (rmd)
+  {
+    t << "        <reimplements refid=\""
+      << memberOutputFileBase(rmd) << "_1" << rmd->anchor() << "\">"
+      << convertToXML(rmd->name()) << "</reimplements>" << endl;
+  }
+  LockingPtr<MemberList> rbml = md->reimplementedBy();
+  if (rbml!=0)
+  {
+    MemberListIterator mli(*rbml);
+    for (mli.toFirst();(rmd=mli.current());++mli)
+    {
+      t << "        <reimplementedby refid=\""
+        << memberOutputFileBase(rmd) << "_1" << rmd->anchor() << "\">"
+        << convertToXML(rmd->name()) << "</reimplementedby>" << endl;
+    }
+  }
+#endif
+  if (isFunc) //function
+  {
+    LockingPtr<ArgumentList> declAl = md->declArgumentList();
+    LockingPtr<ArgumentList> defAl = md->argumentList();
+    if (declAl!=0 && declAl->count()>0)
+    {
+      ArgumentListIterator declAli(*declAl);
+      ArgumentListIterator defAli(*defAl);
+      Argument *a;
+      for (declAli.toFirst();(a=declAli.current());++declAli)
+      {
+        Argument *defArg = defAli.current();
+        DBG_CTX(("<param>\n"));
+        if (!a->attrib.isEmpty())
+        {
+          DBG_CTX(("<attributes>:%s\n",a->attrib.data()));
+        }
+        if (!a->type.isEmpty())
+        {
+          StringList l;
+          linkifyText(TextGeneratorSqlite3Impl(l),def,md->getBodyDef(),md,a->type);
+
+          QCString *s=l.first();
+          while (s) 
+          {
+            insertMemberReference(db,md->anchor().data(),s->data(),def->getDefFileName().data(),md->getDefLine(),1);
+            s=l.next();
+          }
+        }
+        if (!a->name.isEmpty())
+        {
+          DBG_CTX(("<declname>%s\n",a->name.data()));
+        }
+        if (defArg && !defArg->name.isEmpty() && defArg->name!=a->name)
+        {
+          DBG_CTX(("<defname>%s\n",defArg->name.data()));
+        }
+        if (!a->array.isEmpty())
+        {
+          DBG_CTX(("<array>%s",a->array.data()));
+        }
+        if (!a->defval.isEmpty())
+        {
+          StringList l;
+          linkifyText(TextGeneratorSqlite3Impl(l),def,md->getBodyDef(),md,a->defval);
+        }
+        if (defArg) ++defAli;
+      }
+    }
+  }
+  else if (md->memberType()==MemberType_Define &&
+          md->argsString()) // define
+  {
+    if (md->argumentList()->count()==0) // special case for "foo()" to
+                                        // disguish it from "foo".
+    {
+      DBG_CTX(("no params\n"));
+    }
+    else
+    {
+      ArgumentListIterator ali(*md->argumentList());
+      Argument *a;
+      for (ali.toFirst();(a=ali.current());++ali)
+      {
+        DBG_CTX(("<param><defname>%s\n",a->type.data()));
+      }
+    }
+  }
+
+
+  // Extract references from initializer
+  // avoid that extremely large tables are written to the output.
+  // todo: it's better to adhere to MAX_INITIALIZER_LINES.
+  // drm_mod_register_buffer,
+  if (!md->initializer().isEmpty() && md->initializer().length()<2000)
+  {
+    StringList l;
+    linkifyText(TextGeneratorSqlite3Impl(l),def,md->getBodyDef(),md,md->initializer());
+    QCString *s=l.first();
+    while (s) 
+    {
+      DBG_CTX(("initializer:%s %s %s %d\n",
+              md->anchor().data(),
+              s->data(), 
+              md->getBodyDef()->getDefFileName().data(), 
+              md->getStartBodyLine()));
+      insertMemberReference(db,md->anchor().data(),s->data(),md->getBodyDef()->getDefFileName().data(),md->getStartBodyLine(),1);
+      s=l.next();
+    }
+  }
+
+#if 0
+  if (md->excpString())
+  {
+    linkifyText(TextGeneratorXMLImpl(t),def,md->getBodyDef(),md,md->excpString());
+  }
+#endif
+  if ( md->getScopeString() ) 
+  {
+    bindTextParameter(i_s_memberdef,":scope",md->getScopeString());
+  }
+
+  // File location
+  if (md->getDefLine() != -1)
+  {
+    int id_file = insertFile(db,md->getDefFileName());
+    if (id_file!=-1) 
+    {
+      bindIntParameter(i_s_memberdef,":id_file",id_file);
+      bindIntParameter(i_s_memberdef,":line",md->getDefLine());
+      bindIntParameter(i_s_memberdef,":column",md->getDefColumn());
+
+      if (md->getStartBodyLine()!=-1) 
+      {
+        int id_bfile = insertFile(db,md->getBodyDef()->absFilePath());
+        if (id_bfile == -1) exit(-1);
+        bindIntParameter(i_s_memberdef,":id_ibfile",id_bfile);
+        bindIntParameter(i_s_memberdef,":bline",md->getStartBodyLine());
+
+        // XXX implement getStartBodyColumn
+        bindIntParameter(i_s_memberdef,":bcolumn",1);
+      }
+    }
+  }
+
+
+  step(db,i_s_memberdef);
+  /*int id_src =*/ sqlite3_last_insert_rowid(db);
+
+  // + cross-references
+  // The cross-references in initializers only work when both the src and dst
+  // are defined.
+  LockingPtr<MemberSDict> mdict = md->getReferencesMembers();
+  // references
+  if (mdict!=0)
+  {
+    MemberSDict::IteratorDict mdi(*mdict);
+    MemberDef *rmd;
+    for (mdi.toFirst();(rmd=mdi.current());++mdi)
+    {
+      insertMemberReference(db,md,rmd,mdi.currentKey());
+    }
+  }
+
+  mdict = md->getReferencedByMembers();
+  // referencedby
+  if (mdict!=0)
+  {
+    MemberSDict::IteratorDict mdi(*mdict);
+    MemberDef *rmd;
+    for (mdi.toFirst();(rmd=mdi.current());++mdi)
+    {
+      insertMemberReference(db,rmd,md,mdi.currentKey());
+    }
+  }
+}
+
+static void generateSqlite3ForClass(sqlite3 *db, ClassDef *cd)
+{
+  // + brief description
+  // + detailed description
+  // + template argument list(s)
+  // - include file
+  // + member groups
+  // + inheritance diagram
+  // + list of direct super classes
+  // + list of direct sub classes
+  // + list of inner classes
+  // + collaboration diagram
+  // + list of all members
+  // + user defined member sections
+  // + standard member sections
+  // + detailed member documentation
+  // - examples using the class
+
+  if (cd->isReference())        return; // skip external references.
+  if (cd->isHidden())           return; // skip hidden classes.
+  if (cd->name().find('@')!=-1) return; // skip anonymous compounds.
+  if (cd->templateMaster()!=0)  return; // skip generated template instances.
+
+  msg("Generating Sqlite3 output for class %s\n",cd->name().data());
+
+  //int idx,rc;
+  //sqlite3_stmt *stmt ;
+
+  // + compounddef
+  //stmt = i_s_compounddef;
+
+  bindTextParameter(i_s_compounddef,":name",cd->name());
+  bindTextParameter(i_s_compounddef,":kind",cd->compoundTypeString());
+  bindIntParameter(i_s_compounddef,":prot",cd->protection());
+  bindTextParameter(i_s_compounddef,":refid",cd->getOutputFileBase());
+
+  int id_file = insertFile(db,cd->getDefFileName().data());
+  bindIntParameter(i_s_compounddef,":id_file",id_file);
+  bindIntParameter(i_s_compounddef,":line",cd->getDefLine());
+  bindIntParameter(i_s_compounddef,":column",cd->getDefColumn());
+
+  step(db,i_s_compounddef);
+  sqlite3_int64 id_compound=0 ;
+  id_compound = sqlite3_last_insert_rowid(db);
+
+  // + basecompoundref
+  if (cd->baseClasses())
+  {
+    BaseClassListIterator bcli(*cd->baseClasses());
+    BaseClassDef *bcd;
+    for (bcli.toFirst();(bcd=bcli.current());++bcli)
+    {
+      bindTextParameter(i_s_basecompoundref,":refid",bcd->classDef->getOutputFileBase());
+      bindIntParameter(i_s_basecompoundref,":prot",bcd->prot);
+      bindIntParameter(i_s_basecompoundref,":virt",bcd->virt);
+
+      if (!bcd->templSpecifiers.isEmpty())
+      {
+        bindTextParameter(i_s_basecompoundref,":base",insertTemplateSpecifierInScope(bcd->classDef->name(),bcd->templSpecifiers));
+      }
+      else
+      {
+        bindTextParameter(i_s_basecompoundref,":base",bcd->classDef->displayName());
+      }
+      bindTextParameter(i_s_basecompoundref,":derived",cd->displayName());
+      step(db,i_s_basecompoundref);
+    }
+  }
+
+  // + derivedcompoundref
+  if (cd->subClasses())
+  {
+    BaseClassListIterator bcli(*cd->subClasses());
+    BaseClassDef *bcd;
+    for (bcli.toFirst();(bcd=bcli.current());++bcli)
+    {
+      bindTextParameter(i_s_derivedcompoundref,":base",cd->displayName());
+      bindTextParameter(i_s_derivedcompoundref,":dervied",bcd->classDef->displayName());
+      bindTextParameter(i_s_derivedcompoundref,":refid",bcd->classDef->getOutputFileBase());
+      bindIntParameter(i_s_derivedcompoundref,":prot",bcd->prot);
+      bindIntParameter(i_s_derivedcompoundref,":virt",bcd->virt);
+      step(db,i_s_derivedcompoundref);
+    }
+  }
+
+  ///////////////////////////////////////////////////////////////////
+  // INCLUDEINFO
+  IncludeInfo *ii=cd->includeInfo();
+  if (ii)
+  {
+    QCString nm = ii->includeName;
+    if (nm.isEmpty() && ii->fileDef) nm = ii->fileDef->docName();
+    if (!nm.isEmpty())
+    {
+      bindTextParameter(c_s_includes,":refid",ii->fileDef->getOutputFileBase());
+      bindIntParameter(c_s_includes,":local",ii->local);
+      bindTextParameter(c_s_includes,":name",nm);
+      int count=step(db,c_s_includes,TRUE);
+      if ( count==0 ) 
+      {
+        bindTextParameter(i_s_includes,":refid",ii->fileDef->getOutputFileBase());
+        bindIntParameter(i_s_includes,":local",ii->local);
+        bindTextParameter(i_s_includes,":name",nm);
+        step(db,i_s_includes);
+      }
+    }
+  }
+  ///////////////////////////////////////////////////////////////////
+  writeInnerClasses(db,cd->getClassSDict());
+  writeTemplateList(db,cd);
+
+  if (cd->getMemberGroupSDict())
+  {
+    MemberGroupSDict::Iterator mgli(*cd->getMemberGroupSDict());
+    MemberGroup *mg;
+    for (;(mg=mgli.current());++mgli)
+    {
+      generateSqlite3Section(db,cd,mg->members(),"user-defined",mg->header(),
+          mg->documentation());
+    }
+  }
+
+  QListIterator<MemberList> mli(cd->getMemberLists());
+  MemberList *ml;
+  for (mli.toFirst();(ml=mli.current());++mli)
+  {
+    if ((ml->listType()&MemberListType_detailedLists)==0)
+    {
+      generateSqlite3Section(db,cd,ml,"user-defined");//g_xmlSectionMapper.find(ml->listType()));
+    }
+  }
+}
+
+//////////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////
+void generateSqlite3()
+{
+  // + classes
+  // + namespaces
+  // + files
+  // - groups
+  // - related pages
+  // - examples
+  //QCString outputDirectory = Config_getString("SQLITE3_OUTPUT");
+  QCString outputDirectory = Config_getString("OUTPUT_DIRECTORY");
+  QDir sqlite3Dir(outputDirectory);
+  sqlite3 *db;
+  sqlite3_initialize();
+  int rc = sqlite3_open_v2(outputDirectory+"/doxygen_sqlite3.db", &db, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, 0);
+  if (rc != SQLITE_OK) 
+  {
+    sqlite3_close(db);
+    msg("database open failed: %s\n", "doxygen_sqlite3.db");
+    exit(-1);
+  }
+  beginTransaction(db);
+  pragmaTuning(db);
+
+  initializeSchema(db);
+  if ( -1 == prepareStatements(db) )
+  {
+    err("sqlite generator: prepareStatements failed!");
+    return;
+  }
+
+  // + classes
+  ClassSDict::Iterator cli(*Doxygen::classSDict);
+  ClassDef *cd;
+  for (cli.toFirst();(cd=cli.current());++cli)
+  {
+    msg("Generating Sqlite3 output for class %s\n",cd->name().data());
+    generateSqlite3ForClass(db,cd);
+  }
+
+  // + namespaces
+  NamespaceSDict::Iterator nli(*Doxygen::namespaceSDict);
+  NamespaceDef *nd;
+  for (nli.toFirst();(nd=nli.current());++nli)
+  {
+    msg("Generating Sqlite3 output for namespace %s\n",nd->name().data());
+    generateSqlite3ForNamespace(db,nd);
+  }
+
+  // + files
+  FileNameListIterator fnli(*Doxygen::inputNameList);
+  FileName *fn;
+  for (;(fn=fnli.current());++fnli)
+  {
+    FileNameIterator fni(*fn);
+    FileDef *fd;
+    for (;(fd=fni.current());++fni)
+    {
+      msg("Generating Sqlite3 output for file %s\n",fd->name().data());
+      generateSqlite3ForFile(db,fd);
+    }
+  }
+  endTransaction(db);
+}
+
+#else // USE_SQLITE3
+void generateSqlite3()
+{
+  err("sqlite3 support has not been compiled in!");
+}
+#endif
+
diff --git a/src/sqlite3gen.h b/src/sqlite3gen.h
new file mode 100644 (file)
index 0000000..689f1da
--- /dev/null
@@ -0,0 +1,23 @@
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef SQLITE3GEN_H
+#define SQLITE3GEN_H
+
+void generateSqlite3();
+
+#endif
index 521aa9b..7e5118a 100644 (file)
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 816ce46..d075dc0 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 42dcf68..8b59c05 100644 (file)
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -72,6 +72,7 @@ class TagMemberInfo
     QCString anchor;
     QCString arglist;
     QCString kind;
+    QCString clangId;
     TagAnchorInfoList docAnchors;
     Protection prot;
     Specifier virt;
@@ -87,6 +88,7 @@ class TagClassInfo
    ~TagClassInfo() { delete bases; delete templateArguments; }
     QCString name;
     QCString filename;
+    QCString clangId;
     TagAnchorInfoList docAnchors;
     QList<BaseInfo> *bases;
     QList<TagMemberInfo> members;
@@ -103,6 +105,7 @@ class TagNamespaceInfo
     TagNamespaceInfo() { members.setAutoDelete(TRUE); }
     QCString name;
     QCString filename;
+    QCString clangId;
     QStringList classList;
     QStringList namespaceList;
     TagAnchorInfoList docAnchors;
@@ -335,7 +338,7 @@ class TagFileParser : public QXmlDefaultHandler
       }
       else
       {
-        warn("warning: Unknown compound attribute `%s' found!\n",kind.data());
+        warn("Unknown compound attribute `%s' found!\n",kind.data());
         m_state = Invalid;
       }
       if (isObjC=="yes" && m_curClass)
@@ -363,7 +366,7 @@ class TagFileParser : public QXmlDefaultHandler
         case InPackage:   m_tagFilePackages.append(m_curPackage); 
                           m_curPackage=0; break; 
         default:
-                          warn("warning: tag `compound' was not expected!\n");
+                          warn("tag `compound' was not expected!\n");
       }
     }
 
@@ -409,7 +412,7 @@ class TagFileParser : public QXmlDefaultHandler
         case InNamespace: m_curNamespace->members.append(m_curMember); break;
         case InGroup:     m_curGroup->members.append(m_curMember); break;
         case InPackage:   m_curPackage->members.append(m_curMember); break;
-        default:   warn("warning: Unexpected tag `member' found\n"); break; 
+        default:   warn("Unexpected tag `member' found\n"); break; 
       }
     }
 
@@ -425,7 +428,7 @@ class TagFileParser : public QXmlDefaultHandler
         case InMember:    m_curMember->docAnchors.append(new TagAnchorInfo(m_fileName,m_curString)); break;
         case InPackage:   m_curPackage->docAnchors.append(new TagAnchorInfo(m_fileName,m_curString)); break;
         case InDir:       m_curDir->docAnchors.append(new TagAnchorInfo(m_fileName,m_curString)); break;
-        default:   warn("warning: Unexpected tag `member' found\n"); break; 
+        default:   warn("Unexpected tag `member' found\n"); break; 
       }
     }
 
@@ -438,7 +441,7 @@ class TagFileParser : public QXmlDefaultHandler
         case InNamespace: m_curNamespace->classList.append(m_curString); break;
         case InGroup:     m_curGroup->classList.append(m_curString); break;
         case InPackage:   m_curPackage->classList.append(m_curString); break;
-        default:   warn("warning: Unexpected tag `class' found\n"); break; 
+        default:   warn("Unexpected tag `class' found\n"); break; 
       }
     }
 
@@ -449,7 +452,7 @@ class TagFileParser : public QXmlDefaultHandler
         case InNamespace: m_curNamespace->classList.append(m_curString); break;
         case InFile:      m_curFile->namespaceList.append(m_curString); break;
         case InGroup:     m_curGroup->namespaceList.append(m_curString); break;
-        default:   warn("warning: Unexpected tag `namespace' found\n"); break; 
+        default:   warn("Unexpected tag `namespace' found\n"); break; 
       }
     }
 
@@ -459,7 +462,7 @@ class TagFileParser : public QXmlDefaultHandler
       {
         case InGroup:      m_curGroup->fileList.append(m_curString); break;
         case InDir:        m_curDir->fileList.append(m_curString); break;
-        default:   warn("warning: Unexpected tag `file' found\n"); break; 
+        default:   warn("Unexpected tag `file' found\n"); break; 
       }
     }
 
@@ -468,7 +471,7 @@ class TagFileParser : public QXmlDefaultHandler
       switch(m_state)
       {
         case InGroup:      m_curGroup->fileList.append(m_curString); break;
-        default:   warn("warning: Unexpected tag `page' found\n"); break; 
+        default:   warn("Unexpected tag `page' found\n"); break; 
       }
     }
 
@@ -477,7 +480,7 @@ class TagFileParser : public QXmlDefaultHandler
       switch(m_state)
       {
         case InDir:      m_curDir->subdirList.append(m_curString); break;
-        default:   warn("warning: Unexpected tag `page' found\n"); break; 
+        default:   warn("Unexpected tag `page' found\n"); break; 
       }
     }
 
@@ -501,7 +504,7 @@ class TagFileParser : public QXmlDefaultHandler
       }
       else
       {
-        warn("warning: Unexpected tag `type' found\n");
+        warn("Unexpected tag `type' found\n");
       }
     }
 
@@ -517,7 +520,7 @@ class TagFileParser : public QXmlDefaultHandler
         case InDir:       m_curDir->name       = m_curString; break;
         case InMember:    m_curMember->name    = m_curString; break;
         case InPackage:   m_curPackage->name   = m_curString; break;
-        default: warn("warning: Unexpected tag `name' found\n"); break; 
+        default: warn("Unexpected tag `name' found\n"); break; 
       }
     }
 
@@ -551,7 +554,7 @@ class TagFileParser : public QXmlDefaultHandler
       }
       else
       {
-        warn("warning: Unexpected tag `base' found\n");
+        warn("Unexpected tag `base' found\n");
       }
     }
 
@@ -563,7 +566,7 @@ class TagFileParser : public QXmlDefaultHandler
       }
       else
       {
-        warn("warning: Unexpected tag `base' found\n");
+        warn("Unexpected tag `base' found\n");
       }
     }
 
@@ -580,7 +583,7 @@ class TagFileParser : public QXmlDefaultHandler
       }
       else
       {
-        warn("warning: Unexpected tag `includes' found\n");
+        warn("Unexpected tag `includes' found\n");
       }
       m_curString="";
     }
@@ -603,7 +606,7 @@ class TagFileParser : public QXmlDefaultHandler
       }
       else
       {
-        warn("warning: Unexpected tag `templarg' found\n");
+        warn("Unexpected tag `templarg' found\n");
       }
     }
 
@@ -618,7 +621,7 @@ class TagFileParser : public QXmlDefaultHandler
         case InPage:      m_curPage->filename      = m_curString;    break;
         case InPackage:   m_curPackage->filename   = m_curString;    break;
         case InDir:       m_curDir->filename       = m_curString;    break;
-        default: warn("warning: Unexpected tag `filename' found\n"); break; 
+        default: warn("Unexpected tag `filename' found\n"); break; 
       }
     }
 
@@ -628,7 +631,7 @@ class TagFileParser : public QXmlDefaultHandler
       {
         case InFile:      m_curFile->path          = m_curString;    break;
         case InDir:       m_curDir->path           = m_curString;    break;
-        default: warn("warning: Unexpected tag `path' found\n");     break; 
+        default: warn("Unexpected tag `path' found\n");     break; 
       }
     }
     
@@ -640,9 +643,31 @@ class TagFileParser : public QXmlDefaultHandler
       }
       else
       {
+        warn("Unexpected tag `anchor' found\n");
+      }
+    }
+
+    void endClangId()
+    {
+      if (m_state==InMember)
+      {
+        m_curMember->clangId = m_curString; 
+      }
+      else if (m_state==InClass)
+      {
+        m_curClass->clangId =  m_curString;
+      }
+      else if (m_state==InNamespace)
+      {
+        m_curNamespace->clangId = m_curString;
+      }
+      else
+      {
         warn("warning: Unexpected tag `anchor' found\n");
       }
     }
+
+
     
     void endAnchorFile()
     {
@@ -652,7 +677,7 @@ class TagFileParser : public QXmlDefaultHandler
       }
       else
       {
-        warn("warning: Unexpected tag `anchorfile' found\n");
+        warn("Unexpected tag `anchorfile' found\n");
       }
     }
     
@@ -664,7 +689,7 @@ class TagFileParser : public QXmlDefaultHandler
       }
       else
       {
-        warn("warning: Unexpected tag `arglist' found\n");
+        warn("Unexpected tag `arglist' found\n");
       }
     }
     void endTitle()
@@ -673,7 +698,7 @@ class TagFileParser : public QXmlDefaultHandler
       {
         case InGroup:     m_curGroup->title     = m_curString;    break;
         case InPage:      m_curPage->title      = m_curString;    break;
-        default: warn("warning: Unexpected tag `title' found\n"); break; 
+        default: warn("Unexpected tag `title' found\n"); break; 
       }
     }
 
@@ -685,7 +710,7 @@ class TagFileParser : public QXmlDefaultHandler
       }
       else
       {
-        warn("warning: Unexpected tag `subgroup' found\n");
+        warn("Unexpected tag `subgroup' found\n");
       }
     }
 
@@ -727,6 +752,7 @@ class TagFileParser : public QXmlDefaultHandler
       m_startElementHandlers.insert("path",        new StartElementHandler(this,&TagFileParser::startStringValue));
       m_startElementHandlers.insert("anchorfile",  new StartElementHandler(this,&TagFileParser::startStringValue));
       m_startElementHandlers.insert("anchor",      new StartElementHandler(this,&TagFileParser::startStringValue));
+      m_startElementHandlers.insert("clangid",     new StartElementHandler(this,&TagFileParser::startStringValue));
       m_startElementHandlers.insert("arglist",     new StartElementHandler(this,&TagFileParser::startStringValue));
       m_startElementHandlers.insert("title",       new StartElementHandler(this,&TagFileParser::startStringValue));
       m_startElementHandlers.insert("subgroup",    new StartElementHandler(this,&TagFileParser::startStringValue));
@@ -749,6 +775,7 @@ class TagFileParser : public QXmlDefaultHandler
       m_endElementHandlers.insert("path",        new EndElementHandler(this,&TagFileParser::endPath));
       m_endElementHandlers.insert("anchorfile",  new EndElementHandler(this,&TagFileParser::endAnchorFile));
       m_endElementHandlers.insert("anchor",      new EndElementHandler(this,&TagFileParser::endAnchor));
+      m_endElementHandlers.insert("clangid",     new EndElementHandler(this,&TagFileParser::endClangId));
       m_endElementHandlers.insert("arglist",     new EndElementHandler(this,&TagFileParser::endArglist));
       m_endElementHandlers.insert("title",       new EndElementHandler(this,&TagFileParser::endTitle));
       m_endElementHandlers.insert("subgroup",    new EndElementHandler(this,&TagFileParser::endSubgroup));
@@ -776,7 +803,7 @@ class TagFileParser : public QXmlDefaultHandler
       }
       else 
       {
-        warn("warning: Unknown tag `%s' found!\n",name.data());
+        warn("Unknown tag `%s' found!\n",name.data());
       }
       return TRUE;
     }
@@ -791,7 +818,7 @@ class TagFileParser : public QXmlDefaultHandler
       }
       else 
       {
-        warn("warning: Unknown tag `%s' found!\n",name.data());
+        warn("Unknown tag `%s' found!\n",name.data());
       }
       return TRUE;
     }
@@ -1079,6 +1106,7 @@ void TagFileParser::buildMemberList(Entry *ce,QList<TagMemberInfo> &members)
     me->virt       = tmi->virt;
     me->stat       = tmi->isStatic;
     me->fileName   = ce->fileName;
+    me->id         = tmi->clangId;
     if (ce->section == Entry::GROUPDOC_SEC)
     {
       me->groups->append(new Grouping(ce->name,Grouping::GROUPING_INGROUP));
@@ -1204,8 +1232,9 @@ void TagFileParser::buildLists(Entry *root)
     TagInfo *ti  = new TagInfo;
     ti->tagName  = m_tagName;
     ti->fileName = tci->filename;
-    ce->tagInfo = ti;
-    ce->lang = tci->isObjC ? SrcLangExt_ObjC : SrcLangExt_Unknown;
+    ce->id       = tci->clangId;
+    ce->tagInfo  = ti;
+    ce->lang     = tci->isObjC ? SrcLangExt_ObjC : SrcLangExt_Unknown;
     // transfer base class list
     if (tci->bases)
     {
@@ -1286,6 +1315,7 @@ void TagFileParser::buildLists(Entry *root)
     TagInfo *ti  = new TagInfo;
     ti->tagName  = m_tagName;
     ti->fileName = tni->filename;
+    ne->id       = tni->clangId;
     ne->tagInfo  = ti;
 
     buildMemberList(ne,tni->members);
@@ -1399,11 +1429,11 @@ void TagFileParser::addIncludes()
   }
 }
 
-void parseTagFile(Entry *root,const char *fullName,const char *tagName)
+void parseTagFile(Entry *root,const char *fullName)
 {
   QFileInfo fi(fullName);
   if (!fi.exists()) return;
-  TagFileParser handler( tagName );
+  TagFileParser handler( fullName ); // tagName
   handler.setFileName(fullName);
   TagFileErrorHandler errorHandler;
   QFile xmlFile( fullName );
index 427f674..73619db 100644 (file)
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -21,6 +21,6 @@
 
 class Entry;
 
-void parseTagFile(Entry *root,const char *fullPathName,const char *fileName);
+void parseTagFile(Entry *root,const char *fullPathName);
 
 #endif
index 24bf40b..a7c0dde 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  * Copyright (C) 2010-2011 by Rene Zaumseil
  *
  * Permission to use, copy, modify, and distribute this software and its
@@ -29,9 +29,13 @@ class TclLanguageScanner : public ParserInterface
 {
   public:
     virtual ~TclLanguageScanner() {}
+    void startTranslationUnit(const char *) {}
+    void finishTranslationUnit() {}
     void parseInput(const char *fileName,
                     const char *fileBuf,
-                    Entry *root);
+                    Entry *root,
+                    bool sameTranslationUnit,
+                    QStrList &filesInSameTranslationUnit);
     bool needsPreprocessing(const QCString &extension);
     void parseCode(CodeOutputInterface &codeOutIntf,
                    const char *scopeName,
index c3d5df0..73b2b58 100644 (file)
 // - Tcl_Interp removed
 // - changes are marked with RZ
 // #define's to adapt the code:
-#define CONST          const
-#define UCHAR          (unsigned char)
-#define TCL_ERROR      1
-#define TCL_OK         0
-#define ckalloc                malloc
-#define ckfree         free
+#define CONST           const
+#define UCHAR           (unsigned char)
+#define TCL_ERROR       1
+#define TCL_OK          0
+#define ckalloc         malloc
+#define ckfree          free
 #define TclCopyAndCollapse(size,src,dest) memcpy(dest,src,size); *(dest+size)=0
 int TclFindElement(
-      CONST char *list,                /* Points to the first byte of a string
-                                * containing a Tcl list with zero or more
-                                * elements (possibly in braces). */
-      int listLength,          /* Number of bytes in the list's string. */
-      CONST char **elementPtr, /* Where to put address of first significant
-                                * character in first element of list. */
-      CONST char **nextPtr,    /* Fill in with location of character just
-                                * after all white space following end of
-                                * argument (next arg or end of list). */
-      int *sizePtr,            /* If non-zero, fill in with size of
-                                * element. */
-      int *bracePtr)           /* If non-zero, fill in with non-zero/zero to
-                                * indicate that arg was/wasn't in braces. */
+      CONST char *list,         /* Points to the first byte of a string
+                                 * containing a Tcl list with zero or more
+                                 * elements (possibly in braces). */
+      int listLength,           /* Number of bytes in the list's string. */
+      CONST char **elementPtr,  /* Where to put address of first significant
+                                 * character in first element of list. */
+      CONST char **nextPtr,     /* Fill in with location of character just
+                                 * after all white space following end of
+                                 * argument (next arg or end of list). */
+      int *sizePtr,             /* If non-zero, fill in with size of
+                                 * element. */
+      int *bracePtr)            /* If non-zero, fill in with non-zero/zero to
+                                 * indicate that arg was/wasn't in braces. */
 {
   CONST char *p = list;
-  CONST char *elemStart;       /* Points to first byte of first element. */
-  CONST char *limit;           /* Points just after list's last byte. */
-  int openBraces = 0;          /* Brace nesting level during parse. */
+  CONST char *elemStart;        /* Points to first byte of first element. */
+  CONST char *limit;            /* Points just after list's last byte. */
+  int openBraces = 0;           /* Brace nesting level during parse. */
   int inQuotes = 0;
-  int size = 0;                /* lint. */
+  int size = 0;         /* lint. */
   //RZ    int numChars;
 
   /*
@@ -122,7 +122,7 @@ int TclFindElement(
     p++;
   }
   if (p == limit) 
-  {            /* no element found */
+  {             /* no element found */
     elemStart = limit;
     goto done;
   }
@@ -157,54 +157,54 @@ int TclFindElement(
        */
 
       case '{':
-       if (openBraces != 0) 
-       {
-         openBraces++;
-       }
-       break;
+        if (openBraces != 0) 
+        {
+          openBraces++;
+        }
+        break;
 
-       /*
-        * Close brace: if element is in braces, keep nesting count and
-        * quit when the last close brace is seen.
-        */
+        /*
+         * Close brace: if element is in braces, keep nesting count and
+         * quit when the last close brace is seen.
+         */
 
       case '}':
-       if (openBraces > 1) 
-       {
-         openBraces--;
-       } 
-       else if (openBraces == 1) 
-       {
-         size = (int)(p - elemStart);
-         p++;
-         if ((p >= limit) || isspace(UCHAR(*p))) 
-         {     /* INTL: ISO space. */
-           goto done;
-         }
-
-         /*
-          * Garbage after the closing brace; return an error.
-          */
-
-         return TCL_ERROR;
-       }
-       break;
-
-       /*
-        * Backslash: skip over everything up to the end of the backslash
-        * sequence.
-        */
+        if (openBraces > 1) 
+        {
+          openBraces--;
+        
+        else if (openBraces == 1) 
+        {
+          size = (int)(p - elemStart);
+          p++;
+          if ((p >= limit) || isspace(UCHAR(*p))) 
+          {     /* INTL: ISO space. */
+            goto done;
+          }
+
+          /*
+           * Garbage after the closing brace; return an error.
+           */
+
+          return TCL_ERROR;
+        }
+        break;
+
+        /*
+         * Backslash: skip over everything up to the end of the backslash
+         * sequence.
+         */
 
       case '\\':
-       //RZ        Tcl_UtfBackslash(p, &numChars, NULL);
-       //RZ        p += (numChars - 1);
-       p++; //RZ
-       break;
+        //RZ        Tcl_UtfBackslash(p, &numChars, NULL);
+        //RZ        p += (numChars - 1);
+        p++; //RZ
+        break;
 
-       /*
-        * Space: ignore if element is in braces or quotes; otherwise
-        * terminate element.
-        */
+        /*
+         * Space: ignore if element is in braces or quotes; otherwise
+         * terminate element.
+         */
 
       case ' ':
       case '\f':
@@ -212,33 +212,33 @@ int TclFindElement(
       case '\r':
       case '\t':
       case '\v':
-       if ((openBraces == 0) && !inQuotes) 
-       {
-         size = (int)(p - elemStart);
-         goto done;
-       }
-       break;
+        if ((openBraces == 0) && !inQuotes) 
+        {
+          size = (int)(p - elemStart);
+          goto done;
+        }
+        break;
 
-       /*
-        * Double-quote: if element is in quotes then terminate it.
-        */
+        /*
+         * Double-quote: if element is in quotes then terminate it.
+         */
 
       case '"':
-       if (inQuotes) 
-       {
-         size = (int)(p - elemStart);
-         p++;
-         if ((p >= limit) || isspace(UCHAR(*p))) 
-         {     /* INTL: ISO space */
-           goto done;
-         }
-
-         /*
-          * Garbage after the closing quote; return an error.
-          */
-         return TCL_ERROR;
-       }
-       break;
+        if (inQuotes) 
+        {
+          size = (int)(p - elemStart);
+          p++;
+          if ((p >= limit) || isspace(UCHAR(*p))) 
+          {     /* INTL: ISO space */
+            goto done;
+          }
+
+          /*
+           * Garbage after the closing quote; return an error.
+           */
+          return TCL_ERROR;
+        }
+        break;
     }
     p++;
   }
@@ -275,11 +275,11 @@ done:
 }
 
 int Tcl_SplitList(
-    CONST char *list,          /* Pointer to string with list structure. */
-    int *argcPtr,              /* Pointer to location to fill in with the
-                                * number of elements in the list. */
-    CONST char ***argvPtr)     /* Pointer to place to store pointer to array
-                                * of pointers to list elements. */
+    CONST char *list,           /* Pointer to string with list structure. */
+    int *argcPtr,               /* Pointer to location to fill in with the
+                                 * number of elements in the list. */
+    CONST char ***argvPtr)      /* Pointer to place to store pointer to array
+                                 * of pointers to list elements. */
 {
   CONST char **argv, *l, *element;
   char *p;
@@ -295,7 +295,7 @@ int Tcl_SplitList(
   for (size = 2, l = list; *l != 0; l++) 
   {
     if (isspace(UCHAR(*l))) 
-    {                  /* INTL: ISO space. */
+    {                   /* INTL: ISO space. */
       size++;
 
       /*
@@ -304,18 +304,18 @@ int Tcl_SplitList(
 
       while (1) 
       {
-       char next = *(l + 1);
-
-       if (next == '\0') 
-       {
-         break;
-       }
-       ++l;
-       if (isspace(UCHAR(next))) 
-       {               /* INTL: ISO space. */
-         continue;
-       }
-       break;
+        char next = *(l + 1);
+
+        if (next == '\0') 
+        {
+          break;
+        }
+        ++l;
+        if (isspace(UCHAR(next))) 
+        {               /* INTL: ISO space. */
+          continue;
+        }
+        break;
       }
     }
   }
@@ -328,7 +328,7 @@ int Tcl_SplitList(
     CONST char *prevList = list;
 
     result = TclFindElement(list, length, &element, &list,
-       &elSize, &brace);
+        &elSize, &brace);
     length -= (int)(list - prevList);
     if (result != TCL_OK) 
     {
@@ -439,10 +439,10 @@ static struct
   QCString string_comment; // contain current comment
   QCString string_last; // contain last read word or part of word
   QCString string; // temporary string value
-  Entry*               entry_main; // top level entry
-  Entry*               entry_file; // entry of current file
-  Entry*               entry_current; // currently used entry
-  Entry*               entry_inside; // contain entry of current scan context
+  Entry*                entry_main; // top level entry
+  Entry*                entry_file; // entry of current file
+  Entry*                entry_current; // currently used entry
+  Entry*                entry_inside; // contain entry of current scan context
   QStringList list_commandwords; // list of command words
   QList<tcl_scan> scan; // stack of scan contexts
   QAsciiDict<Entry> ns; // all read namespace entries
@@ -481,7 +481,7 @@ Entry* tcl_entry_new()
   myEntry->lang       = SrcLangExt_Tcl;
   initGroupInfo(myEntry);
   // collect entries
-  if (tcl.code==NULL)
+  if (!tcl.code)
   {
     tcl.entry.insert(0,myEntry);
   }
@@ -508,7 +508,7 @@ static void tcl_name(const QCString &ns0, const QCString &name0, QCString &ns, Q
   QCString myNm;
   int myStart;
 
-  if (strncmp(name0.data(),"::",2)==0)
+  if (qstrncmp(name0.data(),"::",2)==0)
   {
     myNm = name0.mid(2);
   }
@@ -629,7 +629,7 @@ static int tcl_keyword(QCString str)
 //! End codifying with special font class.
 static void tcl_font_end()
 {
-  if (tcl.code==NULL) return;
+  if (!tcl.code) return;
   if (tcl.code_font)
   {
     tcl.code->endFontClass();
@@ -640,8 +640,8 @@ static void tcl_font_end()
 //! Codify 'str' with special font class 's'.
 static void tcl_codify(const char *s,char *str)
 {
-  if (tcl.code==NULL||str==NULL) return;
-  if (s && strcmp(s,"NULL")!=0)
+  if (!tcl.code || !str) return;
+  if (s && qstrcmp(s,"NULL")!=0)
   {
     tcl_font_end();
     tcl.code->startFontClass(s);
@@ -659,20 +659,19 @@ static void tcl_codify(const char *s,char *str)
       tcl.code_line++;
       *(p-1)='\0';
       tcl.code->codify(sp);
-      //tcl_font_end();
+      if (tcl.code_font)
+      {
+        tcl.code->endFontClass();
+      }
       tcl.code->endCodeLine();
+      tcl.code->startCodeLine(tcl.code_linenumbers);
       if (tcl.code_linenumbers)
       {
-        if (tcl.code_font!=NULL)
-       {
-          tcl.code->endFontClass();
-          tcl.code->writeLineNumber(0,0,0,tcl.code_line);
-         tcl.code->startFontClass(tcl.code_font);
-       }
-       else
-       {
-          tcl.code->writeLineNumber(0,0,0,tcl.code_line);
-       }
+        tcl.code->writeLineNumber(0,0,0,tcl.code_line);
+      }
+      if (tcl.code_font)
+      {
+        tcl.code->startFontClass(tcl.code_font);
       }
     }
     else
@@ -706,7 +705,7 @@ static void tcl_codify(const char *s,const QString &str)
 //! Codify 'str' with special font class 's'.
 static void tcl_codify(const char *s,const QCString &str)
 {
-  if (tcl.code==NULL) return;
+  if (!tcl.code) return;
   tcl_codify(s,str.data());
 }
 
@@ -716,11 +715,11 @@ static void tcl_codify_cmd(const char *s,int i)
 }
 
 //-----------------------------------------------------------------------------
-#undef YY_INPUT
-#define        YY_INPUT(buf,result,max_size) result=yyread(buf,max_size);
+#undef  YY_INPUT
+#define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size);
 //-----------------------------------------------------------------------------
 %}
-ws             ([ \t]|\\\n)
+ws              ([ \t]|\\\n)
 
 %option yylineno
 %option noyywrap
@@ -1247,8 +1246,8 @@ tcl_inf("(\\\n) ?%s?\n",tcl.string_last.data());
     {
       case '{':// {{x}}
         myLevel--;
-        if (myLevel==0 && tcl.code==NULL
-       {
+        if (myLevel==0 && !tcl.code
+        {
           myWhite=1;
         }
       break;
@@ -1287,7 +1286,7 @@ tcl_inf("(\\\n) ?%s?\n",tcl.string_last.data());
       case '{':
       break;
       case '[':
-       myLevel--;
+        myLevel--;
       break;
       case '"':
       case '.':
@@ -1340,7 +1339,7 @@ tcl_inf("(%d) ?%s?\n",what,tcl.string_last.data());
           yyless(0);
 tcl_inf("(.%d) ?%s?\n",what,tcl.string_last.data());
           return;
-       }
+        }
         else
         {
           myLevel--;
@@ -1464,24 +1463,24 @@ tcl_inf("-> %s\n",(const char *)tcl.string_comment);
         myPos0=myPos;
         myLine0=myLine;
         while (parseCommentBlock(tcl.this_parser, &myEntry0, myDoc, tcl.file_name,
-         myLine, FALSE, tcl.config_autobrief, FALSE, myProt, myPos, myNew))
+          myLine, FALSE, tcl.config_autobrief, FALSE, myProt, myPos, myNew))
         {
           if (myNew)
           { // we need a new entry in this case
             myNew=0;
             myEntry = tcl_entry_new();
             parseCommentBlock(tcl.this_parser, myEntry, myDoc, tcl.file_name,
-             myLine0, FALSE, tcl.config_autobrief, FALSE, myProt, myPos0, myNew);
-           tcl.entry_inside->addSubEntry(myEntry);
+              myLine0, FALSE, tcl.config_autobrief, FALSE, myProt, myPos0, myNew);
+            tcl.entry_inside->addSubEntry(myEntry);
           }
           else
           { // we can add to current entry in this case
-            if (myEntry1==NULL)
+            if (!myEntry1)
             {
               myEntry1=tcl_entry_namespace(tcl.scan.at(0)->ns);
             }
             parseCommentBlock(tcl.this_parser, myEntry1, myDoc, tcl.file_name,
-             myLine0, FALSE, tcl.config_autobrief, FALSE, myProt, myPos0, myNew);
+              myLine0, FALSE, tcl.config_autobrief, FALSE, myProt, myPos0, myNew);
           }
           myPos0=myPos;
           myLine0=myLine;
@@ -1491,35 +1490,35 @@ tcl_inf("-> %s\n",(const char *)tcl.string_comment);
           myNew=0;
           myEntry = tcl_entry_new();
           parseCommentBlock(tcl.this_parser, myEntry, myDoc, tcl.file_name,
-           myLine0, FALSE, tcl.config_autobrief, FALSE, myProt, myPos0, myNew);
-         tcl.entry_inside->addSubEntry(myEntry);
+            myLine0, FALSE, tcl.config_autobrief, FALSE, myProt, myPos0, myNew);
+          tcl.entry_inside->addSubEntry(myEntry);
         }
         else
         { // we can add to current entry
-          if (myEntry1==NULL)
+          if (!myEntry1)
           {
             myEntry1=tcl_entry_namespace(tcl.scan.at(0)->ns);
           }
           parseCommentBlock(tcl.this_parser, myEntry1, myDoc, tcl.file_name,
-           myLine0, FALSE, tcl.config_autobrief, FALSE, myProt, myPos0, myNew);
+            myLine0, FALSE, tcl.config_autobrief, FALSE, myProt, myPos0, myNew);
         }
       }
       else
       { // new entry
         tcl.entry_current = tcl_entry_new();
         while (parseCommentBlock(tcl.this_parser, tcl.entry_current, myDoc,
-         tcl.file_name, myLine, FALSE, tcl.config_autobrief, FALSE,
-         myProt, myPos, myNew))
+          tcl.file_name, myLine, FALSE, tcl.config_autobrief, FALSE,
+          myProt, myPos, myNew))
         {
           if (myNew)
           {
-           tcl.entry_inside->addSubEntry(tcl.entry_current);
-           tcl.entry_current = tcl_entry_new();
+            tcl.entry_inside->addSubEntry(tcl.entry_current);
+            tcl.entry_current = tcl_entry_new();
           }
           else
           {
-           tcl.entry_current->section = tcl.entry_inside->section;
-           tcl.entry_current->name = tcl.entry_inside->name;
+            tcl.entry_current->section = tcl.entry_inside->section;
+            tcl.entry_current->name = tcl.entry_inside->name;
           }
         }
         if (myNew)
@@ -1554,7 +1553,7 @@ D
   QStringList myArgs;
   QString myArglist="";
 
-  if (tcl.entry_current->argList==NULL)
+  if (!tcl.entry_current->argList)
   {
     tcl.entry_current->argList=new ArgumentList;
   }
@@ -1571,7 +1570,7 @@ D
       myArg->defval= (*myArgs1.at(1)).utf8();
       if (myArg->defval.isEmpty())
       {
-       myArg->defval = " ";
+        myArg->defval = " ";
       }
       myArglist += "?" + QCString(myArg->name) + "? ";
     }
@@ -1604,7 +1603,7 @@ static void tcl_codify_link(QCString name)
       MemberNameIterator mi(*mn);
       for (mi.toFirst();(md=mi.current());++mi) 
       {
-       fn.insert(md->qualifiedName(),md);
+        fn.insert(md->qualifiedName(),md);
       }
     }
     for (fni.toFirst();(mn=fni.current());++fni) 
@@ -1612,7 +1611,7 @@ static void tcl_codify_link(QCString name)
       MemberNameIterator fi(*mn);
       for (fi.toFirst();(md=fi.current());++fi) 
       {
-       fn.insert(md->qualifiedName(),md);
+        fn.insert(md->qualifiedName(),md);
       }
     }
   }
@@ -1645,14 +1644,14 @@ static void tcl_codify_link(QCString name)
   if (myDef != NULL) // documented command
   {
     tcl.code->writeCodeLink(myDef->getReference().data(),
-               myDef->getOutputFileBase().data(),
-               myDef->anchor().data(),
-               name,
-               myDef->qualifiedName().data());
+                myDef->getOutputFileBase().data(),
+                myDef->anchor().data(),
+                name,
+                myDef->qualifiedName().data());
     if (tcl.memberdef)
     {
-       myDef->addSourceReferencedBy(tcl.memberdef);
-       tcl.memberdef->addSourceReferences(myDef);
+        myDef->addSourceReferencedBy(tcl.memberdef);
+        tcl.memberdef->addSourceReferences(myDef);
     }
   }
   else if (tcl_keyword(myName)) // check keyword
@@ -1675,7 +1674,7 @@ D
   tcl_codify_cmd(NULL,1);
   tcl_scan *myScan=tcl.scan.at(0);
   myScan = tcl_scan_start('?',*tcl.list_commandwords.at(2),
-       myScan->ns,myScan->entry_cl,myScan->entry_fn);
+        myScan->ns,myScan->entry_cl,myScan->entry_fn);
   for (unsigned int i = 3;i<tcl.list_commandwords.count();i++)
   {
     myScan->after << type[i] << tcl.list_commandwords[i];
@@ -1690,7 +1689,7 @@ D
   tcl_codify_cmd(NULL,1);
   tcl_scan *myScan=tcl.scan.at(0);
   myScan = tcl_scan_start('?',*tcl.list_commandwords.at(2),
-       myScan->ns,myScan->entry_cl,myScan->entry_fn);
+        myScan->ns,myScan->entry_cl,myScan->entry_fn);
   myScan->after << "NULL" << tcl.list_commandwords[3];
   myScan->after << "script" << tcl.list_commandwords[4];
   myScan->after << "NULL" << tcl.list_commandwords[5];
@@ -1713,7 +1712,7 @@ D
   }
   tcl_scan *myScan=tcl.scan.at(0);
   myScan = tcl_scan_start('?',*tcl.list_commandwords.at(tcl.list_commandwords.count()-1),
-       myScan->ns,myScan->entry_cl,myScan->entry_fn);
+        myScan->ns,myScan->entry_cl,myScan->entry_fn);
 }
 
 ///! Handle internal tcl commands.
@@ -1725,7 +1724,7 @@ D
   tcl_codify_cmd(NULL,1);
   tcl_scan *myScan=tcl.scan.at(0);
   myScan = tcl_scan_start('?',*tcl.list_commandwords.at(2),
-       myScan->ns,myScan->entry_cl,myScan->entry_fn);
+        myScan->ns,myScan->entry_cl,myScan->entry_fn);
   myScan->after << "NULL" << tcl.list_commandwords[3];
   myScan->after << "script" << tcl.list_commandwords[4];
 }
       for (i=0;i<myName.length();i++)
       {
         QChar c = myName[i];
-       if (myCmd) 
-       {
-         if (c==' '||c=='\t'||c=='\n'||c==']') 
-         {//end of command
-           tcl_codify_link(myStr);
-           myStr="";
-           myCmd=0;
-         }
-         myStr+=c;
-       } 
-       else 
-       {
-         myStr+=c;
-         if (c=='[') 
-         {//start of command
-           for (;i<myName.length();i++)
+        if (myCmd) 
+        {
+          if (c==' '||c=='\t'||c=='\n'||c==']') 
+          {//end of command
+            tcl_codify_link(myStr);
+            myStr="";
+            myCmd=0;
+          }
+          myStr+=c;
+        
+        else 
+        {
+          myStr+=c;
+          if (c=='[') 
+          {//start of command
+            for (;i<myName.length();i++)
             {
               c = myName[i+1];
-             if (c!=' ' && c!='\t' && c!='\n') break;
-             myStr+=c;
+              if (c!=' ' && c!='\t' && c!='\n') break;
+              myStr+=c;
             }
             tcl_codify(NULL,myStr);
-           myStr="";
-           myCmd=1;
-         }
-       }
+            myStr="";
+            myCmd=1;
+          }
+        }
       }
       tcl_codify(NULL,myStr);
     }
@@ -1825,7 +1824,7 @@ D
   myEntry = tcl.entry_current;
   tcl.fn.insert(myName,myEntry);
   myScan = tcl_scan_start(tcl.word_is,*tcl.list_commandwords.at(6),
-       myEntryNs->name,NULL,myEntry);
+        myEntryNs->name,NULL,myEntry);
 }
 
 //! Handle \c itcl::body statements and \c oo::define method and method inside \c itcl::class statements.
@@ -1867,7 +1866,7 @@ D
   tcl.fn.insert(myName,tcl.entry_current);
   myEntry = tcl.entry_current;
   myScan = tcl_scan_start(tcl.word_is,*tcl.list_commandwords.at(6),
-       myNs, myEntryCl, myEntry);
+        myNs, myEntryCl, myEntry);
 }
 
 //! Handle \c constructor statements inside class definitions.
   tcl.entry_current->endBodyLine = tcl.line_body1;
   tcl_protection(tcl.entry_current);
   tcl_command_ARGLIST(*tcl.list_commandwords.at(2));
-  myEntryCl->addSubEntry(tcl.entry_current);
+  if (myEntryCl) myEntryCl->addSubEntry(tcl.entry_current);
   myEntry = tcl.entry_current;
   tcl.fn.insert(myName,myEntry);
   myScan = tcl_scan_start(tcl.word_is,*tcl.list_commandwords.at(4),
-       myNs, myEntryCl, myEntry);
+        myNs, myEntryCl, myEntry);
 }
 
 //! Handle \c destructor statements inside class definitions.
@@ -1938,7 +1937,7 @@ D
   myEntry = tcl.entry_current;
   tcl.fn.insert(myName,myEntry);
   myScan = tcl_scan_start(tcl.word_is,*tcl.list_commandwords.at(2),
-       myNs, myEntryCl, myEntry);
+        myNs, myEntryCl, myEntry);
 }
 
 //! Handle \c namespace statements.
@@ -2006,7 +2005,7 @@ D
   tcl.cl.insert(myName,tcl.entry_current);
   myEntryCl = tcl.entry_current;
   myScan = tcl_scan_start(tcl.word_is,*tcl.list_commandwords.at(4),
-       myName, myEntryCl, NULL);
+        myName, myEntryCl, NULL);
 }
 
 //! Handle \c oo::class statements.
@@ -2039,7 +2038,7 @@ D
   tcl.cl.insert(myName,tcl.entry_current);
   myEntryCl = tcl.entry_current;
   myScan = tcl_scan_start(tcl.word_is,*tcl.list_commandwords.at(6),
-       myName, myEntryCl, NULL);
+        myName, myEntryCl, NULL);
 }
 
 //! Handle \c oo::define statements.
@@ -2205,11 +2204,11 @@ tcl_inf("->\n");
     {
       tcl_scan *myScan = tcl.scan.at(0);
       myScan = tcl_scan_start(tcl.word_is,*tcl.list_commandwords.at(0),
-       myScan->ns,myScan->entry_cl,myScan->entry_fn);
+        myScan->ns,myScan->entry_cl,myScan->entry_fn);
       myProt = tcl.protection;
       goto command_end;
     }
-    myStr      = (*tcl.list_commandwords.at(0)).utf8();
+    myStr       = (*tcl.list_commandwords.at(0)).utf8();
     // remove leading "::" and apply TCL_SUBST
     if (myStr.left(2)=="::") myStr = myStr.mid(2);
     if (tcl.config_subst.contains(myStr))
@@ -2296,7 +2295,7 @@ tcl_inf("->\n");
     if (tcl.list_commandwords.count() < 3) {myLine=__LINE__;goto command_warn;}
     if (tcl.scan.at(0)->entry_fn == NULL)
     {// only parsed outside functions
-      tcl_command_VARIABLE(tcl.scan.at(0)->entry_cl!=NULL&&tcl.scan.at(0)->entry_cl->name!="");
+      tcl_command_VARIABLE(tcl.scan.at(0)->entry_cl && tcl.scan.at(0)->entry_cl->name!="");
       goto command_text;
     }
   }
@@ -2312,7 +2311,7 @@ tcl_inf("->\n");
   if (myStr=="inherit" || myStr=="superclass")
   {
     if (tcl.list_commandwords.count() < 3) {myLine=__LINE__;goto command_warn;}
-    if (tcl.scan.at(0)->entry_cl!=NULL&&tcl.scan.at(0)->entry_cl->name!="")
+    if (tcl.scan.at(0)->entry_cl && tcl.scan.at(0)->entry_cl->name!="")
     {
       for (unsigned int i = 2; i < tcl.list_commandwords.count(); i = i + 2)
       {
@@ -2354,46 +2353,46 @@ if expr1 ?then? body1 elseif expr2 ?then? body2 elseif ... ?else?  ?bodyN?
         if (myStr=="then") 
         {
           myState='t';
-         myType << "keyword" << "NULL";
+          myType << "keyword" << "NULL";
         }
         else
         {
           myState='b';
-         myType << "script" << "NULL";
+          myType << "script" << "NULL";
         }
       }
       else if (myState=='t')
       {
         myState='b';
-       myType << "script" << "NULL";
+        myType << "script" << "NULL";
       }
       else if (myState=='b')
       {
         if (myStr=="elseif") {
           myState='i';
-         myType << "keyword" << "NULL";
+          myType << "keyword" << "NULL";
         }
         else if (myStr=="else" && i==tcl.list_commandwords.count()-3)
         {
-         myState = 'b';
-         myType << "keyword" << "NULL" << "script";
-         i = tcl.list_commandwords.count();
+          myState = 'b';
+          myType << "keyword" << "NULL" << "script";
+          i = tcl.list_commandwords.count();
         }
         else if (i==tcl.list_commandwords.count()-1)
         {
-         myState = 'b';
-         myType << "script";
-         i = tcl.list_commandwords.count();
-       }
+          myState = 'b';
+          myType << "script";
+          i = tcl.list_commandwords.count();
+        }
         else
         {
-         myLine=__LINE__;goto command_warn;
+          myLine=__LINE__;goto command_warn;
         }
       }
       else if (myState=='i')
       {
         myState='x';
-       myType << "script" << "NULL";
+        myType << "script" << "NULL";
       }
     }
     if (myState != 'b') {myLine=__LINE__;goto command_warn;}
@@ -2472,20 +2471,20 @@ tcl_inf("TCL_SUBST: use '%s'\n",s);
   tcl.string_command="";
   tcl.string_commentline="";
   tcl.string_commentcodify="";
-  tcl.string_comment   = "";
-  tcl.string_last      = "";
-  tcl.entry_main       = NULL;
-  tcl.entry_file       = NULL;
-  tcl.entry_current    = NULL;
-  tcl.entry_inside     = NULL;
+  tcl.string_comment    = "";
+  tcl.string_last       = "";
+  tcl.entry_main        = NULL;
+  tcl.entry_file        = NULL;
+  tcl.entry_current     = NULL;
+  tcl.entry_inside      = NULL;
   tcl.list_commandwords.clear();
   tcl.scan.clear();
   tcl.ns.clear();
   tcl.cl.clear();
   tcl.fn.clear();
-  yylineno             = 1;
-  tcl.protection       = Public;
-  tcl.memberdef                = NULL;
+  yylineno              = 1;
+  tcl.protection        = Public;
+  tcl.memberdef         = NULL;
 }
 
 //! Start parsing.
@@ -2528,7 +2527,11 @@ static void tcl_parse(const QCString ns, const QCString cls)
 }
 
 //! Parse text file and build up entry tree.
-void TclLanguageScanner::parseInput(const char *fileName,const char *input,Entry *root)
+void TclLanguageScanner::parseInput(const char *fileName,
+                                    const char *input,
+                                    Entry *root,
+                                    bool /*sameTranslationUnit*/,
+                                    QStrList & /*filesInSameTranslationUnit*/)
 {
   QFile            myFile;
 tcl_inf("%s\n",fileName);
@@ -2563,7 +2566,7 @@ void TclLanguageScanner::parseCode(CodeOutputInterface & codeOutIntf,
                    int startLine,
                    int endLine,
                    bool inlineFragment,
-                  MemberDef *memberDef,
+                   MemberDef *memberDef,
                    bool showLineNumbers,
                    Definition *searchCtx
                   )
@@ -2633,6 +2636,7 @@ tcl_inf("%s (%d,%d) %d %d\n",myStr.ascii(),startLine,endLine,isExampleBlock,inli
   yylineno=startLine;
   tcl.code_linenumbers = showLineNumbers;
   tcl.code_line=yylineno;
+  tcl.code->startCodeLine(tcl.code_linenumbers);
   if (tcl.code_linenumbers) 
   {
     tcl.code->writeLineNumber(0,0,0,tcl.code_line);
@@ -2641,6 +2645,7 @@ tcl_inf("%s (%d,%d) %d %d\n",myStr.ascii(),startLine,endLine,isExampleBlock,inli
   tcl.this_parser = NULL;
   tcl.entry_main = tcl_entry_new();
   tcl_parse(myNs,myCls);
+  tcl.code->endCodeLine();
   tcl.scan.clear();
   tcl.ns.clear();
   tcl.cl.clear();
index 33cb3f4..9275846 100644 (file)
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -127,7 +127,7 @@ void TextDocVisitor::visit(DocSymbol *s)
     case DocSymbol::LeftFloor:     m_t << "&lfloor;"; break;
     case DocSymbol::RightFloor:    m_t << "&rfloor;"; break;
     default:
-                             err("error: unknown symbol found\n");
+                             err("unknown symbol found\n");
   }
 }
 
index b6c50e0..81fd9e8 100644 (file)
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index f96962e..4de5da7 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -335,7 +335,62 @@ class Translator
 // new since 1.2.6
 //////////////////////////////////////////////////////////////////////////
 
+
+    /*! Used as ansicpg for RTF file
+     *
+     * The following table shows the correlation of Charset name, Charset Value and
+     * <pre>
+     * Codepage number:
+     * Charset Name       Charset Value(hex)  Codepage number
+     * ------------------------------------------------------
+     * DEFAULT_CHARSET           1 (x01)
+     * SYMBOL_CHARSET            2 (x02)
+     * OEM_CHARSET             255 (xFF)
+     * ANSI_CHARSET              0 (x00)            1252
+     * RUSSIAN_CHARSET         204 (xCC)            1251
+     * EE_CHARSET              238 (xEE)            1250
+     * GREEK_CHARSET           161 (xA1)            1253
+     * TURKISH_CHARSET         162 (xA2)            1254
+     * BALTIC_CHARSET          186 (xBA)            1257
+     * HEBREW_CHARSET          177 (xB1)            1255
+     * ARABIC _CHARSET         178 (xB2)            1256
+     * SHIFTJIS_CHARSET        128 (x80)             932
+     * HANGEUL_CHARSET         129 (x81)             949
+     * GB2313_CHARSET          134 (x86)             936
+     * CHINESEBIG5_CHARSET     136 (x88)             950
+     * </pre>
+     *
+     */
     virtual QCString trRTFansicp() = 0;
+
+    /*! Character sets
+     *  <pre>
+     *   0 — ANSI
+     *   1 — Default
+     *   2 — Symbol
+     *   3 — Invalid
+     *  77 — Mac
+     * 128 — Shift Jis
+     * 129 — Hangul
+     * 130 — Johab
+     * 134 — GB2312
+     * 136 — Big5
+     * 161 — Greek
+     * 162 — Turkish
+     * 163 — Vietnamese
+     * 177 — Hebrew
+     * 178 — Arabic
+     * 179 — Arabic Traditional
+     * 180 — Arabic user
+     * 181 — Hebrew user
+     * 186 — Baltic
+     * 204 — Russian
+     * 222 — Thai
+     * 238 — Eastern European
+     * 254 — PC 437
+     * 255 — OEM 
+     * </pre>
+     */
     virtual QCString trRTFCharSet() = 0;
     virtual QCString trRTFGeneralIndex() = 0;
    
@@ -527,6 +582,18 @@ class Translator
     virtual QCString trMethodDocumentation() = 0;
     virtual QCString trDesignOverview() = 0;
 
+//////////////////////////////////////////////////////////////////////////
+// new since 1.8.4
+//////////////////////////////////////////////////////////////////////////
+
+    virtual QCString trInterfaces() = 0;
+    virtual QCString trServices() = 0;
+    virtual QCString trConstantGroups() = 0;
+    virtual QCString trConstantGroupReference(const char *namespaceName) = 0;
+    virtual QCString trServiceReference(const char *sName) = 0;
+    virtual QCString trSingletonReference(const char *sName) = 0;
+    virtual QCString trServiceGeneratedFromFiles(bool single) = 0;
+    virtual QCString trSingletonGeneratedFromFiles(bool single) = 0;
 };
 
 #endif
index adfcdf8..ad89b4b 100644 (file)
@@ -2,12 +2,13 @@
 #define TRANSLATOR_ADAPTER_H
 
 #include "version.h"
+#include "translator.h"
 
 /** Base of the translator adapter tree.
  *
  *  This abstract class provides access to the english
  *  translations, to be used as a substitute for not implemented
- *  local translations. 
+ *  local translations.
  */
 class TranslatorAdapterBase : public Translator
 {
@@ -21,26 +22,57 @@ class TranslatorAdapterBase : public Translator
     inline QCString createUpdateNeededMessage(const QCString & languageName,
                                               const QCString & versionString)
     {
-      return QCString("Warning: The selected output language \"")
-             + languageName 
+      return QCString("The selected output language \"")
+             + languageName
              + "\" has not been updated\nsince "
              + versionString
              + ".  As a result some sentences may appear in English.\n\n";
     }
-  
+
   public:
     /*! This method is used to generate a warning message to signal
      *  the user that the translation of his/her language of choice
      *  needs updating.  It must be implemented by the translator
      *  adapter class (pure virtual).
-     * 
+     *
      *  \sa createUpdateNeededMessage()
      */
     virtual QCString updateNeededMessage() = 0;
 
 };
 
-class TranslatorAdapter_1_8_2 : public TranslatorAdapterBase
+class TranslatorAdapter_1_8_4 : public TranslatorAdapterBase
+{
+  public:
+    virtual QCString updateNeededMessage()
+    { return createUpdateNeededMessage(idLanguage(),"release 1.8.4"); }
+
+    virtual QCString trInterfaces()
+    { return english.trInterfaces(); }
+
+    virtual QCString trServices()
+    { return english.trServices(); }
+
+    virtual QCString trConstantGroups()
+    { return english.trConstantGroups(); }
+
+    virtual QCString trConstantGroupReference(const char *namespaceName)
+    { return english.trConstantGroupReference(namespaceName); }
+
+    virtual QCString trServiceReference(const char *sName)
+    { return english.trServiceReference(sName); }
+
+    virtual QCString trSingletonReference(const char *sName)
+    { return english.trSingletonReference(sName); }
+
+    virtual QCString trServiceGeneratedFromFiles(bool single)
+    { return english.trServiceGeneratedFromFiles(single); }
+
+    virtual QCString trSingletonGeneratedFromFiles(bool single)
+    { return english.trSingletonGeneratedFromFiles(single); }
+};
+
+class TranslatorAdapter_1_8_2 : public TranslatorAdapter_1_8_4
 {
   public:
     virtual QCString updateNeededMessage()
@@ -69,8 +101,8 @@ class TranslatorAdapter_1_8_2 : public TranslatorAdapterBase
 };
 
 
-/** Adapter class for languages that only contain translations upto 
- *  version 1.8.0. 
+/** Adapter class for languages that only contain translations up to
+ *  version 1.8.0.
  */
 class TranslatorAdapter_1_8_0 : public TranslatorAdapter_1_8_2
 {
@@ -101,7 +133,7 @@ class TranslatorAdapter_1_8_0 : public TranslatorAdapter_1_8_2
 
 };
 
-/** Adapter class for languages that only contain translations upto 
+/** Adapter class for languages that only contain translations up to
  *  version 1.7.5.
  */
 class TranslatorAdapter_1_7_5 : public TranslatorAdapter_1_8_0
@@ -120,7 +152,7 @@ class TranslatorAdapter_1_7_5 : public TranslatorAdapter_1_8_0
     { return english.trDirDepGraph(name); }
 };
 
-/** Adapter class for languages that only contain translations upto 
+/** Adapter class for languages that only contain translations up to
  *  version 1.6.3.
  */
 class TranslatorAdapter_1_6_3 : public TranslatorAdapter_1_7_5
@@ -141,7 +173,7 @@ class TranslatorAdapter_1_6_3 : public TranslatorAdapter_1_7_5
     { return english.trDateTime(year,month,day,dayOfWeek,hour,minutes,seconds,includeTime); }
 };
 
-/** Adapter class for languages that only contain translations upto 
+/** Adapter class for languages that only contain translations up to
  *  version 1.6.0.
  */
 class TranslatorAdapter_1_6_0 : public TranslatorAdapter_1_6_3
@@ -166,7 +198,7 @@ class TranslatorAdapter_1_6_0 : public TranslatorAdapter_1_6_3
     { return english.trNoMatches(); }
 };
 
-/** Adapter class for languages that only contain translations upto 
+/** Adapter class for languages that only contain translations up to
  *  version 1.5.4
  */
 class TranslatorAdapter_1_5_4 : public TranslatorAdapter_1_6_0
@@ -245,7 +277,7 @@ class TranslatorAdapter_1_5_4 : public TranslatorAdapter_1_6_0
     { return english.trTypeConstraints(); }
 };
 
-/** Adapter class for languages that only contain translations upto 
+/** Adapter class for languages that only contain translations up to
  *  version 1.4.6
  */
 class TranslatorAdapter_1_4_6 : public TranslatorAdapter_1_5_4
@@ -264,18 +296,5 @@ class TranslatorAdapter_1_4_6 : public TranslatorAdapter_1_5_4
     }
 };
 
-/** Adapter class for languages that only contain translations upto 
- *  version 1.4.1
- */
-class TranslatorAdapter_1_4_1 : public TranslatorAdapter_1_4_6
-{
-  public:
-    virtual QCString updateNeededMessage()
-    { return createUpdateNeededMessage(idLanguage(),"release 1.4.1"); }
-    
-    virtual QCString trOverloadText()
-    { return english.trOverloadText(); }
-};
-
 #endif
 
index e1b88f1..d8ab0fd 100644 (file)
@@ -2,7 +2,7 @@
  *\r
  * \r
  *\r
- * Copyright (C) 1997-2012 by Dimitri van Heesch.\r
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.\r
  *\r
  * Permission to use, copy, modify, and distribute this software and its\r
  * documentation under the terms of the GNU General Public License is hereby \r
@@ -572,36 +572,38 @@ class TranslatorArmenian : public TranslatorAdapter_1_8_0
                                  ClassDef::CompoundType compType,\r
                                  bool isTemplate)\r
     {\r
-               QCString result=(QCString)clName;\r
-               if (isTemplate)\r
-               {                 \r
-                 switch(compType)\r
-                 {\r
-                       case ClassDef::Class:      result+=" Դասի"; break;\r
-                       case ClassDef::Struct:     result+=" Կառուցվածքի"; break;\r
-                       case ClassDef::Union:      result+=" Միավորման"; break;\r
-                       case ClassDef::Interface:  result+=" Ինտերֆեյսի"; break;\r
-                       case ClassDef::Protocol:   result+=" Արձանագրության"; break;\r
-                       case ClassDef::Category:   result+=" Դասակարգման"; break;\r
-                       case ClassDef::Exception:  result+=" Բացառության"; break;\r
-                 }\r
-                 result+=" Ձևանմուշներ";\r
-               }\r
-               else\r
-               {\r
-                 switch(compType)\r
-                 {\r
-                       case ClassDef::Class:      result+=" Դաս"; break;\r
-                       case ClassDef::Struct:     result+=" Կառուցվածք"; break;\r
-                       case ClassDef::Union:      result+=" Միավորում"; break;\r
-                       case ClassDef::Interface:  result+=" Ինտերֆեյս"; break;\r
-                       case ClassDef::Protocol:   result+=" Արձանագրություն"; break;\r
-                       case ClassDef::Category:   result+=" Դասակարգում"; break;\r
-                       case ClassDef::Exception:  result+=" Բացառություն"; break;\r
-                 }\r
-               }\r
-               return result;\r
-       }\r
+      QCString result=(QCString)clName;\r
+      if (isTemplate)\r
+      {                  \r
+        switch(compType)\r
+        {\r
+          case ClassDef::Class:      result+=" Դասի"; break;\r
+          case ClassDef::Struct:     result+=" Կառուցվածքի"; break;\r
+          case ClassDef::Union:      result+=" Միավորման"; break;\r
+          case ClassDef::Interface:  result+=" Ինտերֆեյսի"; break;\r
+          case ClassDef::Protocol:   result+=" Արձանագրության"; break;\r
+          case ClassDef::Category:   result+=" Դասակարգման"; break;\r
+          case ClassDef::Exception:  result+=" Բացառության"; break;\r
+          default: break;\r
+        }\r
+        result+=" Ձևանմուշներ";\r
+      }\r
+      else\r
+      {\r
+        switch(compType)\r
+        {\r
+          case ClassDef::Class:      result+=" Դաս"; break;\r
+          case ClassDef::Struct:     result+=" Կառուցվածք"; break;\r
+          case ClassDef::Union:      result+=" Միավորում"; break;\r
+          case ClassDef::Interface:  result+=" Ինտերֆեյս"; break;\r
+          case ClassDef::Protocol:   result+=" Արձանագրություն"; break;\r
+          case ClassDef::Category:   result+=" Դասակարգում"; break;\r
+          case ClassDef::Exception:  result+=" Բացառություն"; break;\r
+          default: break;\r
+        }\r
+      }\r
+      return result;\r
+    }\r
 \r
     /*! used as the title of the HTML page of a file */\r
     virtual QCString trFileReference(const char *fileName)\r
@@ -755,6 +757,7 @@ class TranslatorArmenian : public TranslatorAdapter_1_8_0
         case ClassDef::Protocol:   result+="արձանագրության"; break;\r
         case ClassDef::Category:   result+="դասակարգման"; break;\r
         case ClassDef::Exception:  result+="բացառության"; break;\r
+        default: break;\r
       }\r
       result+=" փաստագրությունը ստեղծվել է հետևյալ ֆայլ";\r
       if (single) result+="ից."; else result+="երից.";\r
@@ -1623,30 +1626,32 @@ class TranslatorArmenian : public TranslatorAdapter_1_8_0
       QCString result=(QCString)clName;\r
       if (!isTemplate) \r
       {\r
-               switch(compType)\r
-               {\r
-                 case ClassDef::Class:      result+=" Մոդուլ"; break;\r
-                 case ClassDef::Struct:     result+=" Տիպ"; break;\r
-                 case ClassDef::Union:      result+=" Միավորում"; break;\r
-                 case ClassDef::Interface:  result+=" Ինտերֆեյս"; break;\r
-                 case ClassDef::Protocol:   result+=" Արձանագրություն"; break;\r
-                 case ClassDef::Category:   result+=" Դասակարգում"; break;\r
-                 case ClassDef::Exception:  result+=" Բացառություն"; break;\r
-               }\r
+        switch(compType)\r
+        {\r
+          case ClassDef::Class:      result+=" Մոդուլ"; break;\r
+          case ClassDef::Struct:     result+=" Տիպ"; break;\r
+          case ClassDef::Union:      result+=" Միավորում"; break;\r
+          case ClassDef::Interface:  result+=" Ինտերֆեյս"; break;\r
+          case ClassDef::Protocol:   result+=" Արձանագրություն"; break;\r
+          case ClassDef::Category:   result+=" Դասակարգում"; break;\r
+          case ClassDef::Exception:  result+=" Բացառություն"; break;\r
+          default: break;\r
+        }\r
       }\r
       else\r
       {\r
-               switch(compType)\r
-               {\r
-                 case ClassDef::Class:      result+=" Մոդուլի"; break;\r
-                 case ClassDef::Struct:     result+=" Տիպի"; break;\r
-                 case ClassDef::Union:      result+=" Միավորման"; break;\r
-                 case ClassDef::Interface:  result+=" Ինտերֆեյսի"; break;\r
-                 case ClassDef::Protocol:   result+=" Արձանագրության"; break;\r
-                 case ClassDef::Category:   result+=" Դասակարգման"; break;\r
-                 case ClassDef::Exception:  result+=" Բացառության"; break;\r
-               }\r
-               result+=" Ձևանմուշ";\r
+        switch(compType)\r
+        {\r
+          case ClassDef::Class:      result+=" Մոդուլի"; break;\r
+          case ClassDef::Struct:     result+=" Տիպի"; break;\r
+          case ClassDef::Union:      result+=" Միավորման"; break;\r
+          case ClassDef::Interface:  result+=" Ինտերֆեյսի"; break;\r
+          case ClassDef::Protocol:   result+=" Արձանագրության"; break;\r
+          case ClassDef::Category:   result+=" Դասակարգման"; break;\r
+          case ClassDef::Exception:  result+=" Բացառության"; break;\r
+          default: break;\r
+        }\r
+        result+=" Ձևանմուշ";\r
       }\r
       return result;\r
     }\r
@@ -1710,6 +1715,7 @@ class TranslatorArmenian : public TranslatorAdapter_1_8_0
         case ClassDef::Protocol:   result+="արձանագրության"; break;\r
         case ClassDef::Category:   result+="դասակարգման"; break;\r
         case ClassDef::Exception:  result+="բացառության"; break;\r
+        default: break;\r
       }\r
       result+=" փաստագրությունը ստեղծվել է հետևալ ֆայլ";\r
       if (single) result+="ից."; else result+="երից.";\r
index 6738537..89be422 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -71,89 +71,89 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
     /*! return the language charset. This will be used for the HTML output */
     virtual QCString idLanguageCharset()
     {
-      return "cp1256";
+      return "utf-8";
     }
 
     // --- Language translation methods -------------------
 
     /*! used in the compound documentation before a list of related functions. */
     virtual QCString trRelatedFunctions()
-    { return "ÏæÇá ÐÇÊ ÕáÉ"; }
+    { return "دوال ذات صلة"; }
 
     /*! subscript for the related functions. */
     virtual QCString trRelatedSubscript()
-    { return "(áÇÍÙ Ãä åÐå ÇáÏæÇá áíÓÊ ÃÚÖÇÁ)"; }
+    { return "(لاحظ أن هذه الدوال ليست أعضاء)"; }
 
     /*! header that is put before the detailed description of files, classes and namespaces. */
     virtual QCString trDetailedDescription()
-    { return "æÕÝ ÊÝÕíáí"; }
+    { return "وصف تفصيلي"; }
 
     /*! header that is put before the list of typedefs. */
     virtual QCString trMemberTypedefDocumentation()
-    { return "ÊæËíÞ ÊÚÑíÝÇÊ ÇáäæÚ ÇáÃÚÖÇÁ"; }
+    { return "توثيق تعريفات النوع الأعضاء"; }
     
     /*! header that is put before the list of enumerations. */
     virtual QCString trMemberEnumerationDocumentation()
-    { return "ÊæËíÞ ÇáÚÏÏíÇÊ ÇáÃÚÖÇÁ"; }
+    { return "توثيق العدديات الأعضاء"; }
     
     /*! header that is put before the list of member functions. */
     virtual QCString trMemberFunctionDocumentation()
-    { return "ÊæËíÞ ÇáÏæÇá ÇáÃÚÖÇÁ"; }
+    { return "توثيق الدوال الأعضاء"; }
     
     /*! header that is put before the list of member attributes. */
     virtual QCString trMemberDataDocumentation()
     { 
       if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
       {
-        return "ÊæËíÞ ÇáÍÞá"; 
+        return "توثيق الحقل"; 
       }
       else
       {
-        return "ÊæËíÞ ÇáÈíÇä ÇáÚÖæ"; 
+        return "توثيق البيان العضو"; 
       }
     }
 
     /*! this is the text of a link put after brief descriptions. */
     virtual QCString trMore() 
-    { return "ÇáãÒíÏ ..."; }
+    { return "المزيد ..."; }
 
     /*! put in the class documentation */
     virtual QCString trListOfAllMembers()
-    { return "ÇÚÑÖ ßá ÇáÃÚÖÇÁ"; }
+    { return "اعرض كل الأعضاء"; }
 
     /*! used as the title of the "list of all members" page of a class */
     virtual QCString trMemberList()
-    { return "ÞÇÆãÉ ÇáÃÚÖÇÁ"; }
+    { return "قائمة الأعضاء"; }
 
     /*! this is the first part of a sentence that is followed by a class name */
     virtual QCString trThisIsTheListOfAllMembers()
-    { return "åÐå ÝÇÆãÉ Èßá ÇáÃÚÖÇÁ Ýí "; }
+    { return "هذه فائمة بكل الأعضاء في "; }
 
     /*! this is the remainder of the sentence after the class name */
     virtual QCString trIncludingInheritedMembers()
-    { return ", ãÊÖãäÉ ßá ÇáÃÚÖÇÁ ÇáãæÑæËÉ"; }
+    { return ", متضمنة كل الأعضاء الموروثة"; }
     
     /*! this is put at the author sections at the bottom of man pages.
      *  parameter s is name of the project name.
      */
     virtual QCString trGeneratedAutomatically(const char *s)
-    { QCString result="Êã ÊßæíäåÇ ÂáíÇ ÈæÇÓØÉ Doxygen";
-      if (s) result+=(QCString)" áÜ "+s;
-      result+=" ãä ãáÝÇÊ ÇáãÕÏÑ."; 
+    { QCString result="تم تكوينها آليا بواسطة Doxygen";
+      if (s) result+=(QCString)" لـ "+s;
+      result+=" من ملفات المصدر."; 
       return result;
     }
 
     /*! put after an enum name in the list of all members */
     virtual QCString trEnumName()
-    { return "ÇáÅÓã ÇáÚÏÏí"; }
+    { return "الإسم العددي"; }
     
     /*! put after an enum value in the list of all members */
     virtual QCString trEnumValue()
-    { return "ÇáÞíãÉ ÇáÚÏÏíÉ"; }
+    { return "القيمة العددية"; }
     
     /*! put after an undocumented member in the list of all members */
     virtual QCString trDefinedIn()
-    { return "ãÚÑÝ Ýí"; }
+    { return "معرف في"; }
 
     // quick reference sections
 
@@ -161,43 +161,43 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
      *  compounds or files (see the \\group command).
      */
     virtual QCString trModules()
-    { return "ãßæäÇÊ"; }
+    { return "مكونات"; }
     
     /*! This is put above each page as a link to the class hierarchy */
     virtual QCString trClassHierarchy()
-    { return "ÇáÔßá ÇáåÑãí ááÝÆÉ"; }
+    { return "الشكل الهرمي للفئة"; }
     
     /*! This is put above each page as a link to the list of annotated classes */
     virtual QCString trCompoundList()
     { 
       if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
       {
-        return "åíÇßá ÇáÈíÇäÇÊ";
+        return "هياكل البيانات";
       }
       else
       {
-        return "ÞÇÆãÉ ÇáÝÆÇÊ"; 
+        return "قائمة الفئات"; 
       }
     }
     
     /*! This is put above each page as a link to the list of documented files */
     virtual QCString trFileList()
-    { return "ÞÇÆãÉ ÇáãáÝÇÊ"; }
+    { return "قائمة الملفات"; }
 
     /*! This is put above each page as a link to the list of all verbatim headers */
     virtual QCString trHeaderFiles()
-    { return "ÇáãáÝÇÊ ÇáÑÃÓíÉ"; }
+    { return "الملفات الرأسية"; }
 
     /*! This is put above each page as a link to all members of compounds. */
     virtual QCString trCompoundMembers()
     { 
       if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
       {
-        return "ÍÞæá ÇáÈíÇäÇÊ"; 
+        return "حقول البيانات"; 
       }
       else
       {
-        return "ÃÚÖÇÁ ÇáÝÆÉ"; 
+        return "أعضاء الفئة"; 
       }
     }
 
@@ -206,38 +206,38 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
     { 
       if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
       {
-        return "ÇáÚæÇã"; 
+        return "العوام"; 
       }
       else
       {
-        return "ÃÚÖÇÁ ÇáãáÝ"; 
+        return "أعضاء الملف"; 
       }
     }
 
     /*! This is put above each page as a link to all related pages. */
     virtual QCString trRelatedPages()
-    { return "ÕÝÍÇÊ ÐÇÊ ÕáÉ"; }
+    { return "صفحات ذات صلة"; }
 
     /*! This is put above each page as a link to all examples. */
     virtual QCString trExamples()
-    { return "ÃãËáÉ"; }
+    { return "أمثلة"; }
 
     /*! This is put above each page as a link to the search engine. */
     virtual QCString trSearch()
-    { return "ÈÍË"; }
+    { return "بحث"; }
 
     /*! This is an introduction to the class hierarchy. */
     virtual QCString trClassHierarchyDescription()
-    { return "ÞÇÆãÉ ÇáÊæÇÑË åÐå Êã ÊÑÊíÈåÇ ÃÈÌÏíÇ ÈÕæÑÉ ÊÞÑíÈíÉ ¡ "
-             "æáßä áíÓ ÈÕæÑÉ ÊÇãÉ:";
+    { return "قائمة التوارث هذه تم ترتيبها أبجديا بصورة تقريبية ، "
+             "ولكن ليس بصورة تامة:";
     }
 
     /*! This is an introduction to the list with all files. */
     virtual QCString trFileListDescription(bool extractAll)
     {
-      QCString result="åÐå ÞÇÆãÉ Èßá ÇáãáÝÇÊ";
-      if (!extractAll) result+="ÇáãæËÞÉ ";
-         result+="ãÚ æÕÝ ãÎÊÕÑ :";
+      QCString result="هذه قائمة بكل الملفات";
+      if (!extractAll) result+="الموثقة ";
+         result+="مع وصف مختصر :";
       return result;
     }
 
@@ -247,53 +247,53 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
       
       if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
       {
-        return "åÐå åí åíÇßá ÇáÈíÇäÇÊ ãÚ æÕÝ ãÎÊÕÑ:"; 
+        return "هذه هي هياكل البيانات مع وصف مختصر:"; 
       }
       else
       {
-        return "åÐå åí ÇáÝÆÇÊ ¡ ÇáÈäÇÁÇÊ ¡"
-                       "ÇáÅÊÍÇÏÇÊ æÇáæÇÌåÇÊ ãÚ æÕÝ ãÎÊÕÑ:"; 
+        return "هذه هي الفئات ، البناءات ،"
+                       "الإتحادات والواجهات مع وصف مختصر:"; 
       }
     }
 
     /*! This is an introduction to the page with all class members. */
     virtual QCString trCompoundMembersDescription(bool extractAll)
     {
-      QCString result="åÐå ÞÇÆãÉ Èßá ";
+      QCString result="هذه قائمة بكل ";
       
       if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
       {
-        result+="ÍÞæá ÇáÈäÇÁÇÊ æÇáÅÊÍÇÏÇÊ";
+        result+="حقول البناءات والإتحادات";
       }
       else
       {
-        result+="ÃÚÖÇÁ ÇáÝÆÉ";
+        result+="أعضاء الفئة";
       }
          if (!extractAll)
       {
-        result+=" ÇáãæËÞÉ ";
+        result+=" الموثقة ";
       }
-      result+=" ãÚ æÕáÇÊ Åáì ";
+      result+=" مع وصلات إلى ";
       if (!extractAll) 
       {
         if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
         {
-          result+="ÊæËíÞ ÇáÈäÇÁ/ÇáÅÊÍÇÏ áßá ÍÞá:";
+          result+="توثيق البناء/الإتحاد لكل حقل:";
         }
         else
         {
-          result+="ÊæËíÞ ÇáÝÆÉ áßá ÚÖæ:";
+          result+="توثيق الفئة لكل عضو:";
         }
       }
       else 
       {
         if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
         {
-          result+="ÇáÈäÇÁÇÊ/ÇáÅÊÍÇÏÇÊ ÇáÊí íäÊãæä ÅáíåÇ:";
+          result+="البناءات/الإتحادات التي ينتمون إليها:";
         }
         else
         {
-          result+="ÇáÝÆÇÊ ÇáÊí íäÊãæä ÅáíåÇ:";
+          result+="الفئات التي ينتمون إليها:";
         }
       }
       return result;
@@ -327,40 +327,40 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
 
     /*! This is an introduction to the page with the list of all examples */
     virtual QCString trExamplesDescription()
-    { return "åÐå ÞÇÆãÉ Èßá ÇáÃãËáÉ:"; }
+    { return "هذه قائمة بكل الأمثلة:"; }
 
     /*! This is an introduction to the page with the list of related pages */
     virtual QCString trRelatedPagesDescription()
-    { return "åÐå ÞÇÆãÉ Èßá ÕÝÍÇÊ ÇáÊæËíÞ ÐÇÊ ÇáÕáÉ:"; }
+    { return "هذه قائمة بكل صفحات التوثيق ذات الصلة:"; }
 
     /*! This is an introduction to the page with the list of class/file groups */
     virtual QCString trModulesDescription()
-    { return "åÐå ÞÇÆãÉ Èßá ÇáãßæäÇÊ:"; }
+    { return "هذه قائمة بكل المكونات:"; }
 
     /*! This sentences is used in the annotated class/file lists if no brief
      * description is given. 
      */
     virtual QCString trNoDescriptionAvailable()
-    { return "áÇ íæÌÏ æÕÝ ãÊÇÍ"; }
+    { return "لا يوجد وصف متاح"; }
     
     // index titles (the project name is prepended for these) 
 
 
     /*! This is used in HTML as the title of index.html. */
     virtual QCString trDocumentation()
-    { return "ÇáÊæËíÞ"; }
+    { return "التوثيق"; }
 
     /*! This is used in LaTeX as the title of the chapter with the 
      * index of all groups.
      */
     virtual QCString trModuleIndex()
-    { return "ÝåÑÓ ÇáãßæäÇÊ"; }
+    { return "فهرس المكونات"; }
 
     /*! This is used in LaTeX as the title of the chapter with the 
      * class hierarchy.
      */
     virtual QCString trHierarchicalIndex()
-    { return "ÇáÝåÑÓ ÇáåÑãí"; }
+    { return "الفهرس الهرمي"; }
 
     /*! This is used in LaTeX as the title of the chapter with the 
      * annotated compound index.
@@ -369,11 +369,11 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
     {
       if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
       { 
-        return "ÝåÑÓ åíßá ÇáÈíÇäÇÊ";
+        return "فهرس هيكل البيانات";
       }
       else
       {
-        return "ÝåÑÓ ÇáÝÆÉ"; 
+        return "فهرس الفئة"; 
       }
     }
 
@@ -381,13 +381,13 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
      * list of all files.
      */
     virtual QCString trFileIndex() 
-    { return "ÝåÑÓ ÇáãáÝÇÊ"; }
+    { return "فهرس الملفات"; }
 
     /*! This is used in LaTeX as the title of the chapter containing
      *  the documentation of all groups.
      */
     virtual QCString trModuleDocumentation()
-    { return "ÊæËíÞ Çáãßæä"; }
+    { return "توثيق المكون"; }
 
     /*! This is used in LaTeX as the title of the chapter containing
      *  the documentation of all classes, structs and unions.
@@ -396,11 +396,11 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
     { 
       if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
       {
-        return "ÝåÑÓ åíßá ÇáÈíÇäÇÊ"; 
+        return "فهرس هيكل البيانات"; 
       }
       else
       {
-        return "ÝåÑÓ ÇáÝÆÉ"; 
+        return "فهرس الفئة"; 
       }
     }
 
@@ -408,29 +408,29 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
      *  the documentation of all files.
      */
     virtual QCString trFileDocumentation()
-    { return "ÊæËíÞ ÇáãáÝÇÊ"; }
+    { return "توثيق الملفات"; }
 
     /*! This is used in LaTeX as the title of the chapter containing
      *  the documentation of all examples.
      */
     virtual QCString trExampleDocumentation()
-    { return "ÊæËíÞ ÇáÃãËáÉ"; }
+    { return "توثيق الأمثلة"; }
 
     /*! This is used in LaTeX as the title of the chapter containing
      *  the documentation of all related pages.
      */
     virtual QCString trPageDocumentation()
-    { return "ÊæËíÞ ÇáÕÝÍÇÊ"; }
+    { return "توثيق الصفحات"; }
 
     /*! This is used in LaTeX as the title of the document */
     virtual QCString trReferenceManual()
-    { return "ÇáßÊíÈ ÇáãÑÌÚí"; }
+    { return "الكتيب المرجعي"; }
     
     /*! This is used in the documentation of a file as a header before the 
      *  list of defines
      */
     virtual QCString trDefines()
-    { return "ÇáÊÚÑíÝÇÊ"; }
+    { return "التعريفات"; }
 
     /*! This is used in the documentation of a file as a header before the 
      *  list of function prototypes
@@ -448,19 +448,19 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
      *  list of enumerations
      */
     virtual QCString trEnumerations()
-    { return "ÇáÚÏÏíÇÊ"; }
+    { return "العدديات"; }
 
     /*! This is used in the documentation of a file as a header before the 
      *  list of (global) functions
      */
     virtual QCString trFunctions()
-    { return "ÇáÏæÇá"; }
+    { return "الدوال"; }
 
     /*! This is used in the documentation of a file as a header before the 
      *  list of (global) variables
      */
     virtual QCString trVariables()
-    { return "ÇáãÊÛíÑÇÊ"; }
+    { return "المتغيرات"; }
 
     /*! This is used in the documentation of a file as a header before the 
      *  list of (global) variables
@@ -502,13 +502,13 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
      *  of documentation blocks for functions
      */
     virtual QCString trFunctionDocumentation()
-    { return "ÊæËíÞ ÇáÏÇáÉ"; }
+    { return "توثيق الدالة"; }
 
     /*! This is used in the documentation of a file/namespace before the list 
      *  of documentation blocks for variables
      */
     virtual QCString trVariableDocumentation()
-    { return "ÊæËíÞ ÇáãÊÛíÑ"; }
+    { return "توثيق المتغير"; }
 
     /*! This is used in the documentation of a file/namespace/group before 
      *  the list of links to documented compounds
@@ -517,11 +517,11 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
     { 
       if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
       {
-        return "åíÇßá ÇáÈíÇäÇÊ"; 
+        return "هياكل البيانات"; 
       }
       else
       {
-        return "ÇáÝÆÇÊ"; 
+        return "الفئات"; 
       }
     }
 
@@ -539,7 +539,7 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
      */
     virtual QCString trWrittenBy()
     {
-      return "ßÊÈ ÈæÇÓØÉ";
+      return "كتب بواسطة";
     }
 
     /*! this text is put before a class diagram */
@@ -550,7 +550,7 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
     
     /*! this text is generated when the \\internal command is used. */
     virtual QCString trForInternalUseOnly()
-    { return "ááÇÓÊÎÏÇã ÇáÏÇÎáí ÝÞØ."; }
+    { return "للاستخدام الداخلي فقط."; }
 
     /*! this text is generated when the \\reimp command is used. */
     virtual QCString trReimplementedForInternalReasons()
@@ -558,7 +558,7 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
 
     /*! this text is generated when the \\warning command is used. */
     virtual QCString trWarning()
-    { return "ÊäÈíå"; }
+    { return "تنبيه"; }
 
     /*! this text is generated when the \\bug command is used. */
     virtual QCString trBugsAndLimitations()
@@ -566,11 +566,11 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
 
     /*! this text is generated when the \\version command is used. */
     virtual QCString trVersion()
-    { return "ÅÕÏÇÑÉ"; }
+    { return "إصدارة"; }
 
     /*! this text is generated when the \\date command is used. */
     virtual QCString trDate()
-    { return "ÊÇÑíÎ"; }
+    { return "تاريخ"; }
 
     /*! this text is generated when the \\return command is used. */
     virtual QCString trReturns()
@@ -578,7 +578,7 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
 
     /*! this text is generated when the \\sa command is used. */
     virtual QCString trSeeAlso()
-    { return "ÇäÙÑ ÃíÖÇ"; }
+    { return "انظر أيضا"; }
 
     /*! this text is generated when the \\param command is used. */
     virtual QCString trParameters()
@@ -586,11 +586,11 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
 
     /*! this text is generated when the \\exception command is used. */
     virtual QCString trExceptions()
-    { return "ÇÓÊËäÇÁÇÊ"; }
+    { return "استثناءات"; }
     
     /*! this text is used in the title page of a LaTeX document. */
     virtual QCString trGeneratedBy()
-    { return "ÇäÊÌÊ ÈæÇÓØÉ"; }
+    { return "انتجت بواسطة"; }
 
 //////////////////////////////////////////////////////////////////////////
 // new since 0.49-990307
@@ -598,7 +598,7 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
     
     /*! used as the title of page containing all the index of all namespaces. */
     virtual QCString trNamespaceList()
-    { return "ÞÇÆãÉ ãÌÇáÇÊ ÇáÃÓãÇÁ"; }
+    { return "قائمة مجالات الأسماء"; }
 
     /*! used as an introduction to the namespace list */
     virtual QCString trNamespaceListDescription(bool extractAll)
@@ -644,6 +644,7 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
         case ClassDef::Protocol:   result+=" Protocol"; break;
         case ClassDef::Category:   result+=" Category"; break;
         case ClassDef::Exception:  result+=" Exception"; break;
+        default: break;
       }
       if (isTemplate) result+=" Template";
       result+=" Reference";
@@ -764,13 +765,13 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
      *  index of all namespaces.
      */
     virtual QCString trNamespaceIndex()
-    { return "ÝåÑÓ ãÌÇáÇÊ ÇáÃÓãÇÁ"; }
+    { return "فهرس مجالات الأسماء"; }
 
     /*! This is used in LaTeX as the title of the chapter containing
      *  the documentation of all namespaces.
      */
     virtual QCString trNamespaceDocumentation()
-    { return "ÊæËíÞ ãÌÇáÇÊ ÇáÃÓãÇÁ"; }
+    { return "توثيق مجالات الأسماء"; }
 
 //////////////////////////////////////////////////////////////////////////
 // new since 0.49-990522
@@ -780,7 +781,7 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
      *  namespaces in a file.
      */
     virtual QCString trNamespaces()
-    { return "ãÌÇáÇÊ ÇáÃÓãÇÁ"; }
+    { return "مجالات الأسماء"; }
 
 //////////////////////////////////////////////////////////////////////////
 // new since 0.49-990728
@@ -793,19 +794,20 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
         bool single)
     { // here s is one of " Class", " Struct" or " Union"
       // single is true implies a single file
-      QCString result=(QCString)"ÊæËíÞ   ";
+      QCString result=(QCString)"توثيق   ";
       switch(compType)
       {
-        case ClassDef::Class:      result+="åÐå ÇáÝÆÉ"; break;
-        case ClassDef::Struct:     result+="åÐÇ ÇáÈäÇÁ"; break;
-        case ClassDef::Union:      result+="åÐÇ ÇáÅÊÍÇÏ"; break;
-        case ClassDef::Interface:  result+="åÐå ÇáæÇÌåÉ"; break;
-        case ClassDef::Protocol:   result+="åÐÇ ÇáÈÑæÊæßæá"; break;
-        case ClassDef::Category:   result+="åÐÇ ÇáÊÕäíÝ"; break;
-        case ClassDef::Exception:  result+="åÐÇ ÇáÅÓÊËäÇÁ"; break;
+        case ClassDef::Class:      result+="هذه الفئة"; break;
+        case ClassDef::Struct:     result+="هذا البناء"; break;
+        case ClassDef::Union:      result+="هذا الإتحاد"; break;
+        case ClassDef::Interface:  result+="هذه الواجهة"; break;
+        case ClassDef::Protocol:   result+="هذا البروتوكول"; break;
+        case ClassDef::Category:   result+="هذا التصنيف"; break;
+        case ClassDef::Exception:  result+="هذا الإستثناء"; break;
+        default: break;
       }
-      result+=" Êã Êßæíäå ãä ";
-         if (single) result+="åÐÇ ÇáãáÝ:"; else result+="åÐå ÇáãáÝÇÊ:";
+      result+=" تم تكوينه من ";
+         if (single) result+="هذا الملف:"; else result+="هذه الملفات:";
       return result;
     }
 
@@ -813,7 +815,7 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
      * list.
      */
     virtual QCString trAlphabeticalList()
-    { return "ÞÇÆãÉ ÃÈÌÏíÉ"; }
+    { return "قائمة أبجدية"; }
 
 //////////////////////////////////////////////////////////////////////////
 // new since 0.49-990901
@@ -821,18 +823,18 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
 
     /*! This is used as the heading text for the retval command. */
     virtual QCString trReturnValues()
-    { return "Þíã ÇáÚæÏÉ"; }
+    { return "قيم العودة"; }
 
     /*! This is in the (quick) index as a link to the main page (index.html)
      */
     virtual QCString trMainPage()
-    { return "ÇáÕÝÍÉ ÇáÑÆíÓíÉ"; }
+    { return "الصفحة الرئيسية"; }
 
     /*! This is used in references to page that are put in the LaTeX 
      *  documentation. It should be an abbreviation of the word page.
      */
     virtual QCString trPageAbbreviation()
-    { return "Õ."; }
+    { return "ص."; }
 
 //////////////////////////////////////////////////////////////////////////
 // new since 0.49-991003
@@ -840,7 +842,7 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
 
     virtual QCString trSources()
     {
-      return "ãÕÇÏÑ";
+      return "مصادر";
     }
     virtual QCString trDefinedAtLineInSourceFile()
     {
@@ -867,68 +869,68 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
     /*! this text is put before a collaboration diagram */
     virtual QCString trCollaborationDiagram(const char *clName)
     {
-      return (QCString)"ÑÓã ÇáÊÚÇæä áÜ "+clName+":";
+      return (QCString)"رسم التعاون لـ "+clName+":";
     }
     /*! this text is put before an include dependency graph */
     virtual QCString trInclDepGraph(const char *fName)
     {
-      return (QCString)"ÑÓã ÇÚÊãÇÏíÉ ÇáÊÖãíä áÜ "+fName+":";
+      return (QCString)"رسم اعتمادية التضمين لـ "+fName+":";
     }
     /*! header that is put before the list of constructor/destructors. */
     virtual QCString trConstructorDocumentation()
     {
-      return "ÊæËíÞ ÏæÇá ÇáÈäÇÁ æÇáåÏã"; 
+      return "توثيق دوال البناء والهدم"; 
     }
     /*! Used in the file documentation to point to the corresponding sources. */
     virtual QCString trGotoSourceCode()
     {
-      return "ÇÐåÈ Åáì ÇáßæÏ ÇáÎÇÕ ÈåÐÇ ÇáãáÝ.";
+      return "اذهب إلى الكود الخاص بهذا الملف.";
     }
     /*! Used in the file sources to point to the corresponding documentation. */
     virtual QCString trGotoDocumentation()
     {
-      return "ÇÐåÈ Åáì ÊæËíÞ åÐÇ ÇáãáÝ.";
+      return "اذهب إلى توثيق هذا الملف.";
     }
     /*! Text for the \\pre command */
     virtual QCString trPrecondition()
     {
-      return "ÔÑØ ÓÇÈÞ";
+      return "شرط سابق";
     }
     /*! Text for the \\post command */
     virtual QCString trPostcondition()
     {
-      return "ÔÑØ áÇÍÞ";
+      return "شرط لاحق";
     }
     /*! Text for the \\invariant command */
     virtual QCString trInvariant()
     {
-      return "ËÇÈÊ";
+      return "ثابت";
     }
     /*! Text shown before a multi-line variable/enum initialization */
     virtual QCString trInitialValue()
     {
-               return "ÞíãÉ ãÈÏÆíÉ:";
+               return "قيمة مبدئية:";
     }
     /*! Text used the source code in the file index */
     virtual QCString trCode()
     {
-      return "ßæÏ";
+      return "كود";
     }
     virtual QCString trGraphicalHierarchy()
     {
-      return "ÇáÔßá ÇáÑÓæãí ááÝÆÇÊ";
+      return "الشكل الرسومي للفئات";
     }
     virtual QCString trGotoGraphicalHierarchy()
     {
-      return "ÇÐåÈ Åáì ÇáÔßá ÇáåÑãí ÇáÑÓæãí ááÝÆÇÊ";
+      return "اذهب إلى الشكل الهرمي الرسومي للفئات";
     }
     virtual QCString trGotoTextualHierarchy()
     {
-      return "ÇÐåÈ Åáì ÇáÔßá ÇáåÑãí ÇáäÕí ááÝÆÇÊ";
+      return "اذهب إلى الشكل الهرمي النصي للفئات";
     }
     virtual QCString trPageIndex()
     {
-      return "ÝåÑÓ ÇáÕÝÍÇÊ";
+      return "فهرس الصفحات";
     }
 
 //////////////////////////////////////////////////////////////////////////
@@ -937,50 +939,50 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
     
     virtual QCString trNote()
     {
-      return "ãáÇÍÙÇÊ";
+      return "ملاحظات";
     }
     virtual QCString trPublicTypes()
     {
-      return "ÃäæÇÚ ÚÇãÉ";
+      return "أنواع عامة";
     }
     virtual QCString trPublicAttribs()
     {
       if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
       {
-        return "ÍÞæá ÈíÇäÇÊ";
+        return "حقول بيانات";
       }
       else
       {
-        return "ÕÝÇÊ ÚÇãÉ";
+        return "صفات عامة";
       }
     }
     virtual QCString trStaticPublicAttribs()
     {
-      return "ÕÝÇÊ ÓÇßäÉ ÚÇãÉ";
+      return "صفات ساكنة عامة";
     }
     virtual QCString trProtectedTypes()
     {
-      return "ÃäæÇÚ ãÍãíÉ";
+      return "أنواع محمية";
     }
     virtual QCString trProtectedAttribs()
     {
-      return "ÕÝÇÊ ãÍãíÉ";
+      return "صفات محمية";
     }
     virtual QCString trStaticProtectedAttribs()
     {
-      return "ÕÝÇÊ ÓÇßäÉ ãÍãíÉ";
+      return "صفات ساكنة محمية";
     }
     virtual QCString trPrivateTypes()
     {
-      return "ÃäæÇÚ ÎÇÕÉ";
+      return "أنواع خاصة";
     }
     virtual QCString trPrivateAttribs()
     {
-      return "ÕÝÇÊ ÎÇÕÉ";
+      return "صفات خاصة";
     }
     virtual QCString trStaticPrivateAttribs()
     {
-      return "ÕÝÇÊ ÓÇßäÉ ÎÇÕÉ";
+      return "صفات ساكنة خاصة";
     }
 
 //////////////////////////////////////////////////////////////////////////
@@ -990,12 +992,12 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
     /*! Used as a marker that is put before a \\todo item */
     virtual QCString trTodo()
     {
-      return "ãåÇã";
+      return "مهام";
     }
     /*! Used as the header of the todo list */
     virtual QCString trTodoList()
     {
-      return "ÞÇÆãÉ ÇáãåÇã";
+      return "قائمة المهام";
     }
 
 //////////////////////////////////////////////////////////////////////////
@@ -1004,24 +1006,24 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
 
     virtual QCString trReferencedBy()
     {
-      return "ÐßÑ ÈæÇÓØÉ";
+      return "ذكر بواسطة";
     }
     virtual QCString trRemarks()
     {
-      return "ÊÚáíÞÇÊ";
+      return "تعليقات";
     }
     virtual QCString trAttention()
     {
-      return "ÇäÊÈå";
+      return "انتبه";
     }
     virtual QCString trInclByDepGraph()
     {
-      return "åÐÇ ÇáÑÓã íæÖÍ ÇáãáÝÇÊ ÇáÊí ÖãäÊ åÐÇ ÇáãáÝ"
-             "ÈÕæÑÉ ãÈÇÔÑÉ Ãæ ÛíÑ ãÈÇÔÑÉ:";
+      return "هذا الرسم يوضح الملفات التي ضمنت هذا الملف"
+             "بصورة مباشرة أو غير مباشرة:";
     }
     virtual QCString trSince()
     {
-      return "ãäÐ";
+      return "منذ";
     }
     
 //////////////////////////////////////////////////////////////////////////
@@ -1111,12 +1113,12 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
     /*! Used as a marker that is put before a test item */
     virtual QCString trTest()
     {
-      return "ÇÎÊÈÇÑ";
+      return "اختبار";
     }
     /*! Used as the header of the test list */
     virtual QCString trTestList()
     {
-      return "ÞÇÆãÉ ÇáÅÎÊÈÇÑÇÊ";
+      return "قائمة الإختبارات";
     }
 
 //////////////////////////////////////////////////////////////////////////
@@ -1136,12 +1138,12 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
     /*! Used as a section header for IDL properties */
     virtual QCString trProperties()
     {
-      return "ÎÕÇÆÕ";
+      return "خصائص";
     }
     /*! Used as a section header for IDL property documentation */
     virtual QCString trPropertyDocumentation()
     {
-      return "ÊæËíÞ ÇáÎÇÕíÉ";
+      return "توثيق الخاصية";
     }
 
 //////////////////////////////////////////////////////////////////////////
@@ -1151,49 +1153,49 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
     /*! Used for Java interfaces in the summary section of Java packages */
     virtual QCString trInterfaces()
     {
-      return "æÇÌåÇÊ";
+      return "واجهات";
     }
     /*! Used for Java classes in the summary section of Java packages */
     virtual QCString trClasses()
     {
       if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
       {
-        return "åíÇßá ÇáÈíÇäÇÊ";
+        return "هياكل البيانات";
       }
       else
       {
-        return "ÝÆÇÊ";
+        return "فئات";
       }
     }
     /*! Used as the title of a Java package */
     virtual QCString trPackage(const char *name)
     {
-      return (QCString)"ÍÒãÉ "+name;
+      return (QCString)"حزمة "+name;
     }
     /*! Title of the package index page */
     virtual QCString trPackageList()
     {
-      return "ÞÇÆãÉ ÇáÍÒã";
+      return "قائمة الحزم";
     }
     /*! The description of the package index page */
     virtual QCString trPackageListDescription()
     {
-               return "åÐå åí ÇáÍÒã ãÚ æÕÝ ãÎÊÕÑ áßá ãäåÇ )Åä æÌÏ( :";   
+               return "هذه هي الحزم مع وصف مختصر لكل منها )إن وجد( :";   
     }
     /*! The link name in the Quick links header for each page */
     virtual QCString trPackages()
     {
-      return "ÍÒã";
+      return "حزم";
     }
     /*! Used as a chapter title for Latex & RTF output */
     virtual QCString trPackageDocumentation()
     {
-      return "ÊæËíÞ ÇáÍÒã";
+      return "توثيق الحزم";
     }
     /*! Text shown before a multi-line define */
     virtual QCString trDefineValue()
     {
-               return "ÇáÞíãÉ:";
+               return "القيمة:";
     }
     
 //////////////////////////////////////////////////////////////////////////
@@ -1203,12 +1205,12 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
     /*! Used as a marker that is put before a \\bug item */
     virtual QCString trBug()
     {
-      return "ËÛÑÉ";
+      return "ثغرة";
     }
     /*! Used as the header of the bug list */
     virtual QCString trBugList()
     {
-      return "ÞÇÆãÉ ÇáËÛÑÇÊ";
+      return "قائمة الثغرات";
     }
 
 //////////////////////////////////////////////////////////////////////////
@@ -1251,13 +1253,13 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
      */
     virtual QCString trRTFCharSet()
     {
-      return "0";
+      return "178";
     }
 
     /*! Used as header RTF general index */
     virtual QCString trRTFGeneralIndex()
     {
-      return "ÝåÑÓ";
+      return "فهرس";
     }
    
     /*! This is used for translation of the word that will possibly
@@ -1266,8 +1268,8 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
      */
     virtual QCString trClass(bool /*first_capital*/, bool singular)
     { 
-      QCString result("ÝÆÉ");
-      if (!singular)  result="ÝÆÇÊ";
+      QCString result("فئة");
+      if (!singular)  result="فئات";
       return result; 
     }
 
@@ -1277,8 +1279,8 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
      */
     virtual QCString trFile(bool /*first_capital*/, bool singular)
     { 
-      QCString result("ãáÝ");
-      if (!singular)  result="ãáÝÇÊ";
+      QCString result("ملف");
+      if (!singular)  result="ملفات";
       return result; 
     }
 
@@ -1288,8 +1290,8 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
      */
     virtual QCString trNamespace(bool /*first_capital*/, bool singular)
     { 
-      QCString result("ãÌÇá ÃÓãÇÁ");
-      if (!singular)  result="ãÌÇáÇÊ ÃÓãÇÁ";
+      QCString result("مجال أسماء");
+      if (!singular)  result="مجالات أسماء";
       return result; 
     }
 
@@ -1299,8 +1301,8 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
      */
     virtual QCString trGroup(bool /*first_capital*/, bool singular)
     { 
-      QCString result("ãÌãæÚÉ");
-      if (!singular)  result="ãÌãæÚÇÊ";
+      QCString result("مجموعة");
+      if (!singular)  result="مجموعات";
       return result; 
     }
 
@@ -1310,8 +1312,8 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
      */
     virtual QCString trPage(bool /*first_capital*/, bool singular)
     { 
-      QCString result("ÕÝÍÉ");
-      if (!singular)  result="ÕÝÍÇÊ";
+      QCString result("صفحة");
+      if (!singular)  result="صفحات";
       return result; 
     }
 
@@ -1321,8 +1323,8 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
      */
     virtual QCString trMember(bool /*first_capital*/, bool singular)
     { 
-      QCString result("ÚÖæ");
-      if (!singular)  result="ÃÚÖÇÁ";
+      QCString result("عضو");
+      if (!singular)  result="أعضاء";
       return result; 
     }
    
@@ -1332,8 +1334,8 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
      */
     virtual QCString trField(bool /*first_capital*/, bool singular)
     { 
-      QCString result("ÍÞá");
-      if (!singular)  result="ÍÞæá";
+      QCString result("حقل");
+      if (!singular)  result="حقول";
       return result; 
     }
 
@@ -1343,8 +1345,8 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
      */
     virtual QCString trGlobal(bool /*first_capital*/, bool singular)
     { 
-      QCString result("ÚÇã");
-      if (!singular)  result="ÚæÇã";
+      QCString result("عام");
+      if (!singular)  result="عوام";
       return result; 
     }
 
@@ -1356,8 +1358,8 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
      *  for the author section in man pages. */
     virtual QCString trAuthor(bool /*first_capital*/, bool singular)
     {                                                                         
-      QCString result("ÇáãÄáÝ");
-      if (!singular)  result="ÇáãÄáÝæä";
+      QCString result("المؤلف");
+      if (!singular)  result="المؤلفون";
       return result; 
     }
 
@@ -1369,7 +1371,7 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
      */
     virtual QCString trReferences()
     {
-      return "ãÑÌÚíÇÊ";
+      return "مرجعيات";
     }
 
 //////////////////////////////////////////////////////////////////////////
@@ -1401,7 +1403,7 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
      */
     virtual QCString trRTFTableOfContents()
     {
-      return "ÌÏæá ÇáãÍÊæíÇÊ";
+      return "جدول المحتويات";
     }
 
 //////////////////////////////////////////////////////////////////////////
@@ -1425,12 +1427,12 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
      */
     virtual QCString trEvents()
     {
-      return "ÇáÃÍÏÇË";
+      return "الأحداث";
     }
     /*! Header used for the documentation section of a class' events. */
     virtual QCString trEventDocumentation()
     {
-      return "ÊæËíÞ ÇáÃÍÏÇË";
+      return "توثيق الأحداث";
     }
 
 //////////////////////////////////////////////////////////////////////////
@@ -1441,35 +1443,35 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
      */
     virtual QCString trPackageTypes()
     { 
-      return "ÃäæÇÚ ÇáÍÒãÉ";
+      return "أنواع الحزمة";
     }
     /*! Used as a heading for a list of Java class functions with package 
      * scope. 
      */
     virtual QCString trPackageMembers()
     { 
-      return "ÏæÇá ÇáÍÒãÉ";
+      return "دوال الحزمة";
     }
     /*! Used as a heading for a list of static Java class functions with 
      *  package scope.
      */
     virtual QCString trStaticPackageMembers()
     { 
-      return "ÏæÇá ÓÇßäÉ ááÍÒãÉ";
+      return "دوال ساكنة للحزمة";
     }
     /*! Used as a heading for a list of Java class variables with package 
      * scope.
      */
     virtual QCString trPackageAttribs()
     { 
-      return "ÎÕÇÆÕ ÇáÍÒãÉ";
+      return "خصائص الحزمة";
     }
     /*! Used as a heading for a list of static Java class variables with 
      * package scope.
      */
     virtual QCString trStaticPackageAttribs()
     { 
-      return "ÎÕÇÆÕ ÓÇßäÉ ááÍÒãÉ";
+      return "خصائص ساكنة للحزمة";
     }
     
 //////////////////////////////////////////////////////////////////////////
@@ -1481,12 +1483,12 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
      */
     virtual QCString trAll()
     {
-      return "Çáßá";
+      return "الكل";
     }
     /*! Put in front of the call graph for a function. */
     virtual QCString trCallGraph()
     {
-               return "åÐÇ åæ ÑÓã ÇáÇÓÊÏÚÇÁ áåÐå ÇáÏÇáÉ:";
+               return "هذا هو رسم الاستدعاء لهذه الدالة:";
     }
 
 //////////////////////////////////////////////////////////////////////////
@@ -1499,14 +1501,14 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
      */
     virtual QCString trSearchForIndex()
     {
-      return "ÈÍË Úä";
+      return "بحث عن";
     }
     /*! This string is used as the title for the page listing the search
      *  results.
      */
     virtual QCString trSearchResultsTitle()
     {
-      return "äÊÇÆÌ ÇáÈÍË";
+      return "نتائج البحث";
     }
     /*! This string is put just before listing the search results. The
      *  text can be different depending on the number of documents found.
@@ -1520,16 +1522,16 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
     {
       if (numDocuments==0)
       {
-        return "ÚÝæÇ ¡ áÇ íæÌÏ ÊæËíÞ ãáÇÆã áãÇ ÈÍËÊ Úäå.";
+        return "عفوا ، لا يوجد توثيق ملائم لما بحثت عنه.";
       }
       else if (numDocuments==1)
       {
-        return "æËíÞÉ ãäÇÓÈÉ áãÇ ÈÍËÊ Úäå. <b>1</b> Êã ÇáÚËæÑ Úáì.";
+        return "وثيقة مناسبة لما بحثت عنه. <b>1</b> تم العثور على.";
       }
       else 
       {
-        return "æËíÞÉ ãØÇÈÞÉ áãÇ ÈÍËÊ Úäå <b>$num</b> Êã ÅíÌÇÏ ."
-               "æÊã ÊÑÊíÈåã ÈÍíË íßæä ÇáÃÞÑÈ áäÊíÌÉ ÇáÈÍË ÃæáÇ.";
+        return "وثيقة مطابقة لما بحثت عنه <b>$num</b> تم إيجاد ."
+               "وتم ترتيبهم بحيث يكون الأقرب لنتيجة البحث أولا.";
       }
     }
     /*! This string is put before the list of matched words, for each search 
@@ -1537,7 +1539,7 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
      */
     virtual QCString trSearchMatches()
     {
-               return "íÊØÇÈÞ ãÚ:";
+               return "يتطابق مع:";
     }
 
 //////////////////////////////////////////////////////////////////////////
@@ -1548,7 +1550,7 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
      */
     virtual QCString trSourceFile(QCString& filename)
     {
-      return " ãáÝ ÇáãÕÏÑ" + filename ;
+      return " ملف المصدر" + filename ;
     }
 
 //////////////////////////////////////////////////////////////////////////
@@ -1559,33 +1561,33 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
      *  hierarchy.
      */
     virtual QCString trDirIndex()
-    { return "Ôßá åÑãí ááÃÏáÉ"; }
+    { return "شكل هرمي للأدلة"; }
 
     /*! This is used as the name of the chapter containing the documentation
      *  of the directories.
      */
     virtual QCString trDirDocumentation()
-    { return "ÊæËíÞ ÇáÃÏáÉ"; }
+    { return "توثيق الأدلة"; }
 
     /*! This is used as the title of the directory index and also in the
      *  Quick links of an HTML page, to link to the directory hierarchy.
      */
     virtual QCString trDirectories()
-    { return "ÇáÃÏáÉ"; }
+    { return "الأدلة"; }
 
     /*! This returns a sentences that introduces the directory hierarchy. 
      *  and the fact that it is sorted alphabetically per level
      */
     virtual QCString trDirDescription()
-    { return "åÐÇ ÇáÔßá ÇáåÑãí ááÃÏáÉ Êã ÊÑÊíÈå ÃÈÌÏíÇ ÈÕæÑÉ ÊÞÑíÈíÉ¡ "
-       "æáíÓ ÊÑÊíÈÇ ÃÈÌÏíÇ ßÇãáÇ:";
+    { return "هذا الشكل الهرمي للأدلة تم ترتيبه أبجديا بصورة تقريبية، "
+       "وليس ترتيبا أبجديا كاملا:";
     }
 
     /*! This returns the title of a directory page. The name of the
      *  directory is passed via \a dirName.
      */
     virtual QCString trDirReference(const char *dirName)
-    { QCString result=" ãÑÌÚ ÇáÏáíá"; result+=dirName; return result; }
+    { QCString result=" مرجع الدليل"; result+=dirName; return result; }
 
     /*! This returns the word directory with or without starting capital
      *  (\a first_capital) and in sigular or plural form (\a singular).
@@ -1606,9 +1608,9 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
      */
     virtual QCString trOverloadText()
     {
-       return "åÐå ÏÇáÉ ÚÖæ ÒÇÆÏÉ ÇáÊÍãíá ¡"
-              "æÌÏ ÃäåÇ ãáÇÆãÉ. ÅäåÇ ÊÎÊáÝ Úä ÇáÏÇáÉ ÃÚáÇå"
-              "ÝÞØ Ýí äæÚíÉ Çá argument(s) ÇáÊí ÊÞÈáåÇ.";
+       return "هذه دالة عضو زائدة التحميل ،"
+              "وجد أنها ملائمة. إنها تختلف عن الدالة أعلاه"
+              "فقط في نوعية ال argument(s) التي تقبلها.";
     }
 };
 
index 7a0fb76..e67ad9f 100644 (file)
@@ -1,5 +1,5 @@
 /******************************************************************************
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby
@@ -609,6 +609,7 @@ class TranslatorBrazilian : public TranslatorAdapter_1_8_0
         case ClassDef::Protocol:   result+=" Protocolo "; break;
         case ClassDef::Category:   result+=" Categoria "; break;
         case ClassDef::Exception:  result+=" Exceção "; break;
+        default: break;
       }
       result+=(QCString)clName;
       return result;
@@ -767,6 +768,7 @@ class TranslatorBrazilian : public TranslatorAdapter_1_8_0
         case ClassDef::Protocol:   result+="protocolo "; break;
         case ClassDef::Category:   result+="categoria "; break;
         case ClassDef::Exception:  result+="exceção "; break;
+        default: break;
       }
       result+=" foi gerada a partir ";
       if (single) result+="do seguinte arquivo:"; else result+="dos seguintes arquivos:";
@@ -1671,6 +1673,7 @@ class TranslatorBrazilian : public TranslatorAdapter_1_8_0
         case ClassDef::Protocol:   result+="do Protocolo "; break;
         case ClassDef::Category:   result+="da Categoria "; break;
         case ClassDef::Exception:  result+="da Exceção "; break;
+        default: break;
       }
       result += clName; 
      
@@ -1738,6 +1741,7 @@ class TranslatorBrazilian : public TranslatorAdapter_1_8_0
         case ClassDef::Protocol:   result+="esto protocolo "; break;
         case ClassDef::Category:   result+="esta categoria "; break;
         case ClassDef::Exception:  result+="esta exceção "; break;
+        default: break;
       }
       
       result+=" foi gerada a partir do";
index da76896..f888dc1 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -621,6 +621,7 @@ class TranslatorCatalan : public TranslatorAdapter_1_8_0
         case ClassDef::Protocol:   result+="l Protocol "; break;
         case ClassDef::Category:   result+=" la Categoria "; break;
         case ClassDef::Exception:  result+=" l'Excepció "; break;
+        default: break;
       }
       if (isTemplate) result+="Template ";
       result+=(QCString)clName;
@@ -780,6 +781,7 @@ class TranslatorCatalan : public TranslatorAdapter_1_8_0
         case ClassDef::Protocol:   result+=" protocol"; break;
         case ClassDef::Category:   result+="a categoria"; break;
         case ClassDef::Exception:  result+="a excepció"; break;
+        default: break;
       }
       result+=" es va generar a partir del";
       if (!single) result+="s";
@@ -1674,6 +1676,7 @@ class TranslatorCatalan : public TranslatorAdapter_1_8_0
         case ClassDef::Protocol:   result+="l Protocol "; break;
         case ClassDef::Category:   result+=" la Categoria "; break;
         case ClassDef::Exception:  result+=" l'Excepció "; break;
+        default: break;
       }
       if (isTemplate) result+="Template ";
       result+=(QCString)clName;
@@ -1745,6 +1748,7 @@ class TranslatorCatalan : public TranslatorAdapter_1_8_0
         case ClassDef::Protocol:   result+=" protocol"; break;
         case ClassDef::Category:   result+="a categoria"; break;
         case ClassDef::Exception:  result+="a excepció"; break;
+        default: break;
       }
       result+=" es va generar a partir del";
       if (!single) result+="s";
index 197cfe4..ba6e078 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -19,7 +19,7 @@
 #define TRANSLATOR_CN_H
 
 /*!
-   If you want insert a space whenever Chinese meets English charactors, set
+   If you want insert a space whenever Chinese meets English characters, set
    CN_SPC to " ", else null.
 */
 #define CN_SPC " "
@@ -30,7 +30,7 @@ class TranslatorChinese : public TranslatorAdapter_1_8_2
     /*! Used for identification of the language. The identification
      * should not be translated. It should be replaced by the name
      * of the language in English using lower-case characters only
-     * (e.g. "czech", "japanese", "russian", etc.). It sould be equal to
+     * (e.g. "czech", "japanese", "russian", etc.). It should be equal to
      * the identification used in the language.cpp.
      */
     
@@ -475,6 +475,7 @@ class TranslatorChinese : public TranslatorAdapter_1_8_2
         case ClassDef::Protocol:   result+="协议"; break;
         case ClassDef::Category:   result+="分类"; break;
         case ClassDef::Exception:  result+="异常"; break;
+        default: break;
       }
       result+=CN_SPC"参考";
       return result;
@@ -643,6 +644,7 @@ class TranslatorChinese : public TranslatorAdapter_1_8_2
         case ClassDef::Protocol:   result+="协议"; break;
         case ClassDef::Category:   result+="分类"; break;
         case ClassDef::Exception:  result+="异常"; break;
+        default: break;
       }
       result+="的文档由以下文件生成:";
       return result;
@@ -1609,6 +1611,7 @@ class TranslatorChinese : public TranslatorAdapter_1_8_2
         case ClassDef::Protocol:   result+=CN_SPC"协议"; break;
         case ClassDef::Category:   result+=CN_SPC"目录"; break;
         case ClassDef::Exception:  result+=CN_SPC"异常"; break;
+        default: break;
       }
       if (isTemplate) result+="模板"CN_SPC;
       result+="参考手册";
@@ -1683,6 +1686,7 @@ class TranslatorChinese : public TranslatorAdapter_1_8_2
         case ClassDef::Protocol:   result+=CN_SPC"协议"; break;
         case ClassDef::Category:   result+=CN_SPC"目录"; break;
         case ClassDef::Exception:  result+=CN_SPC"异常"; break;
+        default: break;
       }
       result+=CN_SPC"的文档由以下文件生成:";
       return result;
index c317cae..31d645f 100644 (file)
@@ -2,7 +2,7 @@
  *
  *
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby
@@ -84,7 +84,7 @@
 //    something else.  It is difficult to find the general translation
 //    for all kinds in the Czech language.
 
-class TranslatorCzech : public Translator
+class TranslatorCzech : public TranslatorAdapter_1_8_2
 {
   public:
     // --- Language control methods -------------------
@@ -657,6 +657,7 @@ class TranslatorCzech : public Translator
         case ClassDef::Protocol:   result += "protokolu "; break;
         case ClassDef::Category:   result += "kategorie "; break;
         case ClassDef::Exception:  result += "výjimky "; break;
+        default: break;
       }
       result += clName;
       return result;
@@ -829,6 +830,7 @@ class TranslatorCzech : public Translator
         case ClassDef::Protocol:   result+="tento protokol "; break;
         case ClassDef::Category:   result+="tuto kategorii "; break;
         case ClassDef::Exception:  result+="tuto výjimku"; break;
+        default: break;
       }
       result+=" byla generována z ";
       if (single) result+="následujícího souboru:";
@@ -1719,6 +1721,7 @@ class TranslatorCzech : public Translator
         case ClassDef::Protocol:   result += "protokolu "; break;
         case ClassDef::Category:   result += "kategorie "; break;
         case ClassDef::Exception:  result += "výjimky "; break;
+        default: break;
       }
       result += clName;
       return result;
@@ -1786,6 +1789,7 @@ class TranslatorCzech : public Translator
         case ClassDef::Protocol:   result+="k tomuto protokolu"; break;
         case ClassDef::Category:   result+="k této kategorii"; break;
         case ClassDef::Exception:  result+="k této výjimce"; break;
+        default: break;
       }
       result+=" byla vygenerována z ";
       if (single) result+="následujícího souboru:";
index 47fec53..ed9bf29 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
 #ifndef TRANSLATOR_DE_H
 #define TRANSLATOR_DE_H
 
-class TranslatorGerman : public Translator
+class TranslatorGerman : public TranslatorAdapter_1_8_2
 {
   public:
 
@@ -684,6 +684,7 @@ class TranslatorGerman : public Translator
         case ClassDef::Protocol:  result+="Protokoll"; break;
         case ClassDef::Category:  result+="Kategorie"; break; 
         case ClassDef::Exception:  result+="Ausnahmen"; break;
+        default: break;
       }
       result+="referenz";
       return result;
@@ -851,6 +852,7 @@ class TranslatorGerman : public Translator
         case ClassDef::Protocol:   result+="s Protokoll"; break; 
         case ClassDef::Category:   result+=" Kategorie"; break;
         case ClassDef::Exception:  result+=" Ausnahme"; break;
+        default: break;
       }
       result+=" wurde erzeugt aufgrund der Datei";
       if (single) result+=":"; else result+="en:";
@@ -1776,6 +1778,7 @@ class TranslatorGerman : public Translator
         case ClassDef::Protocol:   result+="Protokoll"; break;
         case ClassDef::Category:   result+="Kategorie"; break;
         case ClassDef::Exception:  result+="Ausnahmen"; break;
+        default: break;
       }
       if (isTemplate) result+="-Template";
       result+="-Referenz";
@@ -1844,6 +1847,7 @@ class TranslatorGerman : public Translator
         case ClassDef::Protocol:   result+="dieses Protokoll"; break;
         case ClassDef::Category:   result+="diese Kategorie"; break;
         case ClassDef::Exception:  result+="diese Ausnahme"; break;
+        default: break;
       }
       if (single)
         result+=" wurde aus der folgenden Datei erzeugt:";
index bf02402..6d17df5 100644 (file)
@@ -3,7 +3,7 @@
  *
  *
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby
@@ -632,6 +632,7 @@ class TranslatorDanish : public TranslatorAdapter_1_8_0
         case ClassDef::Protocol:   result+=" Protokol-"; break;
         case ClassDef::Category:   result+=" Kategori-"; break; // " Category-"
         case ClassDef::Exception:  result+=" Undtagelse-"; break;   //  " Exception"
+        default: break;
       }
       if (isTemplate) result+="skabelon-";  // "template-"
       result+="reference";
@@ -789,6 +790,7 @@ class TranslatorDanish : public TranslatorAdapter_1_8_0
         case ClassDef::Protocol:   result+="protokol"; break; // "protocol"
         case ClassDef::Category:   result+="kategori"; break; // "category"
         case ClassDef::Exception:  result+="undtagelse"; break;  // "exception"
+        default: break;
       }
       result+=" blev genereret ud fra fil";
       if (single) result+="en:"; else result+="erne:";
@@ -1604,6 +1606,7 @@ class TranslatorDanish : public TranslatorAdapter_1_8_0
         case ClassDef::Protocol:   result+=" Protocol"; break;      // " Protocol"
         case ClassDef::Category:   result+=" Kategori"; break;      // " Category"
         case ClassDef::Exception:  result+=" Undtagelse"; break; // " Exception"
+        default: break;
       }
       if (isTemplate) result+=" Template";
       result+=" Reference";
@@ -1673,6 +1676,7 @@ class TranslatorDanish : public TranslatorAdapter_1_8_0
         case ClassDef::Protocol:   result+="protokol"; break;     // "protocol"
         case ClassDef::Category:   result+="kategori"; break;     // "category"
         case ClassDef::Exception:  result+="undtagelse"; break;   // "exception"
+        default: break;
       }
       result+=" var lavet udfra følgende file";                   // " was generated from the following file"
       if (single) result+=":"; else result+="r:";                 // ":" / "s:"
index bc51760..1ab9921 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -621,6 +621,7 @@ class TranslatorEnglish : public Translator
         case ClassDef::Protocol:   result+=" Protocol"; break;
         case ClassDef::Category:   result+=" Category"; break;
         case ClassDef::Exception:  result+=" Exception"; break;
+        default: break;
       }
       if (isTemplate) result+=" Template";
       result+=" Reference";
@@ -779,6 +780,7 @@ class TranslatorEnglish : public Translator
         case ClassDef::Protocol:   result+="protocol"; break;
         case ClassDef::Category:   result+="category"; break;
         case ClassDef::Exception:  result+="exception"; break;
+        default: break;
       }
       result+=" was generated from the following file";
       if (single) result+=":"; else result+="s:";
@@ -1679,6 +1681,7 @@ class TranslatorEnglish : public Translator
         case ClassDef::Protocol:   result+=" Protocol"; break;
         case ClassDef::Category:   result+=" Category"; break;
         case ClassDef::Exception:  result+=" Exception"; break;
+        default: break;
       }
       if (isTemplate) result+=" Template";
       result+=" Reference";
@@ -1747,6 +1750,7 @@ class TranslatorEnglish : public Translator
         case ClassDef::Protocol:   result+="protocol"; break;
         case ClassDef::Category:   result+="category"; break;
         case ClassDef::Exception:  result+="exception"; break;
+        default: break;
       }
       result+=" was generated from the following file";
       if (single) result+=":"; else result+="s:";
@@ -1988,6 +1992,62 @@ class TranslatorEnglish : public Translator
     }
 
 //////////////////////////////////////////////////////////////////////////
+// new since 1.8.4
+//////////////////////////////////////////////////////////////////////////
+
+    /** old style UNO IDL services: implemented interfaces */
+    virtual QCString trInterfaces()
+    { return "Exported Interfaces"; }
+
+    /** old style UNO IDL services: inherited services */
+    virtual QCString trServices()
+    { return "Included Services"; }
+
+    /** UNO IDL constant groups */
+    virtual QCString trConstantGroups()
+    { return "Constant Groups"; }
+
+    /** UNO IDL constant groups */
+    virtual QCString trConstantGroupReference(const char *namespaceName)
+    {
+      QCString result=namespaceName;
+      result+=" Constant Group Reference";
+      return result;
+    }
+    /** UNO IDL service page title */
+    virtual QCString trServiceReference(const char *sName)
+    {
+      QCString result=(QCString)sName;
+      result+=" Service Reference";
+      return result;
+    }
+    /** UNO IDL singleton page title */
+    virtual QCString trSingletonReference(const char *sName)
+    {
+      QCString result=(QCString)sName;
+      result+=" Singleton Reference";
+      return result;
+    }
+    /** UNO IDL service page */
+    virtual QCString trServiceGeneratedFromFiles(bool single)
+    {
+      // single is true implies a single file
+      QCString result=(QCString)"The documentation for this service "
+                                "was generated from the following file";
+      if (single) result+=":"; else result+="s:";
+      return result;
+    }
+    /** UNO IDL singleton page */
+    virtual QCString trSingletonGeneratedFromFiles(bool single)
+    {
+      // single is true implies a single file
+      QCString result=(QCString)"The documentation for this singleton "
+                                "was generated from the following file";
+      if (single) result+=":"; else result+="s:";
+      return result;
+    }
+
+//////////////////////////////////////////////////////////////////////////
 
 };
 
index b4a077c..9c08d4c 100644 (file)
@@ -2,7 +2,7 @@
  *
  *
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby
@@ -42,7 +42,7 @@
  Translator class (by the local maintainer) when the localized
  translator is made up-to-date again.
 */
-class TranslatorEsperanto : public Translator
+class TranslatorEsperanto : public TranslatorAdapter_1_8_2
 {
   public:
 
@@ -623,6 +623,7 @@ class TranslatorEsperanto : public Translator
         case ClassDef::Protocol:   result+="protokolo "; break;
         case ClassDef::Category:   result+="kategorio "; break;
         case ClassDef::Exception:  result+="escepto "; break;
+        default: break;
       }
       result+=(QCString)clName;
       return result;
@@ -780,6 +781,7 @@ class TranslatorEsperanto : public Translator
         case ClassDef::Protocol:   result+="protokolo"; break;
         case ClassDef::Category:   result+="kategorio"; break;
         case ClassDef::Exception:  result+="escepto"; break;
+        default: break;
       }
       result+=" generitas el la ";
       if (single) result+="sekva dosiero:";
@@ -1679,6 +1681,7 @@ class TranslatorEsperanto : public Translator
         case ClassDef::Protocol:   result+="protokolo "; break;
         case ClassDef::Category:   result+="kategorio "; break;
         case ClassDef::Exception:  result+="escepto "; break;
+        default: break;
       }
       result+=(QCString)clName;
       return result;
@@ -1745,6 +1748,7 @@ class TranslatorEsperanto : public Translator
         case ClassDef::Protocol:   result+="protokolo"; break;
         case ClassDef::Category:   result+="kategorio"; break;
         case ClassDef::Exception:  result+="escepto"; break;
+        default: break;
       }
       result+=" kreiĝis el la ";
       if (single) result+="sekva dosiero:"; else result+="sekvaj dosieroj:";
index bdddeba..9d3ba1d 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -33,7 +33,7 @@
  * Updated to 1.8.2 by Bartomeu Creus Navarro (01-julio-2012)
  */
 
-class TranslatorSpanish : public Translator
+class TranslatorSpanish : public TranslatorAdapter_1_8_2
 {
   public:
 
@@ -613,6 +613,7 @@ class TranslatorSpanish : public Translator
         case ClassDef::Protocol:   result+="l Protocolo "; break;
         case ClassDef::Category:   result+=" la Categoria "; break;
         case ClassDef::Exception:  result+=" la Excepción "; break;
+        default: break;
       }
       result+=(QCString)clName;
       return result;
@@ -780,6 +781,7 @@ class TranslatorSpanish : public Translator
         case ClassDef::Protocol:   result+="e protocolo"; break;
         case ClassDef::Category:   result+="a categoría"; break;
         case ClassDef::Exception:  result+="a excepción"; break;
+        default: break;
       }
       result+=" fue generada a partir de";
       if (single) result+="l siguiente fichero:"; 
@@ -1737,6 +1739,7 @@ class TranslatorSpanish : public Translator
         case ClassDef::Protocol:   result+="l protocolo"; break;
         case ClassDef::Category:   result+=" la categoría"; break;
         case ClassDef::Exception:  result+=" la excepción"; break;
+        default: break;
       }
       result+=(QCString)clName;
       return result;
@@ -1805,6 +1808,7 @@ class TranslatorSpanish : public Translator
        case ClassDef::Protocol:   result+="e protocolo"; break;
        case ClassDef::Category:   result+="a categoría"; break;
        case ClassDef::Exception:  result+="a excepción"; break;
+        default: break;
       }
       result+=" fue generada de";
       if (single) result+="l siguiente fichero:";
index e74e123..d3c38a6 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -623,6 +623,7 @@ class TranslatorPersian : public TranslatorAdapter_1_7_5
         case ClassDef::Protocol:   result=" Protocol"; break;
         case ClassDef::Category:   result=" Category"; break;
         case ClassDef::Exception:  result=" استثناء"; break;
+        default: break;
       }
       if (isTemplate) result+=" قالب";
       result=QCString(clName) + " مرجع" +result ;
@@ -779,6 +780,7 @@ class TranslatorPersian : public TranslatorAdapter_1_7_5
         case ClassDef::Protocol:   result+="protocol"; break;
         case ClassDef::Category:   result+="category"; break;
         case ClassDef::Exception:  result+="exception"; break;
+        default: break;
       }
       result+=" از روی پرونده ";
       if (single) result+=""; else result+="های ";
@@ -1212,7 +1214,7 @@ class TranslatorPersian : public TranslatorAdapter_1_7_5
      */
     virtual QCString trRTFCharSet()
     {
-      return "0";
+      return "178";
     }
 
     /*! Used as header RTF general index */
@@ -1651,6 +1653,7 @@ class TranslatorPersian : public TranslatorAdapter_1_7_5
         case ClassDef::Protocol:   result+=" Protocol"; break;
         case ClassDef::Category:   result+=" Category"; break;
         case ClassDef::Exception:  result+=" Exception"; break;
+        default: break;
       }
       if (isTemplate) result+=" Template";
       result+=" Reference";
@@ -1708,6 +1711,7 @@ class TranslatorPersian : public TranslatorAdapter_1_7_5
         case ClassDef::Protocol:   result+="protocol"; break;
         case ClassDef::Category:   result+="category"; break;
         case ClassDef::Exception:  result+="exception"; break;
+        default: break;
       }
       result+=" was generated from the following file";
       if (single) result+=":"; else result+="s:";
index fdf4b94..3a9a890 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -95,7 +95,7 @@ class TranslatorFinnish : public TranslatorAdapter_1_6_0
      */
     /*virtual QCString updateNeededMessage()
     {
-      return "Warning: The Finnish translator is really obsolete.\n"
+      return "The Finnish translator is really obsolete.\n"
              "It was not updated since version 1.0.0.  As a result,\n"
              "some sentences may appear in English.\n\n";
     }*/
@@ -686,6 +686,7 @@ class TranslatorFinnish : public TranslatorAdapter_1_6_0
         case ClassDef::Protocol:   result+=" protokolla"; break; // " Protocol"
         case ClassDef::Category:   result+=" kategoria"; break; // " Category"
         case ClassDef::Exception:  result+=" poikkeus"; break; // " Exception"
+        default: break;
       }
       if (isTemplate) result+="malli"; // " Template"
       result+="referenssi"; // " Reference"
@@ -845,6 +846,7 @@ class TranslatorFinnish : public TranslatorAdapter_1_6_0
         case ClassDef::Protocol:   result+="protokollalle"; break; // "protocol"
         case ClassDef::Category:   result+="kategorialle"; break; // "category"
         case ClassDef::Exception:  result+="poikkeukselle"; break; // "exception"
+        default: break;
       }
       if (single) result+=" luotiin seuraavasta tiedostosta:"; // " was generated from the following file"
       else result+=" luotiin seuraavista tiedostoista:"; // ":" or "s:"
@@ -1799,6 +1801,7 @@ class TranslatorFinnish : public TranslatorAdapter_1_6_0
         case ClassDef::Protocol:   result+=" protokolla"; break; // " Protocol"
         case ClassDef::Category:   result+=" kategoria"; break; // " Category"
         case ClassDef::Exception:  result+=" poikkeus"; break; // " Exception"
+        default: break;
       }
       if (isTemplate) result+="malli"; // " Template"
       result+="referenssi"; // " Reference"
@@ -1866,6 +1869,7 @@ class TranslatorFinnish : public TranslatorAdapter_1_6_0
         case ClassDef::Protocol:   result+="protokollalle"; break; // "protocol"
         case ClassDef::Category:   result+="kategorialle"; break; // "category"
         case ClassDef::Exception:  result+="poikkeukselle"; break; // "exception"
+        default: break;
       }
       result+=" luotiin "; // " was generated from the following file"
       if (single) result+="seuraavasta tiedostosta:"; else result+="seuraavista tiedostoista:"; // ":" / "s:"
index 05bd4d8..8befead 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -679,6 +679,7 @@ class TranslatorFrench : public TranslatorAdapter_1_8_0
             case ClassDef::Protocol:   result+="le protocol "; break; 
             case ClassDef::Category:   result+="la catégorie "; break; 
             case ClassDef::Exception:  result+="l'exception "; break;
+            default: break;
          }
          result+=(QCString)clName;
          return result;
@@ -838,6 +839,7 @@ class TranslatorFrench : public TranslatorAdapter_1_8_0
             case ClassDef::Protocol:   result+="ce protocol"; female = false; break;
             case ClassDef::Category:   result+="cette catégorie"; break; 
             case ClassDef::Exception:  result+="cette exception"; break;
+            default: break;
          }
          if (female) result+= " a été générée à partir ";
          else result+=" a été généré à partir ";
@@ -1739,6 +1741,7 @@ class TranslatorFrench : public TranslatorAdapter_1_8_0
         case ClassDef::Protocol:   result+="du protocole "; break;
         case ClassDef::Category:   result+="de la catégorie "; break;
         case ClassDef::Exception:  result+="de l'exception "; break;
+        default: break;
       }
       result+=(QCString)clName;
       return result;
@@ -1806,6 +1809,7 @@ class TranslatorFrench : public TranslatorAdapter_1_8_0
         case ClassDef::Protocol:   result+="ce protocole"; break;
         case ClassDef::Category:   result+="cette catégorie"; break;
         case ClassDef::Exception:  result+="cette exception"; break;
+        default: break;
       }
       result+=" a été générée à partir ";
       if (single) result+="du fichier suivant :"; else result+="des fichiers suivants :";
index 95072a3..636da39 100644 (file)
@@ -2,7 +2,7 @@
  *
  *
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby
  * 15 Dec 2001 : Translation to greek by
  *               Harry Kalogirou <no email>
  *
- * 01 Jan 2009 : Greek maintainance by
+ * 01 Jan 2009 : Greek maintenance by
  *               Paul Gessos <gessos.paul@yahoo.gr>
  */
 
 #ifndef TRANSLATOR_GR_H
 #define TRANSLATOR_GR_H
 
-class TranslatorGreek : public Translator
+class TranslatorGreek : public TranslatorAdapter_1_8_2
 {
   public:
 
@@ -593,8 +593,9 @@ class TranslatorGreek : public Translator
         case ClassDef::Protocol:   result+=" Πρωτοκόλλου "; break;
         case ClassDef::Category:   result+=" Κατηγορίας "; break;
         case ClassDef::Exception:  result+=" Εξαίρεσης "; break;
+        default: break;
       }
-         result+=clName;
+      result+=clName;
       return result;
     }
 
@@ -751,6 +752,7 @@ class TranslatorGreek : public Translator
         case ClassDef::Protocol:   result+="αυτό το πρωτόκολλο"; break;
         case ClassDef::Category:   result+="αυτή την κατηγορία"; break;
         case ClassDef::Exception:  result+="αυτή την εξαίρεση"; break;
+        default: break;
       }
       result+=" δημιουργήθηκε απο τ";
       if (single) result+="ο ακόλουθο αρχείο:"; else result+="α ακόλουθα αρχεία:";
@@ -1183,11 +1185,10 @@ class TranslatorGreek : public Translator
 
 
     /*! Used as ansicpg for RTF fcharset
-     *  \see trRTFansicp() for a table of possible values.
      */
     virtual QCString trRTFCharSet()
     {
-      return "0";
+      return "161";
     }
 
     /*! Used as header RTF general index */
@@ -1651,6 +1652,7 @@ class TranslatorGreek : public Translator
         case ClassDef::Protocol:   result+=" Πρωτόκολλο"; break;
         case ClassDef::Category:   result+=" Κατηγορία"; break;
         case ClassDef::Exception:  result+=" Εξαίρεση"; break;
+        default: break;
       }
       if (isTemplate) result+=" Πρότυπο";
       result+=" Δήλωση";
@@ -1718,6 +1720,7 @@ class TranslatorGreek : public Translator
         case ClassDef::Protocol:   result+="αυτό το πρωτόκολλο"; break;
         case ClassDef::Category:   result+="αυτή την κατηγορία"; break;
         case ClassDef::Exception:  result+="αυτή την εξαίρεση"; break;
+        default: break;
       }
       result+=" δημιουργήθηκε από ";
       if (single) result+="το παρακάτω αρχείο:"; else result+="τα παρακάτω αρχεία:";
index 6c22919..bb124dd 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -18,7 +18,7 @@
 // Updates:
 // --------
 // 2000/08/20 
-//  - Better handling of ISO-8859-2/ WIN 1250 stuff based on (actualy stolen from :-)) Czech translations
+//  - Better handling of ISO-8859-2/ WIN 1250 stuff based on (actually stolen from :-)) Czech translations
 //    implemented by Petr Prikryl (prikrylp@skil.cz).
 //    As opposed to Czech translation this one assumes that Doxygen strings are written in Linux ( it's true,
 //    I don't have QT pro licence ) , and uses ISOToWin function when built in WIN32
@@ -367,9 +367,9 @@ class TranslatorCroatian : public TranslatorAdapter_1_8_2
         case ClassDef::Protocol:   result+=" protokola "; break; 
         case ClassDef::Category:   result+=" kategorije "; break; 
         case ClassDef::Exception:  result+=" iznimke (exception) "; break;
+        default: break;
       }
-          result += clName;
-      
+      result += clName;
       return result;
     }
     QCString trFileReference(const char *fileName)
@@ -517,6 +517,7 @@ class TranslatorCroatian : public TranslatorAdapter_1_8_2
         case ClassDef::Protocol:   result+="protokola"; break; 
         case ClassDef::Category:   result+="kategorije"; break; 
         case ClassDef::Exception:  result+="iznimke (exception)"; break;
+        default: break;
       }
       result+=" je napravljena iz " + trFile(FALSE, single) + ": ";
          return result;
@@ -1359,13 +1360,14 @@ class TranslatorCroatian : public TranslatorAdapter_1_8_2
       QCString result=(QCString)clName;
       switch(compType)
       {
-      case ClassDef::Class:      result+=" Modul"; break;
-      case ClassDef::Struct:     result+=" Tip"; break;
-      case ClassDef::Union:      result+=" Unija"; break;
-      case ClassDef::Interface:  result+=" Sučelje"; break;
-      case ClassDef::Protocol:   result+=" Protokol"; break;
-      case ClassDef::Category:   result+=" Kategorija"; break;
-      case ClassDef::Exception:  result+=" Iznimka"; break;
+        case ClassDef::Class:      result+=" Modul"; break;
+        case ClassDef::Struct:     result+=" Tip"; break;
+        case ClassDef::Union:      result+=" Unija"; break;
+        case ClassDef::Interface:  result+=" Sučelje"; break;
+        case ClassDef::Protocol:   result+=" Protokol"; break;
+        case ClassDef::Category:   result+=" Kategorija"; break;
+        case ClassDef::Exception:  result+=" Iznimka"; break;
+        default: break;
       }
       if (isTemplate) result+=" Predložak";
       result+=" Referenca";
@@ -1426,13 +1428,14 @@ class TranslatorCroatian : public TranslatorAdapter_1_8_2
       QCString result=(QCString)"Dokumentacija ovog ";
       switch(compType)
       {
-      case ClassDef::Class:      result+="modula"; break;
-      case ClassDef::Struct:     result+="tipa"; break;
-      case ClassDef::Union:      result+="unije"; break;
-      case ClassDef::Interface:  result+="sučelja"; break;
-      case ClassDef::Protocol:   result+="protokola"; break;
-      case ClassDef::Category:   result+="kategorije"; break;
-      case ClassDef::Exception:  result+="iznimke"; break;
+        case ClassDef::Class:      result+="modula"; break;
+        case ClassDef::Struct:     result+="tipa"; break;
+        case ClassDef::Union:      result+="unije"; break;
+        case ClassDef::Interface:  result+="sučelja"; break;
+        case ClassDef::Protocol:   result+="protokola"; break;
+        case ClassDef::Category:   result+="kategorije"; break;
+        case ClassDef::Exception:  result+="iznimke"; break;
+        default: break;
       }
       result+=" je napravljena iz :";
       return result;
index 3bed223..58cb0d5 100644 (file)
@@ -1,8 +1,6 @@
 /******************************************************************************
  *
- * 
- *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -604,6 +602,7 @@ class TranslatorHungarian : public TranslatorAdapter_1_4_6
         case ClassDef::Protocol:   result+=" protocol"; break; // translate me!
         case ClassDef::Category:   result+=" category"; break; // translate me!
         case ClassDef::Exception:  result+=" kivétel"; break;
+        default: break;
       }
       if (isTemplate) result+="sablon-";
       result+="referencia";
@@ -763,6 +762,7 @@ class TranslatorHungarian : public TranslatorAdapter_1_4_6
         case ClassDef::Protocol:   result+="protocol"; break; // translate me!
         case ClassDef::Category:   result+="category"; break; // translate me!
         case ClassDef::Exception:  result+="a kivételrõl"; break;
+        default: break;
       }
       result+=" a következõ fájl";
       if (!single) result+="ok";
index cf9a475..18e561a 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -603,6 +603,7 @@ class TranslatorIndonesian : public TranslatorAdapter_1_8_0
         case ClassDef::Protocol:   result+=" Protokol "; break;
         case ClassDef::Category:   result+=" Kategori "; break;
         case ClassDef::Exception:  result+=" Eksepsi "; break;
+        default: break;
       }
       if (isTemplate) result+=" Template ";
       result+=(QCString)clName;
@@ -762,6 +763,7 @@ class TranslatorIndonesian : public TranslatorAdapter_1_8_0
         case ClassDef::Protocol:   result+="protokol"; break;
         case ClassDef::Category:   result+="kategori"; break;
         case ClassDef::Exception:  result+="eksepsi"; break;
+        default: break;
       }
       result+=" ini dibangkitkan dari file";
       result+=single ? "" : "-file";
@@ -1658,6 +1660,7 @@ class TranslatorIndonesian : public TranslatorAdapter_1_8_0
         case ClassDef::Protocol:   result+="Protokol "; break;
         case ClassDef::Category:   result+="Kategori "; break;
         case ClassDef::Exception:  result+="Eksepsi "; break;
+        default: break;
       }
       result+=(QCString)clName;
       return result;
@@ -1724,6 +1727,7 @@ class TranslatorIndonesian : public TranslatorAdapter_1_8_0
         case ClassDef::Protocol:   result+="protocol"; break;
         case ClassDef::Category:   result+="category"; break;
         case ClassDef::Exception:  result+="exception"; break;
+        default: break;
       }
       result+=" ini dibangkitkan dari file";
       if (!single) result+="-file ";
index 701c7ec..db8bd81 100644 (file)
@@ -2,7 +2,7 @@
  *
  *
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby
@@ -51,7 +51,7 @@
  *  2001/05: adopted new translation mechanism (trough adapters),
  *           translated new items used since version 1.2.5 and 1.2.6,
  *           revised those function returning strings in OPTIMIZE_OTPUT_FOR_C case,
- *           corrections regarding the plurals of some english terms mantained in the translation,
+ *           corrections regarding the plurals of some english terms maintained in the translation,
  *           changed some terms to better suit the sense
  *  2001/02: translated new items used since version 1.2.4
  *  2000/11: modified slightly the translation in trLegendDocs() function,
@@ -633,6 +633,7 @@ class TranslatorItalian : public TranslatorAdapter_1_8_2
         case ClassDef::Protocol:   result+="il protocollo "; break;
         case ClassDef::Category:   result+="la categoria "; break;
         case ClassDef::Exception:  result+="l'eccezione "; break;
+        default: break;
       }
       result+=(QCString)clName;
       return result;
@@ -794,6 +795,7 @@ class TranslatorItalian : public TranslatorAdapter_1_8_2
         case ClassDef::Protocol:   result+="o protocollo"; break;
         case ClassDef::Category:   result+="a categoria"; break;
         case ClassDef::Exception:  result+="a eccezione"; break;
+        default: break;
       }
       result+=" è stata generata a partire ";
       if (single) result+="dal seguente file:";
@@ -1657,6 +1659,7 @@ class TranslatorItalian : public TranslatorAdapter_1_8_2
         case ClassDef::Protocol:   result+=" il protocollo"; break;
         case ClassDef::Category:   result+=" la categoria"; break;
         case ClassDef::Exception:  result+=" l'eccezione"; break;
+        default: break;
       }
       result+=(QCString)clName;
       return result;
@@ -1725,6 +1728,7 @@ class TranslatorItalian : public TranslatorAdapter_1_8_2
         case ClassDef::Protocol:   result+="o protocollo"; break;
         case ClassDef::Category:   result+="a categoria"; break;
         case ClassDef::Exception:  result+="a eccezione"; break;
+        default: break;
       }
       result+=" è stata generata a partire ";
       if (single) result+="dal seguente file:"; else result+="dai seguenti file:";
index 09bb066..c6bfdcb 100644 (file)
@@ -2,7 +2,7 @@
  *
  *
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby
index 8278abe..418d6bb 100644 (file)
@@ -2,7 +2,7 @@
  *
  *
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby
@@ -601,6 +601,7 @@ class TranslatorJapanese : public TranslatorAdapter_1_6_0
         case ClassDef::Protocol:   result+=decode("¥×¥í¥È¥³¥ë "); break;
         case ClassDef::Category:   result+=decode("¥«¥Æ¥´¥ê "); break;
         case ClassDef::Exception:  result+=decode("Îã³° "); break;
+        default: break;
       }
       if (isTemplate) result+=decode("¥Æ¥ó¥×¥ì¡¼¥È ");
       result+=(QCString)clName;
@@ -759,6 +760,7 @@ class TranslatorJapanese : public TranslatorAdapter_1_6_0
         case ClassDef::Protocol:   result+=decode("¥×¥í¥È¥³¥ë"); break;
         case ClassDef::Category:   result+=decode("¥«¥Æ¥´¥ê"); break;
         case ClassDef::Exception:  result+=decode("Îã³°"); break;
+        default: break;
       }
       result+=decode("¤ÎÀâÌÀ¤Ï¼¡¤Î¥Õ¥¡¥¤¥ë¤«¤éÀ¸À®¤µ¤ì¤Þ¤·¤¿:");
       return result;
@@ -1660,6 +1662,7 @@ class TranslatorJapanese : public TranslatorAdapter_1_6_0
         case ClassDef::Protocol:   result+=decode("¥×¥í¥È¥³¥ë "); break;
         case ClassDef::Category:   result+=decode("¥«¥Æ¥´¥ê "); break;
         case ClassDef::Exception:  result+=decode("Îã³° "); break;
+        default: break;
       }
       if (isTemplate) result += decode("¥Æ¥ó¥×¥ì¡¼¥È ");
       result+=(QCString)clName;
@@ -1720,6 +1723,7 @@ class TranslatorJapanese : public TranslatorAdapter_1_6_0
         case ClassDef::Protocol:   result+=decode("¥×¥í¥È¥³¥ë"); break;
         case ClassDef::Category:   result+=decode("¥«¥Æ¥´¥ê"); break;
         case ClassDef::Exception:  result+=decode("Îã³°"); break;
+        default: break;
       }
       result+=decode(decode("¤ÎÀâÌÀ¤Ï¼¡¤Î¥Õ¥¡¥¤¥ë¤«¤éÀ¸À®¤µ¤ì¤Þ¤·¤¿:"));
       return result;
index 4874a5c..f089d38 100644 (file)
@@ -2,7 +2,7 @@
  *
  *
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby
index 3158405..a1ae9ea 100644 (file)
@@ -1,8 +1,6 @@
 /******************************************************************************
  *
- * 
- *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -643,6 +641,7 @@ class TranslatorKorean : public TranslatorAdapter_1_7_5
         case ClassDef::Protocol:   result+=" ÇÁ·ÎÅäÄÝ"; break;
         case ClassDef::Category:   result+=" Ä«Å×°í¸®"; break;
         case ClassDef::Exception:  result+=" ¿¹¿Ü"; break;
+        default: break;
       }
       if (isTemplate) result+=" ÅÛÇø´";
       result+=" ÂüÁ¶";
@@ -802,6 +801,7 @@ class TranslatorKorean : public TranslatorAdapter_1_7_5
         case ClassDef::Protocol:   result+="ÇÁ·ÎÅäÄÝ"; break;
         case ClassDef::Category:   result+="Ä«Å×°í¸®"; break;
         case ClassDef::Exception:  result+="¿¹¿Ü"; break;
+        default: break;
       }
       result+="¿¡ ´ëÇÑ ¹®¼­È­ ÆäÀÌÁö´Â ´ÙÀ½ÀÇ ÆÄÀÏ";
       if (!single) result+="µé";
@@ -1693,6 +1693,7 @@ class TranslatorKorean : public TranslatorAdapter_1_7_5
         case ClassDef::Protocol:   result+=" ÇÁ·ÎÅäÄÝ"; break;
         case ClassDef::Category:   result+=" Ä«Å×°í¸®"; break;
         case ClassDef::Exception:  result+=" ¿¹¿Ü"; break;
+        default: break;
       }
       if (isTemplate) result+=" ÅÛÇø´";
       result+=" ÂüÁ¶";
@@ -1763,6 +1764,7 @@ class TranslatorKorean : public TranslatorAdapter_1_7_5
         case ClassDef::Protocol:   result+="ÇÁ·ÎÅäÄÝ"; break;
         case ClassDef::Category:   result+="Ä«Å×°í¸®"; break;
         case ClassDef::Exception:  result+="¿¹¿Ü"; break;
+        default: break;
       }
       result+="ÀÇ ¹®¼­È­ ÆäÀÌÁö:";
       return result;
@@ -1936,6 +1938,125 @@ class TranslatorKorean : public TranslatorAdapter_1_7_5
     { return "Ãß°¡·Î »ó¼ÓµÈ ¸â¹öµé"; }
 
 //////////////////////////////////////////////////////////////////////////
+// new since 1.8.2
+//////////////////////////////////////////////////////////////////////////
+
+    /*! Used as a tooltip for the toggle button that appears in the
+     *  navigation tree in the HTML output when GENERATE_TREEVIEW is 
+     *  enabled. This tooltip explains the meaning of the button.
+     */
+    virtual QCString trPanelSynchronisationTooltip(bool enable)
+    {
+      QCString opt = enable ? "È°¼ºÈ­" : "ºñÈ°¼ºÈ­";
+      return "ÆгΠµ¿±âÈ­¸¦ "+opt+"Çϱâ À§ÇؠŬ¸¯ÇϽʽÿÀ";
+    }
+
+    /*! Used in a method of an Objective-C class that is declared in a
+     *  a category. Note that the @1 marker is required and is replaced
+     *  by a link.
+     */
+    virtual QCString trProvidedByCategory()
+    {
+      return "Ä«Å×°í¸® @1¿¡ ÀÇÇØ Á¦°øµÊ.";
+    }
+
+    /*! Used in a method of an Objective-C category that extends a class.
+     *  Note that the @1 marker is required and is replaced by a link to
+     *  the class method.
+     */
+    virtual QCString trExtendsClass()
+    {
+      return "Ŭ·¡½º @1 È®Àå.";
+    }
+
+    /*! Used as the header of a list of class methods in Objective-C.
+     *  These are similar to static public member functions in C++.
+     */
+    virtual QCString trClassMethods()
+    {
+      return "Ŭ·¡½º ¸Þ¼Òµåµé";
+    }
+
+    /*! Used as the header of a list of instance methods in Objective-C.
+     *  These are similar to public member functions in C++.
+     */
+    virtual QCString trInstanceMethods()
+    {
+      return "ÀνºÅϽº ¸Þ¼Òµåµé";
+    }
+
+    /*! Used as the header of the member functions of an Objective-C class.
+     */
+    virtual QCString trMethodDocumentation()
+    {
+      return "¸Þ¼Òµå ¹®¼­È­";
+    }
+
+    /*! Used as the title of the design overview picture created for the
+     *  VHDL output.
+     */
+    virtual QCString trDesignOverview()
+    {
+      return "µðÀÚÀΠ°³¿ä";
+    }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.8.4
+//////////////////////////////////////////////////////////////////////////
+
+    /** old style UNO IDL services: implemented interfaces */
+    virtual QCString trInterfaces()
+    { return "ÀͽºÆ÷Æ®µÈ ÀÎÅÍÆäÀ̽ºµé"; }
+
+    /** old style UNO IDL services: inherited services */
+    virtual QCString trServices()
+    { return "Æ÷ÇԵȠ¼­ºñ½ºµé"; }
+
+    /** UNO IDL constant groups */
+    virtual QCString trConstantGroups()
+    { return "»ó¼ö ±×·ìµé"; }
+
+    /** UNO IDL constant groups */
+    virtual QCString trConstantGroupReference(const char *namespaceName)
+    {
+      QCString result=namespaceName;
+      result+=" »ó¼ö ±×·ì ·¹ÆÛ·±½º";
+      return result;
+    }
+    /** UNO IDL service page title */
+    virtual QCString trServiceReference(const char *sName)
+    {
+      QCString result=(QCString)sName;
+      result+=" ¼­ºñ½º ·¹ÆÛ·±½º";
+      return result;
+    }
+    /** UNO IDL singleton page title */
+    virtual QCString trSingletonReference(const char *sName)
+    {
+      QCString result=(QCString)sName;
+      result+=" ½Ì±ÛÅæ ·¹ÆÛ·±½º";
+      return result;
+    }
+    /** UNO IDL service page */
+    virtual QCString trServiceGeneratedFromFiles(bool single)
+    {
+      // single is true implies a single file
+      QCString result=(QCString)"ÀÌ ¼­ºñ½º¿¡ ´ëÇÑ ¹®¼­È­´Â ´ÙÀ½ÀÇ ÆÄÀÏ";
+      if (!single) result+="µé";
+         result+="·ÎºÎÅÍ »ý¼ºµÇ¾ú½À´Ï´Ù.:";
+      return result;
+    }
+    /** UNO IDL singleton page */
+    virtual QCString trSingletonGeneratedFromFiles(bool single)
+    {
+      // single is true implies a single file
+      QCString result=(QCString)"ÀÌ ½Ì±ÛÅæ¿¡ ´ëÇÑ ¹®¼­È­´Â ´ÙÀ½ÀÇ ÆÄÀÏ";
+      if (!single) result+="µé";
+         result+="·ÎºÎÅÍ »ý¼ºµÇ¾ú½À´Ï´Ù.:";
+      return result;
+    }
+
+//////////////////////////////////////////////////////////////////////////
 
 };
 
index 6dd1832..414ea8f 100644 (file)
@@ -1,8 +1,6 @@
 /******************************************************************************
  *
- * 
- *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -613,6 +611,7 @@ class TranslatorLithuanian : public TranslatorAdapter_1_4_6
         case ClassDef::Protocol:   result+=" Protokolas"; break;
         case ClassDef::Category:   result+=" Kategorija"; break;
         case ClassDef::Exception:  result+=" Iðimtis"; break;
+        default: break;
       }
       if (isTemplate) result+=" Ðablonas";
       return result;
@@ -771,6 +770,7 @@ class TranslatorLithuanian : public TranslatorAdapter_1_4_6
         case ClassDef::Protocol:   result+="ðiam protocolui"; break;
         case ClassDef::Category:   result+="ðiai kategorijai"; break;
         case ClassDef::Exception:  result+="ðiai iðimèiai"; break;
+        default: break;
       }
       result+=" sugeneruota ið ";
       if (single) result+="ðio failo:"; else result+="ðiø failø:";
@@ -1196,7 +1196,7 @@ class TranslatorLithuanian : public TranslatorAdapter_1_4_6
      */
     virtual QCString trRTFansicp()
     {
-      return "1252";
+      return "1257";
     }
     
 
@@ -1205,7 +1205,7 @@ class TranslatorLithuanian : public TranslatorAdapter_1_4_6
      */
     virtual QCString trRTFCharSet()
     {
-      return "0";
+      return "186";
     }
 
     /*! Used as header RTF general index */
diff --git a/src/translator_lv.h b/src/translator_lv.h
new file mode 100644 (file)
index 0000000..60b82f8
--- /dev/null
@@ -0,0 +1,2002 @@
+/******************************************************************************
+ *
+ * 
+ *
+ * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby 
+ * granted. No representations are made about the suitability of this software 
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef TRANSLATOR_LV_H
+#define TRANSLATOR_LV_H
+
+/*! 
+ When defining a translator class for the new language, follow
+ the description in the documentation.  One of the steps says
+ that you should copy the translator_en.h (this) file to your
+ translator_xx.h new file.  Your new language should use the
+ Translator class as the base class.  This means that you need to
+ implement exactly the same (pure virtual) methods as the
+ TranslatorEnglish does.  Because of this, it is a good idea to
+ start with the copy of TranslatorEnglish and replace the strings
+ one by one.
+
+ It is not necessary to include "translator.h" or
+ "translator_adapter.h" here.  The files are included in the
+ language.cpp correctly.  Not including any of the mentioned
+ files frees the maintainer from thinking about whether the
+ first, the second, or both files should be included or not, and
+ why.  This holds namely for localized translators because their
+ base class is changed occasionaly to adapter classes when the
+ Translator class changes the interface, or back to the
+ Translator class (by the local maintainer) when the localized
+ translator is made up-to-date again.
+*/
+
+/* Translation from English to Latvian by Lauris Bukðis-Haberkorns
+ *  (lauris@nix.lv)
+ *  -------------------------------------------
+ *  Project start                  : 24.Sept.2012
+ *  Last Doxygen version covered   : 1.8.2
+ */
+
+class TranslatorLatvian : public Translator
+{
+  public:
+
+    // --- Language control methods -------------------
+    
+    /*! Used for identification of the language. The identification 
+     * should not be translated. It should be replaced by the name 
+     * of the language in English using lower-case characters only
+     * (e.g. "czech", "japanese", "russian", etc.). It should be equal to 
+     * the identification used in language.cpp.
+     */
+    virtual QCString idLanguage()
+    { return "latvian"; }
+    
+    /*! Used to get the LaTeX command(s) for the language support. 
+     *  This method should return string with commands that switch
+     *  LaTeX to the desired language.  For example 
+     *  <pre>"\\usepackage[german]{babel}\n"
+     *  </pre>
+     *  or
+     *  <pre>"\\usepackage{polski}\n"
+     *  "\\usepackage[latin2]{inputenc}\n"
+     *  "\\usepackage[T1]{fontenc}\n"
+     *  </pre>
+     */
+    virtual QCString latexLanguageSupportCommand()
+    {
+      return "\\usepackage[LV]{fontenc}\n"
+             "\\usepackage[latvian]{babel}\n";
+    }
+
+    /*! return the language charset. This will be used 
+        when transcoding the translatable strings in this file to UTF-8 */
+    virtual QCString idLanguageCharset()
+    {
+      return "iso-8859-13";
+    }
+
+    // --- Language translation methods -------------------
+
+    /*! used in the compound documentation before a list of related functions. */
+    virtual QCString trRelatedFunctions()
+    { return "Saistîtâs funkcijas"; }
+
+    /*! subscript for the related functions. */
+    virtual QCString trRelatedSubscript()
+    { return "(Ðîs nav elementu funkcijas.)"; }
+
+    /*! header that is put before the detailed description of files, classes and namespaces. */
+    virtual QCString trDetailedDescription()
+    { return "Detalizçts apraksts"; }
+
+    /*! header that is put before the list of typedefs. */
+    virtual QCString trMemberTypedefDocumentation()
+    { return "Elementa Typedef dokumentâcija"; }
+    
+    /*! header that is put before the list of enumerations. */
+    virtual QCString trMemberEnumerationDocumentation()
+    { return "Elementa uzskaitîjumliterâïa dokumentâcija"; }
+    
+    /*! header that is put before the list of member functions. */
+    virtual QCString trMemberFunctionDocumentation()
+    { return "Elementa funkcijas dokumentâcija"; }
+    
+    /*! header that is put before the list of member attributes. */
+    virtual QCString trMemberDataDocumentation()
+    { 
+      if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+      {
+        return "Lauka dokumentâcija"; 
+      }
+      else
+      {
+        return "Elementa datu dokumentâcija"; 
+      }
+    }
+
+    /*! this is the text of a link put after brief descriptions. */
+    virtual QCString trMore() 
+    { return "vairâk..."; }
+
+    /*! put in the class documentation */
+    virtual QCString trListOfAllMembers()
+    { return "Visu elementu saraksts"; }
+
+    /*! used as the title of the "list of all members" page of a class */
+    virtual QCString trMemberList()
+    { return "Elementu saraksts"; }
+
+    /*! this is the first part of a sentence that is followed by a class name */
+    virtual QCString trThisIsTheListOfAllMembers()
+    { return "Ðis ir pilns elementu saraksts klasei "; }
+
+    /*! this is the remainder of the sentence after the class name */
+    virtual QCString trIncludingInheritedMembers()
+    { return ", ieskaitot mantotos elementus."; }
+    
+    /*! this is put at the author sections at the bottom of man pages.
+     *  parameter s is name of the project name.
+     */
+    virtual QCString trGeneratedAutomatically(const char *s)
+    { QCString result="Automâtiski ìenerçts izmantojot Doxygen";
+      if (s) result+=(QCString)" priekð "+s;
+      result+=" no pirmkoda."; 
+      return result;
+    }
+
+    /*! put after an enum name in the list of all members */
+    virtual QCString trEnumName()
+    { return "uzskaitîjuma nosaukums"; }
+    
+    /*! put after an enum value in the list of all members */
+    virtual QCString trEnumValue()
+    { return "uzskaitîjuma vçrtîba"; }
+    
+    /*! put after an undocumented member in the list of all members */
+    virtual QCString trDefinedIn()
+    { return "definçts"; }
+
+    // quick reference sections
+
+    /*! This is put above each page as a link to the list of all groups of 
+     *  compounds or files (see the \\group command).
+     */
+    virtual QCString trModules()
+    { return "Moduïi"; }
+    
+    /*! This is put above each page as a link to the class hierarchy */
+    virtual QCString trClassHierarchy()
+    { return "Klaðu hierarhija"; }
+    
+    /*! This is put above each page as a link to the list of annotated classes */
+    virtual QCString trCompoundList()
+    { 
+      if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+      {
+        return "Datu struktûras";
+      }
+      else
+      {
+        return "Klaðu saraksts"; 
+      }
+    }
+    
+    /*! This is put above each page as a link to the list of documented files */
+    virtual QCString trFileList()
+    { return "Failu saraksts"; }
+
+    /*! This is put above each page as a link to all members of compounds. */
+    virtual QCString trCompoundMembers()
+    { 
+      if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+      {
+        return "Datu lauki"; 
+      }
+      else
+      {
+        return "Klases elementi"; 
+      }
+    }
+
+    /*! This is put above each page as a link to all members of files. */
+    virtual QCString trFileMembers()
+    { 
+      if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+      {
+        return "Globâlie"; 
+      }
+      else
+      {
+        return "Faila elementi"; 
+      }
+    }
+
+    /*! This is put above each page as a link to all related pages. */
+    virtual QCString trRelatedPages()
+    { return "Saistîtâs lapas"; }
+
+    /*! This is put above each page as a link to all examples. */
+    virtual QCString trExamples()
+    { return "Piemçri"; }
+
+    /*! This is put above each page as a link to the search engine. */
+    virtual QCString trSearch()
+    { return "Meklçt"; }
+
+    /*! This is an introduction to the class hierarchy. */
+    virtual QCString trClassHierarchyDescription()
+    { return "Ðis mantojamîbas saraksts ir sakârtots aptuveni, "
+             "bet ne pilnîbâ, alfabçta secîbâ:";
+    }
+
+    /*! This is an introduction to the list with all files. */
+    virtual QCString trFileListDescription(bool extractAll)
+    {
+      QCString result="Ðeit ir visu ";
+      if (!extractAll) result+="dokumentçto ";
+      result+="failu saraksts ar îsu aprakstu:";
+      return result;
+    }
+
+    /*! This is an introduction to the annotated compound list. */
+    virtual QCString trCompoundListDescription()
+    { 
+      
+      if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+      {
+        return "Ðeit ir visas datu struktûras ar îsu aprakstu:"; 
+      }
+      else
+      {
+        return "Ðeit ir visas klases, struktûras, "
+               "apvienojumi un interfeisi ar îsu aprakstu:"; 
+      }
+    }
+
+    /*! This is an introduction to the page with all class members. */
+    virtual QCString trCompoundMembersDescription(bool extractAll)
+    {
+      QCString result="Ðeit ir visu ";
+      if (!extractAll)
+      {
+        result+="dokumentçto ";
+      }
+      if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+      {
+        result+="struktûru un apvienojumu lauku";
+      }
+      else
+      {
+        result+="klases elementu";
+      }
+      result+=" saraksts ar saitçm uz ";
+      if (!extractAll) 
+      {
+        if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+        {
+          result+="struktûru/apvienojumu dokumentâciju katram laukam:";
+        }
+        else
+        {
+          result+="klases dokumentâciju katram elementam:";
+        }
+      }
+      else 
+      {
+        if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+        {
+          result+="struktûrâm/apvienojumiem, kam tie pieder:";
+        }
+        else
+        {
+          result+="klasçm, kam tie pieder:";
+        }
+      }
+      return result;
+    }
+
+    /*! This is an introduction to the page with all file members. */
+    virtual QCString trFileMembersDescription(bool extractAll)
+    {
+      QCString result="Ðeit ir visu ";
+      if (!extractAll) result+="dokumentçto ";
+      
+      if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+      {
+        result+="funkciju, mainîgo, definîciju, uzskaitîjumliterâïu un typedefs";
+      }
+      else
+      {
+        result+="faila elementu";
+      }
+      result+=" saraksts ar saitçm uz ";
+      if (extractAll) 
+        result+="failiem, kam tie pieder:";
+      else 
+        result+="dokumentâciju:";
+      return result;
+    }
+
+    /*! This is an introduction to the page with the list of all examples */
+    virtual QCString trExamplesDescription()
+    { return "Ðeit ir visu piemçru saraksts:"; }
+
+    /*! This is an introduction to the page with the list of related pages */
+    virtual QCString trRelatedPagesDescription()
+    { return "Here is a list of all related documentation pages:"; }
+
+    /*! This is an introduction to the page with the list of class/file groups */
+    virtual QCString trModulesDescription()
+    { return "Ðeit ir visu moduïu saraksts:"; }
+
+    // index titles (the project name is prepended for these) 
+
+    /*! This is used in HTML as the title of index.html. */
+    virtual QCString trDocumentation()
+    { return "Dokumentâcija"; }
+
+    /*! This is used in LaTeX as the title of the chapter with the 
+     * index of all groups.
+     */
+    virtual QCString trModuleIndex()
+    { return "Moduïu indekss"; }
+
+    /*! This is used in LaTeX as the title of the chapter with the 
+     * class hierarchy.
+     */
+    virtual QCString trHierarchicalIndex()
+    { return "Hierarhijas indekss"; }
+
+    /*! This is used in LaTeX as the title of the chapter with the 
+     * annotated compound index.
+     */
+    virtual QCString trCompoundIndex()
+    {
+      if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+      { 
+        return "Datu struktûru indess";
+      }
+      else
+      {
+        return "Klaðu indekss"; 
+      }
+    }
+
+    /*! This is used in LaTeX as the title of the chapter with the
+     * list of all files.
+     */
+    virtual QCString trFileIndex() 
+    { return "Failu indekss"; }
+
+    /*! This is used in LaTeX as the title of the chapter containing
+     *  the documentation of all groups.
+     */
+    virtual QCString trModuleDocumentation()
+    { return "Moduïa dokumentâcija"; }
+
+    /*! This is used in LaTeX as the title of the chapter containing
+     *  the documentation of all classes, structs and unions.
+     */
+    virtual QCString trClassDocumentation()
+    { 
+      if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+      {
+        return "Datu struktûras dokomentâcija"; 
+      }
+      else
+      {
+        return "Klases dokumentâcija"; 
+      }
+    }
+
+    /*! This is used in LaTeX as the title of the chapter containing
+     *  the documentation of all files.
+     */
+    virtual QCString trFileDocumentation()
+    { return "Faila dokumentâcija"; }
+
+    /*! This is used in LaTeX as the title of the chapter containing
+     *  the documentation of all examples.
+     */
+    virtual QCString trExampleDocumentation()
+    { return "Piemçri"; }
+
+    /*! This is used in LaTeX as the title of the chapter containing
+     *  the documentation of all related pages.
+     */
+    virtual QCString trPageDocumentation()
+    { return "Lapas dokumentâcija"; }
+
+    /*! This is used in LaTeX as the title of the document */
+    virtual QCString trReferenceManual()
+    { return "Rokasgrâmata"; }
+    
+    /*! This is used in the documentation of a file as a header before the 
+     *  list of defines
+     */
+    virtual QCString trDefines()
+    { return "Makro"; }
+
+    /*! This is used in the documentation of a file as a header before the 
+     *  list of function prototypes
+     */
+    virtual QCString trFuncProtos()
+    { return "Funkciju prototipi"; }
+
+    /*! This is used in the documentation of a file as a header before the 
+     *  list of typedefs
+     */
+    virtual QCString trTypedefs()
+    { return "Typedefs"; }
+
+    /*! This is used in the documentation of a file as a header before the 
+     *  list of enumerations
+     */
+    virtual QCString trEnumerations()
+    { return "Uzskaitîjumi"; }
+
+    /*! This is used in the documentation of a file as a header before the 
+     *  list of (global) functions
+     */
+    virtual QCString trFunctions()
+    { return "Funkcijas"; }
+
+    /*! This is used in the documentation of a file as a header before the 
+     *  list of (global) variables
+     */
+    virtual QCString trVariables()
+    { return "Mainîgie"; }
+
+    /*! This is used in the documentation of a file as a header before the 
+     *  list of (global) variables
+     */
+    virtual QCString trEnumerationValues()
+    { return "Uzskaitîjumliterâïi"; }
+    
+    /*! This is used in the documentation of a file before the list of
+     *  documentation blocks for defines
+     */
+    virtual QCString trDefineDocumentation()
+    { return "Makro definîcijas dokumentâcija"; }
+
+    /*! This is used in the documentation of a file/namespace before the list 
+     *  of documentation blocks for function prototypes
+     */
+    virtual QCString trFunctionPrototypeDocumentation()
+    { return "Funkcijas prototipu dokumentâcija"; }
+
+    /*! This is used in the documentation of a file/namespace before the list 
+     *  of documentation blocks for typedefs
+     */
+    virtual QCString trTypedefDocumentation()
+    { return "Typedef dokumentâcija"; }
+
+    /*! This is used in the documentation of a file/namespace before the list 
+     *  of documentation blocks for enumeration types
+     */
+    virtual QCString trEnumerationTypeDocumentation()
+    { return "Uzskaitîjumliterâïa tipa dokumentâcija"; }
+
+    /*! This is used in the documentation of a file/namespace before the list 
+     *  of documentation blocks for functions
+     */
+    virtual QCString trFunctionDocumentation()
+    { return "Funkcijas dokumentâcija"; }
+
+    /*! This is used in the documentation of a file/namespace before the list 
+     *  of documentation blocks for variables
+     */
+    virtual QCString trVariableDocumentation()
+    { return "Mainîgo dokumentâcija"; }
+
+    /*! This is used in the documentation of a file/namespace/group before 
+     *  the list of links to documented compounds
+     */
+    virtual QCString trCompounds()
+    { 
+      if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+      {
+        return "Datu struktûras"; 
+      }
+      else
+      {
+        return "Klases"; 
+      }
+    }
+
+    /*! This is used in the standard footer of each page and indicates when 
+     *  the page was generated 
+     */
+    virtual QCString trGeneratedAt(const char *date,const char *projName)
+    { 
+      QCString result=(QCString)"Ìenerçts "+date;
+      if (projName) result+=(QCString)" projektam "+projName;
+      result+=(QCString)" ar";
+      return result;
+    }
+    /*! This is part of the sentence used in the standard footer of each page.
+     */
+    virtual QCString trWrittenBy()
+    {
+      return "uzrakstîjis";
+    }
+
+    /*! this text is put before a class diagram */
+    virtual QCString trClassDiagram(const char *clName)
+    {
+      return (QCString)"Mantojamîbas diagramma klasei "+clName+":";
+    }
+    
+    /*! this text is generated when the \\internal command is used. */
+    virtual QCString trForInternalUseOnly()
+    { return "Tikai iekðçjai lietoðanai."; }
+
+    /*! this text is generated when the \\warning command is used. */
+    virtual QCString trWarning()
+    { return "Brîdinâjums"; }
+
+    /*! this text is generated when the \\version command is used. */
+    virtual QCString trVersion()
+    { return "Versija"; }
+
+    /*! this text is generated when the \\date command is used. */
+    virtual QCString trDate()
+    { return "Datums"; }
+
+    /*! this text is generated when the \\return command is used. */
+    virtual QCString trReturns()
+    { return "Atgrieþ"; }
+
+    /*! this text is generated when the \\sa command is used. */
+    virtual QCString trSeeAlso()
+    { return "Skatîties arî"; }
+
+    /*! this text is generated when the \\param command is used. */
+    virtual QCString trParameters()
+    { return "Parametri"; }
+
+    /*! this text is generated when the \\exception command is used. */
+    virtual QCString trExceptions()
+    { return "Izòçmumi"; }
+    
+    /*! this text is used in the title page of a LaTeX document. */
+    virtual QCString trGeneratedBy()
+    { return "Ìenerçts ar"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990307
+//////////////////////////////////////////////////////////////////////////
+    
+    /*! used as the title of page containing all the index of all namespaces. */
+    virtual QCString trNamespaceList()
+    { return "Nosaukumvietu saraksts"; }
+
+    /*! used as an introduction to the namespace list */
+    virtual QCString trNamespaceListDescription(bool extractAll)
+    {
+      QCString result="Ðeit ir visas ";
+      if (!extractAll) result+="dokumentçtâs ";
+      result+="nosaukumvietas ar îsu aprakstu:";
+      return result;
+    }
+
+    /*! used in the class documentation as a header before the list of all
+     *  friends of a class
+     */
+    virtual QCString trFriends()
+    { return "Draugi"; }
+    
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990405
+//////////////////////////////////////////////////////////////////////////
+    
+    /*! used in the class documentation as a header before the list of all
+     * related classes 
+     */
+    virtual QCString trRelatedFunctionDocumentation()
+    { return "Draugu un saistîto funkciju dokumentâcija"; }
+    
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990425
+//////////////////////////////////////////////////////////////////////////
+
+    /*! used as the title of the HTML page of a class/struct/union */
+    virtual QCString trCompoundReference(const char *clName,
+                                    ClassDef::CompoundType compType,
+                                    bool isTemplate)
+    {
+      QCString result=(QCString)clName;
+      switch(compType)
+      {
+        case ClassDef::Class:      result+=" klases"; break;
+        case ClassDef::Struct:     result+=" struktûras"; break;
+        case ClassDef::Union:      result+=" apvienojuma"; break;
+        case ClassDef::Interface:  result+=" interfeisa"; break;
+        case ClassDef::Protocol:   result+=" protokola"; break;
+        case ClassDef::Category:   result+=" kategorijas"; break;
+        case ClassDef::Exception:  result+=" izòçmuma"; break;
+      }
+      if (isTemplate) result+=" veidnes";
+      result+=" apraksts";
+      return result;
+    }
+
+    /*! used as the title of the HTML page of a file */
+    virtual QCString trFileReference(const char *fileName)
+    {
+      QCString result=fileName;
+      result+=" faila apraksts"; 
+      return result;
+    }
+
+    /*! used as the title of the HTML page of a namespace */
+    virtual QCString trNamespaceReference(const char *namespaceName)
+    {
+      QCString result=namespaceName;
+      result+=" nosaukumvietas apraksts";
+      return result;
+    }
+    
+    virtual QCString trPublicMembers()
+    { return "Publiskâs elementa funkcijas"; }
+    virtual QCString trPublicSlots()
+    { return "Publiskâs spraugas"; }
+    virtual QCString trSignals()
+    { return "Signâli"; }
+    virtual QCString trStaticPublicMembers()
+    { return "Statiskâs publiskâs elementa funkcijas"; }
+    virtual QCString trProtectedMembers()
+    { return "Aizsargâtâs elementa funkcijas"; }
+    virtual QCString trProtectedSlots()
+    { return "Aizsargâtâs spraugas"; }
+    virtual QCString trStaticProtectedMembers()
+    { return "Statiskâs aizsargâtâs elementa funkcijas"; }
+    virtual QCString trPrivateMembers()
+    { return "Privâtâs elementa funkcijas"; }
+    virtual QCString trPrivateSlots()
+    { return "Privâtâs spraugas"; }
+    virtual QCString trStaticPrivateMembers()
+    { return "Statiskâs privâtâs elementa funkcijas"; }
+    
+    /*! this function is used to produce a comma-separated list of items.
+     *  use generateMarker(i) to indicate where item i should be put.
+     */
+    virtual QCString trWriteList(int numEntries)
+    {
+      QCString result;
+      int i;
+      // the inherits list contain `numEntries' classes
+      for (i=0;i<numEntries;i++) 
+      {
+        // use generateMarker to generate placeholders for the class links!
+        result+=generateMarker(i); // generate marker for entry i in the list 
+                                   // (order is left to right)
+        
+        if (i!=numEntries-1)  // not the last entry, so we need a separator
+        {
+          if (i<numEntries-2) // not the fore last entry 
+            result+=", ";
+          else                // the fore last entry
+            result+=", un ";
+        }
+      }
+      return result; 
+    }
+    
+    /*! used in class documentation to produce a list of base classes,
+     *  if class diagrams are disabled.
+     */
+    virtual QCString trInheritsList(int numEntries)
+    {
+      return "Manto no "+trWriteList(numEntries)+".";
+    }
+
+    /*! used in class documentation to produce a list of super classes,
+     *  if class diagrams are disabled.
+     */
+    virtual QCString trInheritedByList(int numEntries)
+    {
+      return "Tiek mantots "+trWriteList(numEntries)+".";
+    }
+
+    /*! used in member documentation blocks to produce a list of 
+     *  members that are hidden by this one.
+     */
+    virtual QCString trReimplementedFromList(int numEntries)
+    {
+      return "Pârimplementçts no "+trWriteList(numEntries)+".";
+    }
+
+    /*! used in member documentation blocks to produce a list of
+     *  all member that overwrite the implementation of this member.
+     */
+    virtual QCString trReimplementedInList(int numEntries)
+    {
+      return "Pârimplementçts "+trWriteList(numEntries)+".";
+    }
+
+    /*! This is put above each page as a link to all members of namespaces. */
+    virtual QCString trNamespaceMembers()
+    { return "Nosaukumvietas elementi"; }
+
+    /*! This is an introduction to the page with all namespace members */
+    virtual QCString trNamespaceMemberDescription(bool extractAll)
+    { 
+      QCString result="Ðeit ir visi ";
+      if (!extractAll) result+="dokumentçtie ";
+      result+="nosaukumvietas elementi ar saitçm uz ";
+      if (extractAll) 
+        result+="nosaukumvieta dokumentâciju katram elementam:";
+      else 
+        result+="nosaukumvietu, kam tie pieder:";
+      return result;
+    }
+    /*! This is used in LaTeX as the title of the chapter with the 
+     *  index of all namespaces.
+     */
+    virtual QCString trNamespaceIndex()
+    { return "Nosaukumvietu indekss"; }
+
+    /*! This is used in LaTeX as the title of the chapter containing
+     *  the documentation of all namespaces.
+     */
+    virtual QCString trNamespaceDocumentation()
+    { return "Nosaukumvietas dokumentâcija"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990522
+//////////////////////////////////////////////////////////////////////////
+
+    /*! This is used in the documentation before the list of all
+     *  namespaces in a file.
+     */
+    virtual QCString trNamespaces()
+    { return "Nosaukumvietas"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990728
+//////////////////////////////////////////////////////////////////////////
+
+    /*! This is put at the bottom of a class documentation page and is
+     *  followed by a list of files that were used to generate the page.
+     */
+    virtual QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
+        bool single)
+    { // single is true implies a single file
+      QCString result=(QCString)"Ðî";
+      switch(compType)
+      {
+        case ClassDef::Class:      result+="s klases"; break;
+        case ClassDef::Struct:     result+="s struktûras"; break;
+        case ClassDef::Union:      result+=" apvienojuma"; break;
+        case ClassDef::Interface:  result+=" interfeisa"; break;
+        case ClassDef::Protocol:   result+=" protokola"; break;
+        case ClassDef::Category:   result+="s kategorijas"; break;
+        case ClassDef::Exception:  result+=" izòçmuma"; break;
+      }
+      result+=" dokumentâcijas tika ìenerçta no ðâda fail";
+      if (single) result+="a:"; else result+="iem:";
+      return result;
+    }
+
+    /*! This is in the (quick) index as a link to the alphabetical compound
+     * list.
+     */
+    virtual QCString trAlphabeticalList()
+    { return "Alfabçtiskais saraksts"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990901
+//////////////////////////////////////////////////////////////////////////
+
+    /*! This is used as the heading text for the retval command. */
+    virtual QCString trReturnValues()
+    { return "Atgrieþamâs vçrtîbas"; }
+
+    /*! This is in the (quick) index as a link to the main page (index.html)
+     */
+    virtual QCString trMainPage()
+    { return "Sâkumlapa"; }
+
+    /*! This is used in references to page that are put in the LaTeX 
+     *  documentation. It should be an abbreviation of the word page.
+     */
+    virtual QCString trPageAbbreviation()
+    { return "lpp."; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-991003
+//////////////////////////////////////////////////////////////////////////
+
+    virtual QCString trDefinedAtLineInSourceFile()
+    {
+      return "Definçts lînijâ @0 failâ @1.";
+    }
+    virtual QCString trDefinedInSourceFile()
+    {
+      return "Definçts failâ @0.";
+    }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-991205
+//////////////////////////////////////////////////////////////////////////
+
+    virtual QCString trDeprecated()
+    {
+      return "Novecojusi";
+    }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.0.0
+//////////////////////////////////////////////////////////////////////////
+
+    /*! this text is put before a collaboration diagram */
+    virtual QCString trCollaborationDiagram(const char *clName)
+    {
+      return (QCString)"Sadarbîbas diagramma klasei "+clName+":";
+    }
+    /*! this text is put before an include dependency graph */
+    virtual QCString trInclDepGraph(const char *fName)
+    {
+      return (QCString)"Include dependency graph for "+fName+":";
+    }
+    /*! header that is put before the list of constructor/destructors. */
+    virtual QCString trConstructorDocumentation()
+    {
+      return "Konstruktora un destruktora dokumentâcija"; 
+    }
+    /*! Used in the file documentation to point to the corresponding sources. */
+    virtual QCString trGotoSourceCode()
+    {
+      return "Iet uz ðî faila pirmkodu.";
+    }
+    /*! Used in the file sources to point to the corresponding documentation. */
+    virtual QCString trGotoDocumentation()
+    {
+      return "Ietu uz ðî faila dokumentâciju.";
+    }
+    /*! Text for the \\pre command */
+    virtual QCString trPrecondition()
+    {
+      return "Pirmsnosacîjums";
+    }
+    /*! Text for the \\post command */
+    virtual QCString trPostcondition()
+    {
+      return "Pçcnosacîjums";
+    }
+    /*! Text for the \\invariant command */
+    virtual QCString trInvariant()
+    {
+      return "Invariants";
+    }
+    /*! Text shown before a multi-line variable/enum initialization */
+    virtual QCString trInitialValue()
+    {
+      return "Sâkotnçjâ vçrtîba:";
+    }
+    /*! Text used the source code in the file index */
+    virtual QCString trCode()
+    {
+      return "pirmkods";
+    }
+    virtual QCString trGraphicalHierarchy()
+    {
+      return "Grafiska klases hierarhija";
+    }
+    virtual QCString trGotoGraphicalHierarchy()
+    {
+      return "Iet uz grafisku klases hierarhiju";
+    }
+    virtual QCString trGotoTextualHierarchy()
+    {
+      return "Iet uz tekstuâlu klases hierarhiju";
+    }
+    virtual QCString trPageIndex()
+    {
+      return "Lapas indekss";
+    }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.0
+//////////////////////////////////////////////////////////////////////////
+    
+    virtual QCString trNote()
+    {
+      return "Piezîme";
+    }
+    virtual QCString trPublicTypes()
+    {
+      return "Publiskie tipi";
+    }
+    virtual QCString trPublicAttribs()
+    {
+      if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+      {
+        return "Datu lauki";
+      }
+      else
+      {
+        return "Publiskie atribûti";
+      }
+    }
+    virtual QCString trStaticPublicAttribs()
+    {
+      return "Statiskie publiskie atribûti";
+    }
+    virtual QCString trProtectedTypes()
+    {
+      return "Aizsargâtie tipi";
+    }
+    virtual QCString trProtectedAttribs()
+    {
+      return "Aizsargâtie atribûti";
+    }
+    virtual QCString trStaticProtectedAttribs()
+    {
+      return "Statiskie aizsargâtie atribûti";
+    }
+    virtual QCString trPrivateTypes()
+    {
+      return "Privâtie tipi";
+    }
+    virtual QCString trPrivateAttribs()
+    {
+      return "Privâtie atribûti";
+    }
+    virtual QCString trStaticPrivateAttribs()
+    {
+      return "Statiskie privâtie atribûti";
+    }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.3
+//////////////////////////////////////////////////////////////////////////
+
+    /*! Used as a marker that is put before a \\todo item */
+    virtual QCString trTodo()
+    {
+      return "Jâizdara";
+    }
+    /*! Used as the header of the todo list */
+    virtual QCString trTodoList()
+    {
+      return "Darâmo darbu saraksts";
+    }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.4
+//////////////////////////////////////////////////////////////////////////
+
+    virtual QCString trReferencedBy()
+    {
+      return "Atsauces no";
+    }
+    virtual QCString trRemarks()
+    {
+      return "Piebildes";
+    }
+    virtual QCString trAttention()
+    {
+      return "Uzmanîbu";
+    }
+    virtual QCString trInclByDepGraph()
+    {
+      return "Ðis grafs râda kuri faili tieði vai "
+             "netieði iekïauj ðo failu:";
+    }
+    virtual QCString trSince()
+    {
+      return "Kopð";
+    }
+    
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.5
+//////////////////////////////////////////////////////////////////////////
+
+    /*! title of the graph legend page */
+    virtual QCString trLegendTitle()
+    {
+      return "Grafika leìenda";
+    }
+    /*! page explaining how the dot graph's should be interpreted 
+     *  The %A in the text below are to prevent link to classes called "A".
+     */
+    virtual QCString trLegendDocs()
+    {
+      return 
+        "This page explains how to interpret the graphs that are generated "
+        "by doxygen.<p>\n"
+        "Consider the following example:\n"
+        "\\code\n"
+        "/*! Invisible class because of truncation */\n"
+        "class Invisible { };\n\n"
+        "/*! Truncated class, inheritance relation is hidden */\n"
+        "class Truncated : public Invisible { };\n\n"
+        "/* Class not documented with doxygen comments */\n"
+        "class Undocumented { };\n\n"
+        "/*! Class that is inherited using public inheritance */\n"
+        "class PublicBase : public Truncated { };\n\n"
+        "/*! A template class */\n"
+        "template<class T> class Templ { };\n\n"
+        "/*! Class that is inherited using protected inheritance */\n"
+        "class ProtectedBase { };\n\n"
+        "/*! Class that is inherited using private inheritance */\n"
+        "class PrivateBase { };\n\n"
+        "/*! Class that is used by the Inherited class */\n"
+        "class Used { };\n\n"
+        "/*! Super class that inherits a number of other classes */\n"
+        "class Inherited : public PublicBase,\n"
+        "                  protected ProtectedBase,\n"
+        "                  private PrivateBase,\n"
+        "                  public Undocumented,\n"
+        "                  public Templ<int>\n"
+        "{\n"
+        "  private:\n"
+        "    Used *m_usedClass;\n"
+        "};\n"
+        "\\endcode\n"
+        "This will result in the following graph:"
+        "<p><center><img alt=\"\" src=\"graph_legend."+Config_getEnum("DOT_IMAGE_FORMAT")+"\"></center></p>\n"
+        "<p>\n"
+        "The boxes in the above graph have the following meaning:\n"
+        "</p>\n"
+        "<ul>\n"
+        "<li>%A filled gray box represents the struct or class for which the "
+        "graph is generated.</li>\n"
+        "<li>%A box with a black border denotes a documented struct or class.</li>\n"
+        "<li>%A box with a grey border denotes an undocumented struct or class.</li>\n"
+        "<li>%A box with a red border denotes a documented struct or class for"
+        "which not all inheritance/containment relations are shown. %A graph is "
+        "truncated if it does not fit within the specified boundaries.</li>\n"
+        "</ul>\n"
+        "<p>\n"
+        "The arrows have the following meaning:\n"
+        "</p>\n"
+        "<ul>\n"
+        "<li>%A dark blue arrow is used to visualize a public inheritance "
+        "relation between two classes.</li>\n"
+        "<li>%A dark green arrow is used for protected inheritance.</li>\n"
+        "<li>%A dark red arrow is used for private inheritance.</li>\n"
+        "<li>%A purple dashed arrow is used if a class is contained or used "
+        "by another class. The arrow is labeled with the variable(s) "
+        "through which the pointed class or struct is accessible.</li>\n"
+        "<li>%A yellow dashed arrow denotes a relation between a template instance and "
+        "the template class it was instantiated from. The arrow is labeled with "
+        "the template parameters of the instance.</li>\n"
+        "</ul>\n";
+    }
+    /*! text for the link to the legend page */
+    virtual QCString trLegend()
+    {
+      return "leìenda";
+    }
+    
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.0
+//////////////////////////////////////////////////////////////////////////
+    
+    /*! Used as a marker that is put before a test item */
+    virtual QCString trTest()
+    {
+      return "Testi";
+    }
+    /*! Used as the header of the test list */
+    virtual QCString trTestList()
+    {
+      return "Testu saraksts";
+    }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.1
+//////////////////////////////////////////////////////////////////////////
+
+    /*! Used as a section header for KDE-2 IDL methods */
+    virtual QCString trDCOPMethods()
+    {
+      return "DCOP elementu funkcijas";
+    }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.2
+//////////////////////////////////////////////////////////////////////////
+
+    /*! Used as a section header for IDL properties */
+    virtual QCString trProperties()
+    {
+      return "Rekvizîti";
+    }
+    /*! Used as a section header for IDL property documentation */
+    virtual QCString trPropertyDocumentation()
+    {
+      return "Rekvizîtu dokumentâcija";
+    }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.4
+//////////////////////////////////////////////////////////////////////////
+
+    /*! Used for Java classes in the summary section of Java packages */
+    virtual QCString trClasses()
+    {
+      if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+      {
+        return "Datu struktûras";
+      }
+      else
+      {
+        return "Klases";
+      }
+    }
+    /*! Used as the title of a Java package */
+    virtual QCString trPackage(const char *name)
+    {
+      return (QCString)"Pakotne "+name;
+    }
+    /*! Title of the package index page */
+    virtual QCString trPackageList()
+    {
+      return "Pakotòu saraksts";
+    }
+    /*! The description of the package index page */
+    virtual QCString trPackageListDescription()
+    {
+      return "Here are the packages with brief descriptions (if available):";
+    }
+    /*! The link name in the Quick links header for each page */
+    virtual QCString trPackages()
+    {
+      return "Pakotnes";
+    }
+    /*! Text shown before a multi-line define */
+    virtual QCString trDefineValue()
+    {
+      return "Vçrtîba:";
+    }
+    
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.5
+//////////////////////////////////////////////////////////////////////////
+    
+    /*! Used as a marker that is put before a \\bug item */
+    virtual QCString trBug()
+    {
+      return "Kïûda";
+    }
+    /*! Used as the header of the bug list */
+    virtual QCString trBugList()
+    {
+      return "Kïûdu saraksts";
+    }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.6
+//////////////////////////////////////////////////////////////////////////
+
+    /*! Used as ansicpg for RTF file 
+     * 
+     * The following table shows the correlation of Charset name, Charset Value and 
+     * <pre>
+     * Codepage number:
+     * Charset Name       Charset Value(hex)  Codepage number
+     * ------------------------------------------------------
+     * DEFAULT_CHARSET           1 (x01)
+     * SYMBOL_CHARSET            2 (x02)
+     * OEM_CHARSET             255 (xFF)
+     * ANSI_CHARSET              0 (x00)            1252
+     * RUSSIAN_CHARSET         204 (xCC)            1251
+     * EE_CHARSET              238 (xEE)            1250
+     * GREEK_CHARSET           161 (xA1)            1253
+     * TURKISH_CHARSET         162 (xA2)            1254
+     * BALTIC_CHARSET          186 (xBA)            1257
+     * HEBREW_CHARSET          177 (xB1)            1255
+     * ARABIC _CHARSET         178 (xB2)            1256
+     * SHIFTJIS_CHARSET        128 (x80)             932
+     * HANGEUL_CHARSET         129 (x81)             949
+     * GB2313_CHARSET          134 (x86)             936
+     * CHINESEBIG5_CHARSET     136 (x88)             950
+     * </pre>
+     * 
+     */
+    virtual QCString trRTFansicp()
+    {
+      return "1257";
+    }
+    
+
+    /*! Used as ansicpg for RTF fcharset 
+     *  \see trRTFansicp() for a table of possible values.
+     */
+    virtual QCString trRTFCharSet()
+    {
+      return "186";
+    }
+
+    /*! Used as header RTF general index */
+    virtual QCString trRTFGeneralIndex()
+    {
+      return "Indekss";
+    }
+   
+    /*! This is used for translation of the word that will possibly
+     *  be followed by a single name or by a list of names 
+     *  of the category.
+     */
+    virtual QCString trClass(bool first_capital, bool singular)
+    { 
+      QCString result((first_capital ? "Klase" : "klase"));
+      if (!singular)  result+="s";
+      return result; 
+    }
+
+    /*! This is used for translation of the word that will possibly
+     *  be followed by a single name or by a list of names 
+     *  of the category.
+     */
+    virtual QCString trFile(bool first_capital, bool singular)
+    { 
+      QCString result((first_capital ? "Fail" : "fail"));
+      if (singular) result+="s"; else result+="i";
+      return result; 
+    }
+
+    /*! This is used for translation of the word that will possibly
+     *  be followed by a single name or by a list of names 
+     *  of the category.
+     */
+    virtual QCString trNamespace(bool first_capital, bool singular)
+    { 
+      QCString result((first_capital ? "Nosaukumvieta" : "nosaukumvieta"));
+      if (!singular)  result+="s";
+      return result; 
+    }
+
+    /*! This is used for translation of the word that will possibly
+     *  be followed by a single name or by a list of names 
+     *  of the category.
+     */
+    virtual QCString trGroup(bool first_capital, bool singular)
+    { 
+      QCString result((first_capital ? "Grupa" : "grupa"));
+      if (!singular)  result+="s";
+      return result; 
+    }
+
+    /*! This is used for translation of the word that will possibly
+     *  be followed by a single name or by a list of names 
+     *  of the category.
+     */
+    virtual QCString trPage(bool first_capital, bool singular)
+    { 
+      QCString result((first_capital ? "Lapa" : "lapa"));
+      if (!singular)  result+="s";
+      return result; 
+    }
+
+    /*! This is used for translation of the word that will possibly
+     *  be followed by a single name or by a list of names 
+     *  of the category.
+     */
+    virtual QCString trMember(bool first_capital, bool singular)
+    { 
+      QCString result((first_capital ? "Element" : "element"));
+      if (singular) result+="s"; else result+="i";
+      return result; 
+    }
+   
+    /*! This is used for translation of the word that will possibly
+     *  be followed by a single name or by a list of names 
+     *  of the category.
+     */
+    virtual QCString trGlobal(bool first_capital, bool singular)
+    { 
+      QCString result((first_capital ? "Globâl" : "globâl"));
+      if (singular) result+="ais"; else result+="ie";
+      return result; 
+    }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.7
+//////////////////////////////////////////////////////////////////////////
+
+    /*! This text is generated when the \\author command is used and
+     *  for the author section in man pages. */
+    virtual QCString trAuthor(bool first_capital, bool singular)
+    {                                                                         
+      QCString result((first_capital ? "Autor" : "autor"));
+      if (singular) result+="s"; else result+="i";
+      return result; 
+    }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.11
+//////////////////////////////////////////////////////////////////////////
+
+    /*! This text is put before the list of members referenced by a member
+     */
+    virtual QCString trReferences()
+    {
+      return "Atsauces";
+    }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.13
+//////////////////////////////////////////////////////////////////////////
+
+    /*! used in member documentation blocks to produce a list of 
+     *  members that are implemented by this one.
+     */
+    virtual QCString trImplementedFromList(int numEntries)
+    {
+      return "Îsteno "+trWriteList(numEntries)+".";
+    }
+
+    /*! used in member documentation blocks to produce a list of
+     *  all members that implement this abstract member.
+     */
+    virtual QCString trImplementedInList(int numEntries)
+    {
+      return "Îstenots "+trWriteList(numEntries)+".";
+    }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.16
+//////////////////////////////////////////////////////////////////////////
+
+    /*! used in RTF documentation as a heading for the Table
+     *  of Contents.
+     */
+    virtual QCString trRTFTableOfContents()
+    {
+      return "Satura râdîtâjs";
+    }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.17
+//////////////////////////////////////////////////////////////////////////
+
+    /*! Used as the header of the list of item that have been 
+     *  flagged deprecated 
+     */
+    virtual QCString trDeprecatedList()
+    {
+      return "Novecojuðo saraksts";
+    }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.18
+//////////////////////////////////////////////////////////////////////////
+
+    /*! Used as a header for declaration section of the events found in 
+     * a C# program
+     */
+    virtual QCString trEvents()
+    {
+      return "Notikumi";
+    }
+    /*! Header used for the documentation section of a class' events. */
+    virtual QCString trEventDocumentation()
+    {
+      return "Notikumu dokumentâcija";
+    }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3
+//////////////////////////////////////////////////////////////////////////
+
+    /*! Used as a heading for a list of Java class types with package scope.
+     */
+    virtual QCString trPackageTypes()
+    { 
+      return "Pakas tipi";
+    }
+    /*! Used as a heading for a list of Java class functions with package 
+     * scope. 
+     */
+    virtual QCString trPackageMembers()
+    { 
+      return "Pakas funkcijas";
+    }
+    /*! Used as a heading for a list of static Java class functions with 
+     *  package scope.
+     */
+    virtual QCString trStaticPackageMembers()
+    { 
+      return "Statiskâs pakas funkcijas";
+    }
+    /*! Used as a heading for a list of Java class variables with package 
+     * scope.
+     */
+    virtual QCString trPackageAttribs()
+    { 
+      return "Pakas atribûti";
+    }
+    /*! Used as a heading for a list of static Java class variables with 
+     * package scope.
+     */
+    virtual QCString trStaticPackageAttribs()
+    { 
+      return "Statiskie pakas atribûti";
+    }
+    
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.1
+//////////////////////////////////////////////////////////////////////////
+
+    /*! Used in the quick index of a class/file/namespace member list page 
+     *  to link to the unfiltered list of all members.
+     */
+    virtual QCString trAll()
+    {
+      return "Visi";
+    }
+    /*! Put in front of the call graph for a function. */
+    virtual QCString trCallGraph()
+    {
+      return "Ðeit ir visu funkciju izsaugumu grafs:";
+    }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.3
+//////////////////////////////////////////////////////////////////////////
+
+    /*! When the search engine is enabled this text is put in the header 
+     *  of each page before the field where one can enter the text to search 
+     *  for. 
+     */
+    virtual QCString trSearchForIndex()
+    {
+      return "Meklçt";
+    }
+    /*! This string is used as the title for the page listing the search
+     *  results.
+     */
+    virtual QCString trSearchResultsTitle()
+    {
+      return "Meklçðanas rezultâti";
+    }
+    /*! This string is put just before listing the search results. The
+     *  text can be different depending on the number of documents found.
+     *  Inside the text you can put the special marker $num to insert
+     *  the number representing the actual number of search results.
+     *  The @a numDocuments parameter can be either 0, 1 or 2, where the 
+     *  value 2 represents 2 or more matches. HTML markup is allowed inside
+     *  the returned string.
+     */
+    virtual QCString trSearchResults(int numDocuments)
+    {
+      if (numDocuments==0)
+      {
+        return "Netika atrasts neviens dokuments.";
+      }
+      else if (numDocuments==1)
+      {
+        return "Atrasts <b>1</b> dokuments.";
+      }
+      else 
+      {
+        return "Atrasti <b>$num</b> Dokumenti. "
+               "Sâkumâ attçlo tos, kas atbilst visprecîzâk.";
+      }
+    }
+    /*! This string is put before the list of matched words, for each search 
+     *  result. What follows is the list of words that matched the query.
+     */
+    virtual QCString trSearchMatches()
+    {
+      return "Atbilst meklçtajam:";
+    }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.8
+//////////////////////////////////////////////////////////////////////////
+
+    /*! This is used in HTML as the title of page with source code for file filename
+     */
+    virtual QCString trSourceFile(QCString& filename)
+    {
+      return filename + " pirmkoda fails";
+    }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.9
+//////////////////////////////////////////////////////////////////////////
+
+    /*! This is used as the name of the chapter containing the directory
+     *  hierarchy.
+     */
+    virtual QCString trDirIndex()
+    { return "Direktoriju struktûra"; }
+
+    /*! This is used as the name of the chapter containing the documentation
+     *  of the directories.
+     */
+    virtual QCString trDirDocumentation()
+    { return "Direktorijas dokumentâcija"; }
+
+    /*! This is used as the title of the directory index and also in the
+     *  Quick links of an HTML page, to link to the directory hierarchy.
+     */
+    virtual QCString trDirectories()
+    { return "Direktorijas"; }
+
+    /*! This returns a sentences that introduces the directory hierarchy. 
+     *  and the fact that it is sorted alphabetically per level
+     */
+    virtual QCString trDirDescription()
+    { return "Ðî direktoriju hierarhija ir aptuveni, "
+             "bet ne pilnîbâ, alfabçta secîbâ:";
+    }
+
+    /*! This returns the title of a directory page. The name of the
+     *  directory is passed via \a dirName.
+     */
+    virtual QCString trDirReference(const char *dirName)
+    { QCString result="Direktorijas "; result+=dirName; result+=" atsauce"; return result; }
+
+    /*! This returns the word directory with or without starting capital
+     *  (\a first_capital) and in sigular or plural form (\a singular).
+     */
+    virtual QCString trDir(bool first_capital, bool singular)
+    { 
+      QCString result((first_capital ? "Direktorija" : "direktorija"));
+      if (!singular) result+="s";
+      return result; 
+    }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.4.1
+//////////////////////////////////////////////////////////////////////////
+
+    /*! This text is added to the documentation when the \\overload command
+     *  is used for a overloaded function.
+     */
+    virtual QCString trOverloadText()
+    {
+       return "Ðî ir elementa pârslogota funkcija, kas "
+              "parâdîta tikai informâtîvo nolûkos. Tâ atðíiras no iepriekðapraksîtâs "
+              "funkcijas tikai ar parametriem, ko tâ saòem.";
+    }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.4.6
+//////////////////////////////////////////////////////////////////////////
+
+    /*! This is used to introduce a caller (or called-by) graph */
+    virtual QCString trCallerGraph()
+    {
+      return "Ðeit ir ðîs funkcijas izsaukuma grafs:";
+    }
+
+    /*! This is used in the documentation of a file/namespace before the list 
+     *  of documentation blocks for enumeration values
+     */
+    virtual QCString trEnumerationValueDocumentation()
+    { return "Uzskaitîjumliterâïa dokumentâcija"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.5.4 (mainly for Fortran)
+//////////////////////////////////////////////////////////////////////////
+    
+    /*! header that is put before the list of member subprograms (Fortran). */
+    virtual QCString trMemberFunctionDocumentationFortran()
+    { return "Elementa funckijas/apakðrutînas dokumentâcija"; }
+
+    /*! This is put above each page as a link to the list of annotated data types (Fortran). */    
+    virtual QCString trCompoundListFortran()
+    { return "Datu tipu saraksts"; }
+
+    /*! This is put above each page as a link to all members of compounds (Fortran). */
+    virtual QCString trCompoundMembersFortran()
+    { return "Datu lauki"; }
+
+    /*! This is an introduction to the annotated compound list (Fortran). */
+    virtual QCString trCompoundListDescriptionFortran()
+    { return "Ðeit ir visu datu tipu saraksts ar îsu aprakstu:"; }
+
+    /*! This is an introduction to the page with all data types (Fortran). */
+    virtual QCString trCompoundMembersDescriptionFortran(bool extractAll)
+    {
+      QCString result="Ðeit ir visu ";
+      if (!extractAll)
+      {
+        result+="dokumentçto ";
+      }
+      result+="datu tipu saraksts";
+      result+=" ar saitçm uz ";
+      if (!extractAll) 
+      {
+         result+="datu struktûras dokumentâciju katram elementam:";
+      }
+      else 
+      {
+         result+="datu tipiem, kam tie pieder:";
+      }
+      return result;
+    }
+
+    /*! This is used in LaTeX as the title of the chapter with the 
+     * annotated compound index (Fortran).
+     */
+    virtual QCString trCompoundIndexFortran()
+    { return "Datu tipu indekss"; }
+
+    /*! This is used in LaTeX as the title of the chapter containing
+     *  the documentation of all data types (Fortran).
+     */
+    virtual QCString trTypeDocumentation()
+    { return "Datu tipa dokumentâcija"; }
+
+    /*! This is used in the documentation of a file as a header before the 
+     *  list of (global) subprograms (Fortran).
+     */
+    virtual QCString trSubprograms()
+    { return "Funkcijas/Apakðrutînas"; }
+
+    /*! This is used in the documentation of a file/namespace before the list 
+     *  of documentation blocks for subprograms (Fortran)
+     */
+    virtual QCString trSubprogramDocumentation()
+    { return "Funkcijas/Apakðrutînas dokumentâcija"; }
+
+    /*! This is used in the documentation of a file/namespace/group before 
+     *  the list of links to documented compounds (Fortran)
+     */
+     virtual QCString trDataTypes()
+    { return "Datu tipi"; }
+    
+    /*! used as the title of page containing all the index of all modules (Fortran). */
+    virtual QCString trModulesList()
+    { return "Moduïu saraksts"; }
+
+    /*! used as an introduction to the modules list (Fortran) */
+    virtual QCString trModulesListDescription(bool extractAll)
+    {
+      QCString result="Ðeit ir visu ";
+      if (!extractAll) result+="dokumentçto ";
+      result+="moduïu saraksts ar îsu aprakstu:";
+      return result;
+    }
+
+    /*! used as the title of the HTML page of a module/type (Fortran) */
+    virtual QCString trCompoundReferenceFortran(const char *clName,
+                                    ClassDef::CompoundType compType,
+                                    bool isTemplate)
+    {
+      QCString result=(QCString)clName;
+      switch(compType)
+      {
+        case ClassDef::Class:      result+=" moduïa"; break;
+        case ClassDef::Struct:     result+=" tipa"; break;
+        case ClassDef::Union:      result+=" apvienojuma"; break;
+        case ClassDef::Interface:  result+=" interfeisa"; break;
+        case ClassDef::Protocol:   result+=" protokola"; break;
+        case ClassDef::Category:   result+=" kategorijas"; break;
+        case ClassDef::Exception:  result+=" izòçmuma"; break;
+      }
+      if (isTemplate) result+=" sagataves";
+      result+=" atsauce";
+      return result;
+    }
+    /*! used as the title of the HTML page of a module (Fortran) */
+    virtual QCString trModuleReference(const char *namespaceName)
+    {
+      QCString result=namespaceName;
+      result+=" moduïu atsauce";        
+      return result;
+    }
+    
+    /*! This is put above each page as a link to all members of modules. (Fortran) */
+    virtual QCString trModulesMembers()
+    { return "Moduïa elementi"; }
+
+    /*! This is an introduction to the page with all modules members (Fortran) */
+    virtual QCString trModulesMemberDescription(bool extractAll)
+    { 
+      QCString result="Ðeit ir visu ";
+      if (!extractAll) result+="dokumentçto ";
+      result+="moduïa elementu saraksts ar saitçm uz ";
+      if (extractAll) 
+      {
+        result+="moduïa dokumentâciju katram elementam:";
+      }
+      else 
+      {
+        result+="moduïiem, kuriem tie pieder:";
+      }
+      return result;
+    }
+
+    /*! This is used in LaTeX as the title of the chapter with the 
+     *  index of all modules (Fortran).
+     */
+    virtual QCString trModulesIndex()
+    { return "Moduïu indekss"; }
+    
+    /*! This is used for translation of the word that will possibly
+     *  be followed by a single name or by a list of names 
+     *  of the category.
+     */
+    virtual QCString trModule(bool first_capital, bool singular)
+    {       
+      QCString result((first_capital ? "Modu" : "modu"));
+      if (singular) result+="lis"; else result+="ïi";
+      return result; 
+    }
+
+    /*! This is put at the bottom of a module documentation page and is
+     *  followed by a list of files that were used to generate the page.
+     */
+    virtual QCString trGeneratedFromFilesFortran(ClassDef::CompoundType compType,
+        bool single)
+    {
+      // single is true implies a single file
+      QCString result=(QCString)"Dokumentâcija ð";
+      switch(compType)
+      {
+        case ClassDef::Class:      result+="im modulim"; break;
+        case ClassDef::Struct:     result+="im tipam"; break;
+        case ClassDef::Union:      result+="im apvienojumam"; break;
+        case ClassDef::Interface:  result+="im interfeisam"; break;
+        case ClassDef::Protocol:   result+="im protokolam"; break;
+        case ClassDef::Category:   result+="ai kategorijai"; break;
+        case ClassDef::Exception:  result+="im izòçmumam"; break;
+      }
+      result+=" tika ìenerçta no fail";
+      if (single) result+="a:"; else result+="iem:";
+      return result;
+    }
+
+    /*! This is used for translation of the word that will possibly
+     *  be followed by a single name or by a list of names 
+     *  of the category.
+     */
+    virtual QCString trType(bool first_capital, bool singular)
+    { 
+      QCString result((first_capital ? "Tip" : "tip"));
+      if (singular) result+="s"; else result+="i";
+      return result; 
+    }
+
+    /*! This is used for translation of the word that will possibly
+     *  be followed by a single name or by a list of names 
+     *  of the category.
+     */
+    virtual QCString trSubprogram(bool first_capital, bool singular)
+    { 
+      QCString result((first_capital ? "Apakðprogramma" : "apakðprogramma"));
+      if (!singular)  result+="s";
+      return result; 
+    }
+
+    /*! C# Type Constraint list */
+    virtual QCString trTypeConstraints()
+    {
+      return "Tipa ierobeþojumi";
+    }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.6.0 (mainly for the new search engine)
+//////////////////////////////////////////////////////////////////////////
+
+    /*! directory relation for \a name */
+    virtual QCString trDirRelation(const char *name)
+    {
+      return QCString(name)+" relâcija";
+    }
+
+    /*! Loading message shown when loading search results */
+    virtual QCString trLoading()
+    {
+      return "Tiek veikta ielâde...";
+    }
+
+    /*! Label used for search results in the global namespace */
+    virtual QCString trGlobalNamespace()
+    {
+      return "Global Namespace";
+    }
+
+    /*! Message shown while searching */
+    virtual QCString trSearching()
+    {
+      return "Meklç...";
+    }
+
+    /*! Text shown when no search results are found */
+    virtual QCString trNoMatches()
+    {
+      return "Nav atbilstîbu";
+    }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.6.3 (missing items for the directory pages)
+//////////////////////////////////////////////////////////////////////////
+
+    /*! introduction text for the directory dependency graph */
+    virtual QCString trDirDependency(const char *name)
+    {
+      return (QCString)"Direktoriju atkarîbu grafs priekð "+name;
+    }
+
+    /*! when clicking a directory dependency label, a page with a
+     *  table is shown. The heading for the first column mentions the
+     *  source file that has a relation to another file.
+     */
+    virtual QCString trFileIn(const char *name)
+    {
+      return (QCString)"File in "+name;
+    }
+
+    /*! when clicking a directory dependency label, a page with a
+     *  table is shown. The heading for the second column mentions the
+     *  destination file that is included.
+     */
+    virtual QCString trIncludesFileIn(const char *name)
+    {
+      return (QCString)"Includes file in "+name;
+    }
+
+    /** Compiles a date string. 
+     *  @param year Year in 4 digits
+     *  @param month Month of the year: 1=January
+     *  @param day Day of the Month: 1..31
+     *  @param dayOfWeek Day of the week: 1=Monday..7=Sunday
+     *  @param hour Hour of the day: 0..23
+     *  @param minutes Minutes in the hour: 0..59
+     *  @param seconds Seconds within the minute: 0..59
+     *  @param includeTime Include time in the result string?
+     */
+    virtual QCString trDateTime(int year,int month,int day,int dayOfWeek,
+                                int hour,int minutes,int seconds,
+                                bool includeTime)
+    {
+      static const char *days[]   = { "Pirm","Otr","Tr","Cet","Piekt","Sest","Sv" };
+      static const char *months[] = { "Jan","Feb","Mar","Apr","Mai","Jûn","Jûl","Aug","Sept","Okt","Nov","Dec" };
+      QCString sdate;
+      sdate.sprintf("%s %s %d %d",days[dayOfWeek-1],months[month-1],day,year);
+      if (includeTime)
+      {
+        QCString stime;
+        stime.sprintf(" %.2d:%.2d:%.2d",hour,minutes,seconds);
+        sdate+=stime;
+      }
+      return sdate;
+    }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.7.5
+//////////////////////////////////////////////////////////////////////////
+
+    /*! Header for the page with bibliographic citations */
+    virtual QCString trCiteReferences()
+    { return "Bibliogrâfiskâs atsauces"; }
+
+    /*! Text for copyright paragraph */
+    virtual QCString trCopyright()
+    { return "Autortiesîbas"; }
+
+    /*! Header for the graph showing the directory dependencies */
+    virtual QCString trDirDepGraph(const char *name)
+    { return QCString("Atkarîbu grafs direktorijai ")+name+":"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.8.0
+//////////////////////////////////////////////////////////////////////////
+
+    /*! Detail level selector shown for hierarchical indices */
+    virtual QCString trDetailLevel()
+    { return "detalizâcijas lîmenis"; }
+
+    /*! Section header for list of template parameters */
+    virtual QCString trTemplateParameters()
+    { return "Sagataves parametri"; }
+
+    /*! Used in dot graph when UML_LOOK is enabled and there are many fields */
+    virtual QCString trAndMore(const QCString &number)
+    { return "un vçl "+number+"..."; }
+
+    /*! Used file list for a Java enum */
+    virtual QCString trEnumGeneratedFromFiles(bool single)
+    { QCString result = "Dokumentâcija ðim uzskaitîjumliterâlim tika ìenerçta no sekojoð";
+      if (single) result+="a"; else result += "iem";
+      result+=" fail";
+      if (single) result+="a"; else result += "iem";
+      result+=":";
+      return result;
+    }
+
+    /*! Header of a Java enum page (Java enums are represented as classes). */
+    virtual QCString trEnumReference(const char *name)
+    { return QCString(name)+" uzskaitîjumliterâïa atsauce"; }
+
+    /*! Used for a section containing inherited members */
+    virtual QCString trInheritedFrom(const char *members,const char *what)
+    { return QCString(members)+" manto no "+what; }
+
+    /*! Header of the sections with inherited members specific for the 
+     *  base class(es) 
+     */
+    virtual QCString trAdditionalInheritedMembers()
+    { return "Papildus mantotie elementi"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.8.2
+//////////////////////////////////////////////////////////////////////////
+
+    /*! Used as a tooltip for the toggle button that appears in the
+     *  navigation tree in the HTML output when GENERATE_TREEVIEW is 
+     *  enabled. This tooltip explains the meaning of the button.
+     */
+    virtual QCString trPanelSynchronisationTooltip(bool enable)
+    {
+      QCString opt = enable ? "iespçjotu" : "atspçjotu";
+      return "uzklikðíinât, lai "+opt+" paneïu sinhronizâciju";
+    }
+
+    /*! Used in a method of an Objective-C class that is declared in a
+     *  a category. Note that the @1 marker is required and is replaced
+     *  by a link.
+     */
+    virtual QCString trProvidedByCategory()
+    {
+      return "Nodroðina kategorija @1.";
+    }
+
+    /*! Used in a method of an Objective-C category that extends a class.
+     *  Note that the @1 marker is required and is replaced by a link to
+     *  the class method.
+     */
+    virtual QCString trExtendsClass()
+    {
+      return "Paplaðina klasi @1.";
+    }
+
+    /*! Used as the header of a list of class methods in Objective-C.
+     *  These are similar to static public member functions in C++.
+     */
+    virtual QCString trClassMethods()
+    {
+      return "Klases metodes";
+    }
+
+    /*! Used as the header of a list of instance methods in Objective-C.
+     *  These are similar to public member functions in C++.
+     */
+    virtual QCString trInstanceMethods()
+    {
+      return "Instances metodes";
+    }
+
+    /*! Used as the header of the member functions of an Objective-C class.
+     */
+    virtual QCString trMethodDocumentation()
+    {
+      return "Metoþu dokumentâcija";
+    }
+
+    /*! Used as the title of the design overview picture created for the
+     *  VHDL output.
+     */
+    virtual QCString trDesignOverview()
+    {
+      return "Dizaina pârskats";
+    }
+
+//////////////////////////////////////////////////////////////////////////
+
+};
+
+#endif
index b5d8dcb..e190241 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -607,6 +607,7 @@ class TranslatorMacedonian : public TranslatorAdapter_1_6_0
         case ClassDef::Protocol:   result+=" Протокол"; break;
         case ClassDef::Category:   result+=" Категорија"; break;
         case ClassDef::Exception:  result+=" Исклучок"; break;
+        default: break;
       }
       if (isTemplate) result+=" Образец";
       result+=" Повикување";
@@ -766,6 +767,7 @@ class TranslatorMacedonian : public TranslatorAdapter_1_6_0
         case ClassDef::Protocol:   result+="овој протокол"; break;
         case ClassDef::Category:   result+="оваа категорија"; break;
         case ClassDef::Exception:  result+="овој исклучок"; break;
+        default: break;
       }
       result+=" беше создадена од ";
       if (single) result+="следнава датотека:"; else result+="следниве датотеки:";
@@ -1190,7 +1192,7 @@ class TranslatorMacedonian : public TranslatorAdapter_1_6_0
      */
     virtual QCString trRTFansicp()
     {
-      return "1252";
+      return "1251";
     }
     
 
@@ -1199,7 +1201,7 @@ class TranslatorMacedonian : public TranslatorAdapter_1_6_0
      */
     virtual QCString trRTFCharSet()
     {
-      return "238";
+      return "204";
     }
 
     /*! Used as header RTF general index */
@@ -1660,6 +1662,7 @@ class TranslatorMacedonian : public TranslatorAdapter_1_6_0
         case ClassDef::Protocol:   result+=" Протокол"; break;
         case ClassDef::Category:   result+=" Категорија"; break;
         case ClassDef::Exception:  result+=" Исклучок"; break;
+        default: break;
       }
       if (isTemplate) result+=" Образец";
       return result;
@@ -1726,6 +1729,7 @@ class TranslatorMacedonian : public TranslatorAdapter_1_6_0
         case ClassDef::Protocol:   result+="овој протокол"; break;
         case ClassDef::Category:   result+="оваа категорија"; break;
         case ClassDef::Exception:  result+="овој исклучок"; break;
+        default: break;
       }
       result+=" беше создадена од ";
       if (single) result+="следнава датотека:"; else result+="следниве датотеки:";
index db724db..41d77fb 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -18,7 +18,7 @@
 #ifndef TRANSLATOR_NL_H
 #define TRANSLATOR_NL_H
 
-class TranslatorDutch : public Translator
+class TranslatorDutch : public TranslatorAdapter_1_8_2
 {
   public:
     QCString idLanguage()
@@ -268,6 +268,7 @@ class TranslatorDutch : public Translator
         case ClassDef::Protocol:  result+=" Protocol"; break;
         case ClassDef::Category:  result+=" Category"; break;
         case ClassDef::Exception:  result+=" Exception"; break;
+        default: break;
       }
       result+=" Referentie";
       return result;
@@ -416,6 +417,7 @@ class TranslatorDutch : public Translator
         case ClassDef::Protocol:   result+="dit protocol"; break;
         case ClassDef::Category:   result+="deze categorie"; break;
         case ClassDef::Exception:  result+="deze exceptie"; break;
+        default: break;
       }
       result+=" is gegenereerd op grond van ";
       if (single) result+="het"; else result+="de";
@@ -1277,6 +1279,7 @@ class TranslatorDutch : public Translator
         case ClassDef::Protocol:   result+=" Protocol"; break;
         case ClassDef::Category:   result+=" Category"; break;
         case ClassDef::Exception:  result+=" Exception"; break;
+        default: break;
       }
       if (isTemplate) result+=" Template";
       result+=" Referentie";
@@ -1340,6 +1343,7 @@ class TranslatorDutch : public Translator
         case ClassDef::Protocol:   result+="dit protocol"; break;
         case ClassDef::Category:   result+="deze category"; break;
         case ClassDef::Exception:  result+="deze exception"; break;
+        default: break;
       }
       result+=" is gegenereerd op grond van ";
       if (single) result+="het"; else result+="de";
index cffaa09..5430538 100644 (file)
@@ -1,8 +1,6 @@
 /******************************************************************************
  *
- * 
- *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -652,6 +650,7 @@ class TranslatorNorwegian : public TranslatorAdapter_1_4_6
         case ClassDef::Exception:  result+=" Unntak"; break;
         case ClassDef::Protocol:   result+=" Protocol"; break;
         case ClassDef::Category:   result+=" Category"; break;
+        default: break;
       }
       if (isTemplate) result+=" Mal";
       result+=" Referanse";
@@ -811,6 +810,7 @@ class TranslatorNorwegian : public TranslatorAdapter_1_4_6
         case ClassDef::Exception:  result+="dette unntak"; break;
         case ClassDef::Protocol:   result+="denne protocol"; break;
         case ClassDef::Category:   result+="denne category"; break;
+        default: break;
       }
       result+=" ble generert fra følgende fil";
       if (single) result+=":"; else result+="er:";
index a6e25c2..b1e90ce 100644 (file)
@@ -2,7 +2,7 @@
  *
  *
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -615,6 +615,7 @@ class TranslatorPolish : public TranslatorAdapter_1_8_2
         case ClassDef::Protocol:   result+=" protokołu "; break;
         case ClassDef::Category:   result+=" kategorii "; break;
         case ClassDef::Exception:  result+=" wyjątku "; break;
+        default: break;
       }
       result+=(QCString)clName;
       return result;
@@ -774,6 +775,7 @@ class TranslatorPolish : public TranslatorAdapter_1_8_2
         case ClassDef::Protocol:   result+="go protokołu"; break;
         case ClassDef::Category:   result+="j kategorii"; break;
         case ClassDef::Exception:  result+="go wyjątku"; break;
+        default: break;
       }
       result+=" została wygenerowana z plik";
       if (single) result+="u:"; else result+="ów:";
@@ -1669,6 +1671,7 @@ class TranslatorPolish : public TranslatorAdapter_1_8_2
         case ClassDef::Protocol:   result+=" protokołu "; break;
         case ClassDef::Category:   result+=" kategorii "; break;
         case ClassDef::Exception:  result+=" wyjątku "; break;
+        default: break;
       }
       result+=(QCString)clName;
       return result;
@@ -1735,6 +1738,7 @@ class TranslatorPolish : public TranslatorAdapter_1_8_2
         case ClassDef::Protocol:   result+="go protokołu"; break;
         case ClassDef::Category:   result+="j kategorii"; break;
         case ClassDef::Exception:  result+="go wyjątku"; break;
+        default: break;
       }
       result+=" została wygenerowana z plik";
       if (single) result+="u:"; else result+="ów:";
index e7510d9..5130fcf 100644 (file)
@@ -1,5 +1,5 @@
 /******************************************************************************
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby
@@ -616,6 +616,7 @@ class TranslatorPortuguese : public TranslatorAdapter_1_8_0
         case ClassDef::Protocol:   result+="ao protocolo "; break;
         case ClassDef::Category:   result+="à categoria "; break;
         case ClassDef::Exception:  result+="à excepção "; break;
+        default: break;
       }
       if (isTemplate) result+="Template ";
       result+=(QCString)clName;
@@ -778,6 +779,7 @@ class TranslatorPortuguese : public TranslatorAdapter_1_8_0
         case ClassDef::Protocol:   result+="este protocolo"; break;
         case ClassDef::Category:   result+="esta categoria"; break;
         case ClassDef::Exception:  result+="esta excepção"; break;
+        default: break;
       }
       result+=" foi gerada a partir ";
       if (single) result+=" do seguinte ficheiro:";
@@ -1673,6 +1675,7 @@ class TranslatorPortuguese : public TranslatorAdapter_1_8_0
         case ClassDef::Protocol:   result+="do Protocolo "; break;
         case ClassDef::Category:   result+="da Categoria "; break;
         case ClassDef::Exception:  result+="da Exceção "; break;
+        default: break;
       }
       result += clName; 
      
@@ -1740,6 +1743,7 @@ class TranslatorPortuguese : public TranslatorAdapter_1_8_0
         case ClassDef::Protocol:   result+="esto protocolo "; break;
         case ClassDef::Category:   result+="esta categoria "; break;
         case ClassDef::Exception:  result+="esta exceção "; break;
+        default: break;
       }
       
       result+=" foi gerada a partir do";
index 42f0224..70da281 100644 (file)
@@ -1,12 +1,12 @@
 /******************************************************************************
  *
- * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ *
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby 
- * granted. No representations are made about the suitability of this software 
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
  * for any purpose. It is provided "as is" without express or implied warranty.
  * See the GNU General Public License for more details.
  *
  *
  * -------------------------------------------
  * Project start                : 20.09.2000
- * Last Doxygen version covered : 1.5.8
- * Last revision                : 15.01.2009
+ * Last Doxygen version covered : 1.8.4
+ * Last revision                : 17.05.2013
  * -------------------------------------------
  *
  * Revision history
  * ----------------
+ * 17.05.2013 - Updated translation to cover Doxygen 1.8.4 (Ionuț Dumitrașcu)
  * 15.01.2009 - Updated Romanian translation to Doxygen 1.5.8 and modified strings to UTF-8, as well as some other changes (Ionuţ Dumitraşcu)
  * 28.07.2008 - Updated version - covering Doxygen 1.5.6 - and some minor changes  (Ionuţ Dumitraşcu)
  *
 #define TRANSLATOR_RO_H
 
 
-class TranslatorRomanian : public TranslatorAdapter_1_6_0
+class TranslatorRomanian : public Translator
 {
   public:
 
     // --- Language control methods -------------------
-    
-    /*! Used for identification of the language. The identification 
-     * should not be translated. It should be replaced by the name 
+
+    /*! Used for identification of the language. The identification
+     * should not be translated. It should be replaced by the name
      * of the language in English using lower-case characters only
-     * (e.g. "czech", "japanese", "russian", etc.). It should be equal to 
+     * (e.g. "czech", "japanese", "russian", etc.). It should be equal to
      * the identification used in language.cpp.
      */
     virtual QCString idLanguage()
     { return "romanian"; }
-    /*! Used to get the LaTeX command(s) for the language support. 
+    /*! Used to get the LaTeX command(s) for the language support.
      *  This method should return string with commands that switch
-     *  LaTeX to the desired language.  For example 
+     *  LaTeX to the desired language.  For example
      *  <pre>"\\usepackage[german]{babel}\n"
      *  </pre>
      *  or
@@ -65,7 +66,7 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
      *  "\\usepackage[latin2]{inputenc}\n"
      *  "\\usepackage[T1]{fontenc}\n"
      *  </pre>
-     * 
+     *
      * The English LaTeX does not use such commands.  Because of this
      * the empty string is returned in this implementation.
      */
@@ -97,31 +98,31 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
     /*! header that is put before the list of typedefs. */
     virtual QCString trMemberTypedefDocumentation()
     { return "Documentaţia Definiţiilor de Tipuri (typedef) Membre"; }
-    
+
     /*! header that is put before the list of enumerations. */
     virtual QCString trMemberEnumerationDocumentation()
     { return "Documentaţia Enumerărilor Membre"; }
-    
+
     /*! header that is put before the list of member functions. */
     virtual QCString trMemberFunctionDocumentation()
     { return "Documentaţia Funcţiilor Membre"; }
-    
+
     /*! header that is put before the list of member attributes. */
     virtual QCString trMemberDataDocumentation()
-    { 
+    {
       if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
       {
-        return "Documentaţia Câmpurilor"; 
+        return "Documentaţia Câmpurilor";
       }
       else
       {
-        return "Documentaţia Datelor Membre"; 
+        return "Documentaţia Datelor Membre";
       }
 
     }
 
     /*! this is the text of a link put after brief descriptions. */
-    virtual QCString trMore() 
+    virtual QCString trMore()
     { return "Mai mult..."; }
 
     /*! put in the class documentation */
@@ -139,65 +140,65 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
     /*! this is the remainder of the sentence after the class name */
     virtual QCString trIncludingInheritedMembers()
     { return ", inclusiv a tuturor membrilor moşteniţi."; }
-    
+
     /*! this is put at the author sections at the bottom of man pages.
      *  parameter s is name of the project name.
      */
     virtual QCString trGeneratedAutomatically(const char *s)
     { QCString result="Generat automat de Doxygen";
       if (s) result+=(QCString)" pentru "+s;
-      result+=" din codul sursă."; 
+      result+=" din codul sursă.";
       return result;
     }
 
     /*! put after an enum name in the list of all members */
     virtual QCString trEnumName()
     { return "nume enumerare"; }
-    
+
     /*! put after an enum value in the list of all members */
     virtual QCString trEnumValue()
     { return "valoare enumerare"; }
-    
+
     /*! put after an undocumented member in the list of all members */
     virtual QCString trDefinedIn()
     { return "definit în"; }
 
     // quick reference sections
 
-    /*! This is put above each page as a link to the list of all groups of 
+    /*! This is put above each page as a link to the list of all groups of
      *  compounds or files (see the \\group command).
      */
     virtual QCString trModules()
     { return "Module"; }
-    
+
     /*! This is put above each page as a link to the class hierarchy */
     virtual QCString trClassHierarchy()
     { return "Ierarhia Claselor"; }
-    
+
     /*! This is put above each page as a link to the list of annotated classes */
     virtual QCString trCompoundList()
-    { 
+    {
       if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
       {
         return "Structuri de Date";
       }
       else
       {
-        return "Lista Claselor"; 
+        return "Lista Claselor";
       }
 
     }
-    
+
     /*! This is put above each page as a link to the list of documented files */
     virtual QCString trFileList()
     { return "Lista fişierelor"; }
 
     /*! This is put above each page as a link to all members of compounds. */
     virtual QCString trCompoundMembers()
-    { 
+    {
       if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
       {
-        return "Câmpurile de Date"; 
+        return "Câmpurile de Date";
       }
       else
       {
@@ -208,10 +209,10 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
 
     /*! This is put above each page as a link to all members of files. */
     virtual QCString trFileMembers()
-    { 
+    {
       if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
       {
-        return "Globale"; 
+        return "Globale";
       }
       else
       {
@@ -250,15 +251,15 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
 
     /*! This is an introduction to the annotated compound list. */
     virtual QCString trCompoundListDescription()
-    { 
+    {
       if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
       {
-        return "Lista structurilor de date, cu scurte descrieri:"; 
+        return "Lista structurilor de date, cu scurte descrieri:";
       }
       else
       {
         return "Lista claselor, structurilor, uniunilor şi interfeţelor"
-               ", cu scurte descrieri:"; 
+               ", cu scurte descrieri:";
       }
 
     }
@@ -267,7 +268,7 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
     virtual QCString trCompoundMembersDescription(bool extractAll)
     {
       QCString result="Lista tuturor ";
-      
+
       if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
       {
         result+="câmpurilor ";
@@ -281,7 +282,7 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
         result+="din toate clasele ";
       }
       result+=", cu legături către ";
-      if (!extractAll) 
+      if (!extractAll)
       {
         if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
         {
@@ -292,7 +293,7 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
           result+="documentaţia clasei pentru fiecare membru în parte:";
         }
       }
-      else 
+      else
       {
         if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
         {
@@ -303,7 +304,7 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
           result+="clasele de care aparţin:";
         }
       }
-     
+
       return result;
     }
 
@@ -323,9 +324,9 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
          result+="din toate fişierele";
       }
       result+=", cu legături către ";
-      if (extractAll) 
+      if (extractAll)
         result+="fişierele de care aparţin:";
-      else 
+      else
         result+="documentaţia aferentă:";
 
       return result;
@@ -343,37 +344,37 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
     virtual QCString trModulesDescription()
     { return "Lista tuturor modulelor:"; }
 
-    // index titles (the project name is prepended for these) 
+    // index titles (the project name is prepended for these)
 
 
     /*! This is used in HTML as the title of index.html. */
     virtual QCString trDocumentation()
     { return "Documentaţie"; }
 
-    /*! This is used in LaTeX as the title of the chapter with the 
+    /*! This is used in LaTeX as the title of the chapter with the
      * index of all groups.
      */
     virtual QCString trModuleIndex()
     { return "Indexul Modulelor"; }
 
-    /*! This is used in LaTeX as the title of the chapter with the 
+    /*! This is used in LaTeX as the title of the chapter with the
      * class hierarchy.
      */
     virtual QCString trHierarchicalIndex()
     { return "Index Ierarhic"; }
 
-    /*! This is used in LaTeX as the title of the chapter with the 
+    /*! This is used in LaTeX as the title of the chapter with the
      * annotated compound index.
      */
     virtual QCString trCompoundIndex()
-    { 
+    {
       if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
-      { 
+      {
         return "Indexul Structurilor de Date";
       }
       else
       {
-        return "Indexul Claselor"; 
+        return "Indexul Claselor";
       }
 
     }
@@ -381,7 +382,7 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
     /*! This is used in LaTeX as the title of the chapter with the
      * list of all files.
      */
-    virtual QCString trFileIndex() 
+    virtual QCString trFileIndex()
     { return "Indexul Fişierelor"; }
 
     /*! This is used in LaTeX as the title of the chapter containing
@@ -394,14 +395,14 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
      *  the documentation of all classes, structs and unions.
      */
     virtual QCString trClassDocumentation()
-    { 
+    {
       if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
       {
-        return "Documentaţia Structurilor de Date"; 
+        return "Documentaţia Structurilor de Date";
       }
       else
       {
-        return "Documentaţia Claselor"; 
+        return "Documentaţia Claselor";
       }
 
     }
@@ -427,106 +428,106 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
     /*! This is used in LaTeX as the title of the document */
     virtual QCString trReferenceManual()
     { return "Manual de utilizare"; }
-    
-    /*! This is used in the documentation of a file as a header before the 
+
+    /*! This is used in the documentation of a file as a header before the
      *  list of defines
      */
     virtual QCString trDefines()
     { return "Definiţii"; }
 
-    /*! This is used in the documentation of a file as a header before the 
+    /*! This is used in the documentation of a file as a header before the
      *  list of function prototypes
      */
     virtual QCString trFuncProtos()
     { return "Prototipuri de funcţii"; }
 
-    /*! This is used in the documentation of a file as a header before the 
+    /*! This is used in the documentation of a file as a header before the
      *  list of typedefs
      */
     virtual QCString trTypedefs()
     { return "Definiţii de tipuri"; }
 
-    /*! This is used in the documentation of a file as a header before the 
+    /*! This is used in the documentation of a file as a header before the
      *  list of enumerations
      */
     virtual QCString trEnumerations()
     { return "Enumerări"; }
 
-    /*! This is used in the documentation of a file as a header before the 
+    /*! This is used in the documentation of a file as a header before the
      *  list of (global) functions
      */
     virtual QCString trFunctions()
     { return "Funcţii"; }
 
-    /*! This is used in the documentation of a file as a header before the 
+    /*! This is used in the documentation of a file as a header before the
      *  list of (global) variables
      */
     virtual QCString trVariables()
     { return "Variabile"; }
 
-    /*! This is used in the documentation of a file as a header before the 
+    /*! This is used in the documentation of a file as a header before the
      *  list of (global) variables
      */
     virtual QCString trEnumerationValues()
     { return "Valori de enumerări"; }
-    
+
     /*! This is used in the documentation of a file before the list of
      *  documentation blocks for defines
      */
     virtual QCString trDefineDocumentation()
     { return "Documentaţia definiţiilor"; }
 
-    /*! This is used in the documentation of a file/namespace before the list 
+    /*! This is used in the documentation of a file/namespace before the list
      *  of documentation blocks for function prototypes
      */
     virtual QCString trFunctionPrototypeDocumentation()
     { return "Documentaţia prototipurilor de funcţii"; }
 
-    /*! This is used in the documentation of a file/namespace before the list 
+    /*! This is used in the documentation of a file/namespace before the list
      *  of documentation blocks for typedefs
      */
     virtual QCString trTypedefDocumentation()
     { return "Documentaţia definiţiilor de tipuri"; }
 
-    /*! This is used in the documentation of a file/namespace before the list 
+    /*! This is used in the documentation of a file/namespace before the list
      *  of documentation blocks for enumeration types
      */
     virtual QCString trEnumerationTypeDocumentation()
     { return "Documentaţia enumerărilor"; }
 
-    /*! This is used in the documentation of a file/namespace before the list 
+    /*! This is used in the documentation of a file/namespace before the list
      *  of documentation blocks for functions
      */
     virtual QCString trFunctionDocumentation()
     { return "Documentaţia funcţiilor"; }
 
-    /*! This is used in the documentation of a file/namespace before the list 
+    /*! This is used in the documentation of a file/namespace before the list
      *  of documentation blocks for variables
      */
     virtual QCString trVariableDocumentation()
     { return "Documentaţia variabilelor"; }
 
-    /*! This is used in the documentation of a file/namespace/group before 
+    /*! This is used in the documentation of a file/namespace/group before
      *  the list of links to documented compounds
      */
     virtual QCString trCompounds()
-    { 
+    {
       if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
       {
-        return "Structuri de Date"; 
+        return "Structuri de Date";
       }
       else
       {
-        return "Membri"; 
+        return "Membri";
       }
 
     }
 
-    /*! This is used in the standard footer of each page and indicates when 
-     *  the page was generated 
+    /*! This is used in the standard footer of each page and indicates when
+     *  the page was generated
      */
     virtual QCString trGeneratedAt(const char *date,const char *projName)
-    { 
+    {
       QCString result=(QCString)"Generat "+date;
       if (projName) result+=(QCString)" pentru "+projName;
       result+=(QCString)" de către";
@@ -544,7 +545,7 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
     {
       return (QCString)"Diagrama de relaţii pentru "+clName;
     }
-    
+
     /*! this text is generated when the \\internal command is used. */
     virtual QCString trForInternalUseOnly()
     { return "Doar pentru uz intern."; }
@@ -576,13 +577,13 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
     /*! this text is generated when the \\exception command is used. */
     virtual QCString trExceptions()
     { return "Excepţii"; }
-    
+
     /*! this text is used in the title page of a LaTeX document. */
     virtual QCString trGeneratedBy()
     { return "Generat de"; }
 
     // new since 0.49-990307
-    
+
     /*! used as the title of page containing all the index of all namespaces. */
     virtual QCString trNamespaceList()
     { return "Lista de Namespace-uri"; }
@@ -602,17 +603,17 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
      */
     virtual QCString trFriends()
     { return "Prieteni"; }
-    
+
 //////////////////////////////////////////////////////////////////////////
 // new since 0.49-990405
 //////////////////////////////////////////////////////////////////////////
-    
+
     /*! used in the class documentation as a header before the list of all
-     * related classes 
+     * related classes
      */
     virtual QCString trRelatedFunctionDocumentation()
     { return "Documentaţia funcţiilor prietene sau înrudite"; }
-    
+
 //////////////////////////////////////////////////////////////////////////
 // new since 0.49-990425
 //////////////////////////////////////////////////////////////////////////
@@ -632,10 +633,11 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
         case ClassDef::Protocol:   result+="protocolul "; break;
         case ClassDef::Category:   result+="categoria "; break;
         case ClassDef::Exception:  result+="excepţia "; break;
+        default: break;
       }
-         if (isTemplate) result+=" (Template) ";
-         result+=(QCString)clName;
-      
+      if (isTemplate) result+=" (Template) ";
+      result+=(QCString)clName;
+
       return result;
     }
 
@@ -654,7 +656,7 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
       result+=namespaceName;
       return result;
     }
-    
+
     /* these are for the member sections of a class, struct or union */
     virtual QCString trPublicMembers()
     { return "Metode Publice"; }
@@ -676,7 +678,7 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
     { return "Conectori (slots) Privaţi"; }
     virtual QCString trStaticPrivateMembers()
     { return "Metode Statice Private"; }
-    
+
     /*! this function is used to produce a comma-separated list of items.
      *  use generateMarker(i) to indicate where item i should be put.
      */
@@ -685,23 +687,23 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
       QCString result;
       int i;
       // the inherits list contain `numEntries' classes
-      for (i=0;i<numEntries;i++) 
+      for (i=0;i<numEntries;i++)
       {
         // use generateMarker to generate placeholders for the class links!
-        result+=generateMarker(i); // generate marker for entry i in the list 
+        result+=generateMarker(i); // generate marker for entry i in the list
                                    // (order is left to right)
-        
+
         if (i!=numEntries-1)  // not the last entry, so we need a separator
         {
-          if (i<numEntries-2) // not the fore last entry 
+          if (i<numEntries-2) // not the fore last entry
             result+=", ";
           else                // the fore last entry
             result+=" şi ";
         }
       }
-      return result; 
+      return result;
     }
-    
+
     /*! used in class documentation to produce a list of base classes,
      *  if class diagrams are disabled.
      */
@@ -718,7 +720,7 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
       return "Moştenit de "+trWriteList(numEntries)+".";
     }
 
-    /*! used in member documentation blocks to produce a list of 
+    /*! used in member documentation blocks to produce a list of
      *  members that are hidden by this one.
      */
     virtual QCString trReimplementedFromList(int numEntries)
@@ -740,18 +742,18 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
 
     /*! This is an introduction to the page with all namespace members */
     virtual QCString trNamespaceMemberDescription(bool extractAll)
-    { 
+    {
       QCString result="Lista tuturor membrilor ";
       if (!extractAll) result+="documentaţi ";
          result+="din toate namespace-urile, cu legături către ";
-                 
-      if (extractAll) 
+
+      if (extractAll)
         result+="documentaţia namespace-ului pentru fiecare membru în parte:";
-      else 
+      else
         result+="namespace-urile de care aparţin:";
       return result;
     }
-    /*! This is used in LaTeX as the title of the chapter with the 
+    /*! This is used in LaTeX as the title of the chapter with the
      *  index of all namespaces.
      */
     virtual QCString trNamespaceIndex()
@@ -794,6 +796,7 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
         case ClassDef::Protocol:   result+="protocol"; break;
         case ClassDef::Category:   result+="categorie"; break;
         case ClassDef::Exception:  result+="excepţie"; break;
+        default: break;
       }
       result+=" a fost generată din fişier";
       if (single) result+="ul:"; else result+="ele:";
@@ -819,7 +822,7 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
     virtual QCString trMainPage()
     { return "Pagina principală"; }
 
-    /*! This is used in references to page that are put in the LaTeX 
+    /*! This is used in references to page that are put in the LaTeX
      *  documentation. It should be an abbreviation of the word page.
      */
     virtual QCString trPageAbbreviation()
@@ -864,7 +867,7 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
     /*! header that is put before the list of constructor/destructors. */
     virtual QCString trConstructorDocumentation()
     {
-      return "Documentaţia pentru Constructori şi Destructori"; 
+      return "Documentaţia pentru Constructori şi Destructori";
     }
     /*! Used in the file documentation to point to the corresponding sources. */
     virtual QCString trGotoSourceCode()
@@ -921,7 +924,7 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
 //////////////////////////////////////////////////////////////////////////
 // new since 1.1.0
 //////////////////////////////////////////////////////////////////////////
-    
+
     virtual QCString trNote()
     {
       return "Notă";
@@ -940,7 +943,7 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
       {
         return "Atribute Publice";
       }
-      
+
     }
     virtual QCString trStaticPublicAttribs()
     {
@@ -1011,7 +1014,7 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
     {
       return "Din";
     }
-    
+
 //////////////////////////////////////////////////////////////////////////
 // new since 1.1.5
 //////////////////////////////////////////////////////////////////////////
@@ -1024,7 +1027,7 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
     /*! page explaining how the dot graph's should be interpreted */
     virtual QCString trLegendDocs()
     {
-      return 
+      return
         "Această pagină arată modul în care trebuie să interpretaţi "
                "grafurile generate de doxygen.<p>\n"
         "Consideraţi următorul exemplu:\n"
@@ -1086,11 +1089,11 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
     {
       return "legenda";
     }
-    
+
 //////////////////////////////////////////////////////////////////////////
 // new since 1.2.0
 //////////////////////////////////////////////////////////////////////////
-    
+
     /*! Used as a marker that is put before a test item */
     virtual QCString trTest()
     {
@@ -1168,11 +1171,11 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
     {
       return "Valoare:";
     }
-    
+
 //////////////////////////////////////////////////////////////////////////
 // new since 1.2.5
 //////////////////////////////////////////////////////////////////////////
-    
+
     /*! Used as a marker that is put before a \\bug item */
     virtual QCString trBug()
     {
@@ -1188,9 +1191,9 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
 // new since 1.2.6
 //////////////////////////////////////////////////////////////////////////
 
-    /*! Used as ansicpg for RTF file 
-     * 
-     * The following table shows the correlation of Charset name, Charset Value and 
+    /*! Used as ansicpg for RTF file
+     *
+     * The following table shows the correlation of Charset name, Charset Value and
      * <pre>
      * Codepage number:
      * Charset Name       Charset Value(hex)  Codepage number
@@ -1211,15 +1214,15 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
      * GB2313_CHARSET          134 (x86)             936
      * CHINESEBIG5_CHARSET     136 (x88)             950
      * </pre>
-     * 
+     *
      */
     virtual QCString trRTFansicp()
     {
       return "1250"; //EASTEUROPE_CHARSET
     }
-    
 
-    /*! Used as ansicpg for RTF fcharset 
+
+    /*! Used as ansicpg for RTF fcharset
      *  \see trRTFansicp() for a table of possible values.
      */
     virtual QCString trRTFCharSet()
@@ -1232,82 +1235,82 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
     {
       return "Index";
     }
-   
+
     /*! This is used for translation of the word that will possibly
-     *  be followed by a single name or by a list of names 
+     *  be followed by a single name or by a list of names
      *  of the category.
      */
     virtual QCString trClass(bool first_capital, bool singular)
-    { 
+    {
       QCString result((first_capital ? "Clas" : "clas"));
        result+= singular ? "a":"ele";
-      return result; 
+      return result;
     }
 
     /*! This is used for translation of the word that will possibly
-     *  be followed by a single name or by a list of names 
+     *  be followed by a single name or by a list of names
      *  of the category.
      */
     virtual QCString trFile(bool first_capital, bool singular)
-    { 
+    {
       QCString result((first_capital ? "Fişier" : "fişier"));
        result+= singular ? "ul":"ele";
-      return result; 
+      return result;
     }
 
     /*! This is used for translation of the word that will possibly
-     *  be followed by a single name or by a list of names 
+     *  be followed by a single name or by a list of names
      *  of the category.
      */
     virtual QCString trNamespace(bool first_capital, bool singular)
-    { 
+    {
       QCString result((first_capital ? "Namespace" : "namespace"));
        result+= singular ? "-ul":"-urile";
-      return result; 
+      return result;
     }
 
     /*! This is used for translation of the word that will possibly
-     *  be followed by a single name or by a list of names 
+     *  be followed by a single name or by a list of names
      *  of the category.
      */
     virtual QCString trGroup(bool first_capital, bool singular)
-    { 
+    {
       QCString result((first_capital ? "Grupu" : "grupu"));
        result+= singular ? "l":"rile";
-      return result; 
+      return result;
     }
 
     /*! This is used for translation of the word that will possibly
-     *  be followed by a single name or by a list of names 
+     *  be followed by a single name or by a list of names
      *  of the category.
      */
     virtual QCString trPage(bool first_capital, bool singular)
-    { 
+    {
       QCString result((first_capital ? "Pagin" : "pagin"));
        result+= singular ? "a":"ile";
-      return result; 
+      return result;
     }
 
     /*! This is used for translation of the word that will possibly
-     *  be followed by a single name or by a list of names 
+     *  be followed by a single name or by a list of names
      *  of the category.
      */
     virtual QCString trMember(bool first_capital, bool singular)
-    { 
+    {
       QCString result((first_capital ? "Membr" : "membr"));
        result+= singular ? "ul":"ii";
-      return result; 
+      return result;
     }
-   
+
     /*! This is used for translation of the word that will possibly
-     *  be followed by a single name or by a list of names 
+     *  be followed by a single name or by a list of names
      *  of the category.
      */
     virtual QCString trGlobal(bool first_capital, bool singular)
-    { 
+    {
       QCString result((first_capital ? "Global" : "global"));
       if (!singular)  result+="e";
-      return result; 
+      return result;
     }
 
 //////////////////////////////////////////////////////////////////////////
@@ -1317,10 +1320,10 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
     /*! This text is generated when the \\author command is used and
      *  for the author section in man pages. */
     virtual QCString trAuthor(bool first_capital, bool singular)
-    {                                                                         
+    {
       QCString result((first_capital ? "Autor" : "autor"));
        result+= singular ? "ul":"ii";
-      return result; 
+      return result;
     }
 
 //////////////////////////////////////////////////////////////////////////
@@ -1338,7 +1341,7 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
 // new since 1.2.13
 //////////////////////////////////////////////////////////////////////////
 
-    /*! used in member documentation blocks to produce a list of 
+    /*! used in member documentation blocks to produce a list of
      *  members that are implemented by this one.
      */
     virtual QCString trImplementedFromList(int numEntries)
@@ -1370,8 +1373,8 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
 // new since 1.2.17
 //////////////////////////////////////////////////////////////////////////
 
-    /*! Used as the header of the list of item that have been 
-     *  flagged deprecated 
+    /*! Used as the header of the list of item that have been
+     *  flagged deprecated
      */
     virtual QCString trDeprecatedList()
     {
@@ -1382,7 +1385,7 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
 // new since 1.2.18
 //////////////////////////////////////////////////////////////////////////
 
-    /*! Used as a header for declaration section of the events found in 
+    /*! Used as a header for declaration section of the events found in
      * a C# program
      */
     virtual QCString trEvents()
@@ -1402,35 +1405,35 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
     /*! Used as a heading for a list of Java class types with package scope.
      */
     virtual QCString trPackageTypes()
-    { 
+    {
       return "Tipuri în pachet";
     }
-    /*! Used as a heading for a list of Java class functions with package 
-     * scope. 
+    /*! Used as a heading for a list of Java class functions with package
+     * scope.
      */
     virtual QCString trPackageMembers()
-    { 
+    {
       return "Funcţii în pachet";
     }
-    /*! Used as a heading for a list of static Java class functions with 
+    /*! Used as a heading for a list of static Java class functions with
      *  package scope.
      */
     virtual QCString trStaticPackageMembers()
-    { 
+    {
       return "Funcţii statice în pachet";
     }
-    /*! Used as a heading for a list of Java class variables with package 
+    /*! Used as a heading for a list of Java class variables with package
      * scope.
      */
     virtual QCString trPackageAttribs()
-    { 
+    {
       return "Atribute în pachet";
     }
-    /*! Used as a heading for a list of static Java class variables with 
+    /*! Used as a heading for a list of static Java class variables with
      * package scope.
      */
     virtual QCString trStaticPackageAttribs()
-    { 
+    {
       return "Atribute statice în pachet";
     }
 
@@ -1438,7 +1441,7 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
 // new since 1.3.1
 //////////////////////////////////////////////////////////////////////////
 
-    /*! Used in the quick index of a class/file/namespace member list page 
+    /*! Used in the quick index of a class/file/namespace member list page
      *  to link to the unfiltered list of all members.
      */
     virtual QCString trAll()
@@ -1455,9 +1458,9 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
 // new since 1.3.3
 //////////////////////////////////////////////////////////////////////////
 
-    /*! When the search engine is enabled this text is put in the header 
-     *  of each page before the field where one can enter the text to search 
-     *  for. 
+    /*! When the search engine is enabled this text is put in the header
+     *  of each page before the field where one can enter the text to search
+     *  for.
      */
     virtual QCString trSearchForIndex()
     {
@@ -1474,7 +1477,7 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
      *  text can be different depending on the number of documents found.
      *  Inside the text you can put the special marker $num to insert
      *  the number representing the actual number of search results.
-     *  The @a numDocuments parameter can be either 0, 1 or 2, where the 
+     *  The @a numDocuments parameter can be either 0, 1 or 2, where the
      *  value 2 represents 2 or more matches. HTML markup is allowed inside
      *  the returned string.
      */
@@ -1488,13 +1491,13 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
       {
         return "Am găsit <b>1</b> document corespunzând cererii.";
       }
-      else 
+      else
       {
         return "Am găsit <b>$num</b> documente corespunzând cererii. "
                "Lista documentelor găsite, sortate după relevanţă.";
       }
     }
-    /*! This string is put before the list of matched words, for each search 
+    /*! This string is put before the list of matched words, for each search
      *  result. What follows is the list of words that matched the query.
      */
     virtual QCString trSearchMatches()
@@ -1547,9 +1550,9 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
       *  directory is passed via \a dirName.
       */
      virtual QCString trDirReference(const char *dirName)
-     { 
-       QCString  result="Director-referinţă "; result+=dirName; 
-       return result; 
+     {
+       QCString  result="Director-referinţă "; result+=dirName;
+       return result;
      }
 
      /*! This returns the word directory with or without starting capital
@@ -1586,7 +1589,7 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
       return "Graful de apeluri pentru această funcţie:";
     }
 
-    /*! This is used in the documentation of a file/namespace before the list 
+    /*! This is used in the documentation of a file/namespace before the list
      *  of documentation blocks for enumeration values
      */
     virtual QCString trEnumerationValueDocumentation()
@@ -1595,12 +1598,12 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
 //////////////////////////////////////////////////////////////////////////
 // new since 1.5.4 (mainly for Fortran)
 //////////////////////////////////////////////////////////////////////////
-    
+
     /*! header that is put before the list of member subprograms (Fortran). */
     virtual QCString trMemberFunctionDocumentationFortran()
     { return "Documentaţia Funcţiei Membre/Subrutinei"; }
 
-    /*! This is put above each page as a link to the list of annotated data types (Fortran). */    
+    /*! This is put above each page as a link to the list of annotated data types (Fortran). */
     virtual QCString trCompoundListFortran()
     { return "Lista Tipurilor de Date"; }
 
@@ -1621,18 +1624,18 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
         result+="documentate ";
       }
       result+=" cu legături către ";
-      if (!extractAll) 
+      if (!extractAll)
       {
          result+="documentaţia structurii de date pentru fiecare membru";
       }
-      else 
+      else
       {
          result+="tipurile de date de care aparţin:";
       }
       return result;
     }
 
-    /*! This is used in LaTeX as the title of the chapter with the 
+    /*! This is used in LaTeX as the title of the chapter with the
      * annotated compound index (Fortran).
      */
     virtual QCString trCompoundIndexFortran()
@@ -1644,24 +1647,24 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
     virtual QCString trTypeDocumentation()
     { return "Documentaţia Tipurilor de Date"; }
 
-    /*! This is used in the documentation of a file as a header before the 
+    /*! This is used in the documentation of a file as a header before the
      *  list of (global) subprograms (Fortran).
      */
     virtual QCString trSubprograms()
     { return "Funcţii/Subrutine"; }
 
-    /*! This is used in the documentation of a file/namespace before the list 
+    /*! This is used in the documentation of a file/namespace before the list
      *  of documentation blocks for subprograms (Fortran)
      */
     virtual QCString trSubprogramDocumentation()
     { return "Documentaţia Funcţiilor/Subrutinelor"; }
 
-    /*! This is used in the documentation of a file/namespace/group before 
+    /*! This is used in the documentation of a file/namespace/group before
      *  the list of links to documented compounds (Fortran)
      */
      virtual QCString trDataTypes()
     { return "Tipuri de Date"; }
-    
+
     /*! used as the title of page containing all the index of all modules (Fortran). */
     virtual QCString trModulesList()
     { return "Lista Modulelor"; }
@@ -1690,6 +1693,7 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
         case ClassDef::Protocol:   result+="Protocolul "; break;
         case ClassDef::Category:   result+="Categoria "; break;
         case ClassDef::Exception:  result+="Excepţia "; break;
+        default: break;
       }
       if (isTemplate) result+="(Template) ";
          result+=(QCString)clName;
@@ -1702,44 +1706,44 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
          result += namespaceName;
       return result;
     }
-    
+
     /*! This is put above each page as a link to all members of modules. (Fortran) */
     virtual QCString trModulesMembers()
     { return "Membrii Modulului"; }
 
     /*! This is an introduction to the page with all modules members (Fortran) */
     virtual QCString trModulesMemberDescription(bool extractAll)
-    { 
+    {
       QCString result="Lista tuturor membrilor ";
       if (!extractAll) result+="documentaţi ai ";
       result+="modulului cu legături către ";
-      if (extractAll) 
+      if (extractAll)
       {
         result+="documentaţia modulului pentru fiecare membru:";
       }
-      else 
+      else
       {
         result+="modulele de care aparţin:";
       }
       return result;
     }
 
-    /*! This is used in LaTeX as the title of the chapter with the 
+    /*! This is used in LaTeX as the title of the chapter with the
      *  index of all modules (Fortran).
      */
     virtual QCString trModulesIndex()
     { return "Indexul Modulelor"; }
-    
+
     /*! This is used for translation of the word that will possibly
-     *  be followed by a single name or by a list of names 
+     *  be followed by a single name or by a list of names
      *  of the category.
      */
     virtual QCString trModule(bool first_capital, bool singular)
-    {       
+    {
       QCString result((first_capital ? "Modul" : "modul"));
       if (singular)  result+="ul";
          else result += "ele";
-      return result; 
+      return result;
     }
     /*! This is put at the bottom of a module documentation page and is
      *  followed by a list of files that were used to generate the page.
@@ -1758,32 +1762,33 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
         case ClassDef::Protocol:   result+="protocolului"; break;
         case ClassDef::Category:   result+="categoriei"; break;
         case ClassDef::Exception:  result+="excepţiei"; break;
+        default: break;
       }
       result+=" a fost generată din următo";
       if (single) result+="rul fişier:"; else result+="arele fişiere:";
       return result;
     }
     /*! This is used for translation of the word that will possibly
-     *  be followed by a single name or by a list of names 
+     *  be followed by a single name or by a list of names
      *  of the category.
      */
     virtual QCString trType(bool first_capital, bool singular)
-    { 
+    {
       QCString result((first_capital ? "Tip" : "tip"));
       if (singular)  result+="ul";
          else result += "urile";
-      return result; 
+      return result;
     }
     /*! This is used for translation of the word that will possibly
-     *  be followed by a single name or by a list of names 
+     *  be followed by a single name or by a list of names
      *  of the category.
      */
     virtual QCString trSubprogram(bool first_capital, bool singular)
-    { 
+    {
       QCString result((first_capital ? "Subprogram" : "subprogram"));
       if (singular)  result+="ul";
-         else result += "urile";
-      return result; 
+         else result += "ele";
+      return result;
     }
 
     /*! C# Type Constraint list */
@@ -1791,7 +1796,279 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
     {
       return "Constrângerile de Tip";
     }
-        
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.6.0 (mainly for the new search engine)
+//////////////////////////////////////////////////////////////////////////
+
+    /*! directory relation for \a name */
+    virtual QCString trDirRelation(const char *name)
+    {
+      return QCString(name)+" Relație";
+    }
+
+    /*! Loading message shown when loading search results */
+    virtual QCString trLoading()
+    {
+      return "Se încarcă...";
+    }
+
+    /*! Label used for search results in the global namespace */
+    virtual QCString trGlobalNamespace()
+    {
+      return "Namespace Global";
+    }
+
+    /*! Message shown while searching */
+    virtual QCString trSearching()
+    {
+      return "Căutare...";
+    }
+
+    /*! Text shown when no search results are found */
+    virtual QCString trNoMatches()
+    {
+      return "Niciun rezultat";
+    }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.6.3 (missing items for the directory pages)
+//////////////////////////////////////////////////////////////////////////
+
+    /*! introduction text for the directory dependency graph */
+    virtual QCString trDirDependency(const char *name)
+    {
+      return (QCString)"Grafic de dependență a directoarelor pentru "+name;
+    }
+
+    /*! when clicking a directory dependency label, a page with a
+     *  table is shown. The heading for the first column mentions the
+     *  source file that has a relation to another file.
+     */
+    virtual QCString trFileIn(const char *name)
+    {
+      return (QCString)"Fișierul din "+name;
+    }
+
+    /*! when clicking a directory dependency label, a page with a
+     *  table is shown. The heading for the second column mentions the
+     *  destination file that is included.
+     */
+    virtual QCString trIncludesFileIn(const char *name)
+    {
+      return (QCString)"Include fișierul din "+name;
+    }
+
+    /** Compiles a date string.
+     *  @param year Year in 4 digits
+     *  @param month Month of the year: 1=January
+     *  @param day Day of the Month: 1..31
+     *  @param dayOfWeek Day of the week: 1=Monday..7=Sunday
+     *  @param hour Hour of the day: 0..23
+     *  @param minutes Minutes in the hour: 0..59
+     *  @param seconds Seconds within the minute: 0..59
+     *  @param includeTime Include time in the result string?
+     */
+    virtual QCString trDateTime(int year,int month,int day,int dayOfWeek,
+                                int hour,int minutes,int seconds,
+                                bool includeTime)
+    {
+      static const char *days[]   = { "Luni","Marți","Miercuri","Joi","Vineri","Sâmbătă","Duminică" };
+      static const char *months[] = { "Ian","Feb","Mar","Apr","Mai","Iun","Iul","Aug","Sep","Oct","Noi","Dec" };
+      QCString sdate;
+      sdate.sprintf("%s %s %d %d",days[dayOfWeek-1],months[month-1],day,year);
+      if (includeTime)
+      {
+        QCString stime;
+        stime.sprintf(" %.2d:%.2d:%.2d",hour,minutes,seconds);
+        sdate+=stime;
+      }
+      return sdate;
+    }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.7.5
+//////////////////////////////////////////////////////////////////////////
+
+    /*! Header for the page with bibliographic citations */
+    virtual QCString trCiteReferences()
+    { return "Referințe Bibliografice"; }
+
+    /*! Text for copyright paragraph */
+    virtual QCString trCopyright()
+    { return "Copyright"; }
+
+    /*! Header for the graph showing the directory dependencies */
+    virtual QCString trDirDepGraph(const char *name)
+    { return QCString("Grafic de dependență a directoarelor pentru ")+name+":"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.8.0
+//////////////////////////////////////////////////////////////////////////
+
+    /*! Detail level selector shown for hierarchical indices */
+    virtual QCString trDetailLevel()
+    { return "nivel de detaliu"; }
+
+    /*! Section header for list of template parameters */
+    virtual QCString trTemplateParameters()
+    { return "Parametri Template"; }
+
+    /*! Used in dot graph when UML_LOOK is enabled and there are many fields */
+    virtual QCString trAndMore(const QCString &number)
+    { return "și încă " + number; }
+
+    /*! Used file list for a Java enum */
+    virtual QCString trEnumGeneratedFromFiles(bool single)
+    { QCString result = "Documentația pentru acest enum a fost generată din ";
+      if (single)
+        result += "următorul fișier:";
+      else
+        result += "următoarele fișiere:";
+      return result;
+    }
+
+    /*! Header of a Java enum page (Java enums are represented as classes). */
+    virtual QCString trEnumReference(const char *name)
+    { return QCString(name)+" Referință Enum"; }
+
+    /*! Used for a section containing inherited members */
+    virtual QCString trInheritedFrom(const char *members,const char *what)
+    { return QCString(members)+" moștenit(e) din "+what; }
+
+    /*! Header of the sections with inherited members specific for the
+     *  base class(es)
+     */
+    virtual QCString trAdditionalInheritedMembers()
+    { return "Membri Moșteniți Adiționali"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.8.2
+//////////////////////////////////////////////////////////////////////////
+
+    /*! Used as a tooltip for the toggle button that appears in the
+     *  navigation tree in the HTML output when GENERATE_TREEVIEW is
+     *  enabled. This tooltip explains the meaning of the button.
+     */
+    virtual QCString trPanelSynchronisationTooltip(bool enable)
+    {
+      QCString opt = enable ? "activa" : "dezactiva";
+      return "apasă 'click' pentru a "+opt+" sincronizarea panourilor";
+    }
+
+    /*! Used in a method of an Objective-C class that is declared in a
+     *  a category. Note that the @1 marker is required and is replaced
+     *  by a link.
+     */
+    virtual QCString trProvidedByCategory()
+    {
+      return "Furnizat de categoria @1.";
+    }
+
+    /*! Used in a method of an Objective-C category that extends a class.
+     *  Note that the @1 marker is required and is replaced by a link to
+     *  the class method.
+     */
+    virtual QCString trExtendsClass()
+    {
+      return "Extinde clasa @1.";
+    }
+
+    /*! Used as the header of a list of class methods in Objective-C.
+     *  These are similar to static public member functions in C++.
+     */
+    virtual QCString trClassMethods()
+    {
+      return "Metodele Clasei";
+    }
+
+    /*! Used as the header of a list of instance methods in Objective-C.
+     *  These are similar to public member functions in C++.
+     */
+    virtual QCString trInstanceMethods()
+    {
+      return "Metodele Instanței";
+    }
+
+    /*! Used as the header of the member functions of an Objective-C class.
+     */
+    virtual QCString trMethodDocumentation()
+    {
+      return "Documentația Metodelor";
+    }
+
+    /*! Used as the title of the design overview picture created for the
+     *  VHDL output.
+     */
+    virtual QCString trDesignOverview()
+    {
+      return "Vedere de Ansamblu a Designului";
+    }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.8.4
+//////////////////////////////////////////////////////////////////////////
+
+    /** old style UNO IDL services: implemented interfaces */
+    virtual QCString trInterfaces()
+    { return "Interfețe exportate"; }
+
+    /** old style UNO IDL services: inherited services */
+    virtual QCString trServices()
+    { return "Servicii Incluse"; }
+
+    /** UNO IDL constant groups */
+    virtual QCString trConstantGroups()
+    { return "Grupuri Constante"; }
+
+    /** UNO IDL constant groups */
+    virtual QCString trConstantGroupReference(const char *namespaceName)
+    {
+      QCString result=namespaceName;
+      result+=" Referință Grup Constant";
+      return result;
+    }
+    /** UNO IDL service page title */
+    virtual QCString trServiceReference(const char *sName)
+    {
+      QCString result=(QCString)sName;
+      result+=" Referință Serviciu";
+      return result;
+    }
+    /** UNO IDL singleton page title */
+    virtual QCString trSingletonReference(const char *sName)
+    {
+      QCString result=(QCString)sName;
+      result+=" Referință Singleton";
+      return result;
+    }
+    /** UNO IDL service page */
+    virtual QCString trServiceGeneratedFromFiles(bool single)
+    {
+      // single is true implies a single file
+      QCString result=(QCString)"Documentația pentru acest serviciu "
+                                "a fost generată din ";
+      if (single)
+        result += "următorul fișier:";
+      else
+        result += "următoarele fișiere:";
+      return result;
+    }
+    /** UNO IDL singleton page */
+    virtual QCString trSingletonGeneratedFromFiles(bool single)
+    {
+      // single is true implies a single file
+      QCString result=(QCString)"Documentația pentru acest singleton "
+                                "a fost generată din ";
+      if (single)
+        result += "următorul fișier:";
+      else
+        result += "următoarele fișiere:";
+      return result;
+    }
+
+//////////////////////////////////////////////////////////////////////////
+
 };
 
 #endif
index e7f7d95..5c8295a 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -581,6 +581,7 @@ class TranslatorRussian : public TranslatorAdapter_1_7_5
           case ClassDef::Protocol:   result+="протокола"; break;
           case ClassDef::Category:   result+="категории"; break;
           case ClassDef::Exception:  result+="исключения"; break;
+          default: break;
         }
       }
       else
@@ -594,6 +595,7 @@ class TranslatorRussian : public TranslatorAdapter_1_7_5
           case ClassDef::Protocol:   result+="Протокол"; break;
           case ClassDef::Category:   result+="Категория"; break;
           case ClassDef::Exception:  result+="Исключение"; break;
+          default: break;
         }
       }
       result+=" ";
@@ -765,6 +767,8 @@ class TranslatorRussian : public TranslatorAdapter_1_7_5
         case ClassDef::Exception:  result+="исключени";
           if (single) result+="я"; else result+="й";
           break;
+        default: 
+          break;
       }
       result+=" находятся в файл";
       if (single) result+="е:"; else result+="ах:";
@@ -1644,6 +1648,7 @@ class TranslatorRussian : public TranslatorAdapter_1_7_5
          case ClassDef::Protocol:   result+=" Протокол"; break;
          case ClassDef::Category:   result+=" Категория"; break;
          case ClassDef::Exception:  result+=" Исключение"; break;
+          default: break;
        }
       }
       else
@@ -1658,6 +1663,7 @@ class TranslatorRussian : public TranslatorAdapter_1_7_5
          case ClassDef::Protocol:   result+="протокола"; break;
          case ClassDef::Category:   result+="категории"; break;
          case ClassDef::Exception:  result+="исключения"; break;
+          default: break;
        }
       }
       return result;
@@ -1722,6 +1728,7 @@ class TranslatorRussian : public TranslatorAdapter_1_7_5
         case ClassDef::Protocol:   result+="протоколу"; break;
         case ClassDef::Category:   result+="кетегории"; break;
         case ClassDef::Exception:  result+="исключению"; break;
+        default: break;
       }
       result+=" сгенерирована на основе следующ";
       if (single) result+="его файла:"; else result+="их файлов:";
index 2ea2091..edf5ba2 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -611,30 +611,35 @@ class TranslatorSerbianCyrilic : public TranslatorAdapter_1_6_0
                                     bool isTemplate)
     {
       QCString result=(QCString)clName;
-      if (isTemplate) {
-       result+=" Шаблон";
-       switch(compType)
-       {
-               case ClassDef::Class:      result+="ска класа"; break;
-               case ClassDef::Struct:     result+="ска структура"; break;
-               case ClassDef::Union:      result+="ска унија"; break;
-               case ClassDef::Interface:  result+="ски интерфејс"; break;
-               case ClassDef::Protocol:   result+="ски протокол"; break;
-               case ClassDef::Category:   result+="ска категорија"; break;
-               case ClassDef::Exception:  result+="ски изузетак"; break;
-       }
-      } else {
-       result+=" Референца";
-       switch(compType)
-       {
-               case ClassDef::Class:      result+=" класе"; break;
-               case ClassDef::Struct:     result+=" структуре"; break;
-               case ClassDef::Union:      result+=" уније"; break;
-               case ClassDef::Interface:  result+=" интерфејса"; break;
-               case ClassDef::Protocol:   result+=" протокола"; break;
-               case ClassDef::Category:   result+=" категорије"; break;
-               case ClassDef::Exception:  result+=" изузетка"; break;
-       }
+      if (isTemplate) 
+      {
+        result+=" Шаблон";
+        switch(compType)
+        {
+          case ClassDef::Class:      result+="ска класа"; break;
+          case ClassDef::Struct:     result+="ска структура"; break;
+          case ClassDef::Union:      result+="ска унија"; break;
+          case ClassDef::Interface:  result+="ски интерфејс"; break;
+          case ClassDef::Protocol:   result+="ски протокол"; break;
+          case ClassDef::Category:   result+="ска категорија"; break;
+          case ClassDef::Exception:  result+="ски изузетак"; break;
+          default: break;
+        }
+      } 
+      else 
+      {
+        result+=" Референца";
+        switch(compType)
+        {
+          case ClassDef::Class:      result+=" класе"; break;
+          case ClassDef::Struct:     result+=" структуре"; break;
+          case ClassDef::Union:      result+=" уније"; break;
+          case ClassDef::Interface:  result+=" интерфејса"; break;
+          case ClassDef::Protocol:   result+=" протокола"; break;
+          case ClassDef::Category:   result+=" категорије"; break;
+          case ClassDef::Exception:  result+=" изузетка"; break;
+          default: break;
+        }
       }
       return result;
     }
@@ -792,6 +797,7 @@ class TranslatorSerbianCyrilic : public TranslatorAdapter_1_6_0
         case ClassDef::Protocol:   result+="овај протокол"; break;
         case ClassDef::Category:   result+="ову категорију"; break;
         case ClassDef::Exception:  result+="овај изузетак"; break;
+        default: break;
       }
       result+=" је произведена из";
       if (single) result+="следеће датотеке:"; else result+="следећих датотека:";
@@ -1217,7 +1223,7 @@ class TranslatorSerbianCyrilic : public TranslatorAdapter_1_6_0
      */
     virtual QCString trRTFansicp()
     {
-      return "1252";
+      return "1251";
     }
     
 
@@ -1226,7 +1232,7 @@ class TranslatorSerbianCyrilic : public TranslatorAdapter_1_6_0
      */
     virtual QCString trRTFCharSet()
     {
-      return "0";
+      return "204";
     }
 
     /*! Used as header RTF general index */
@@ -1703,6 +1709,7 @@ class TranslatorSerbianCyrilic : public TranslatorAdapter_1_6_0
         case ClassDef::Protocol:   result+=" протокола"; break;
         case ClassDef::Category:   result+=" категорије"; break;
         case ClassDef::Exception:  result+=" изузетка"; break;
+        default: break;
       }
       return result;
     }
@@ -1768,6 +1775,7 @@ class TranslatorSerbianCyrilic : public TranslatorAdapter_1_6_0
         case ClassDef::Protocol:   result+="овај протокол"; break;
         case ClassDef::Category:   result+="ову категорију"; break;
         case ClassDef::Exception:  result+="овај изузетак"; break;
+        default: break;
       }
       result+=" је направљен из следећ";
       if (single) result+="е датотеке:"; else result+="их датотека:";
index 8be0cd4..7295e44 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -281,8 +281,9 @@ class TranslatorSlovene : public TranslatorAdapter_1_4_6
         case ClassDef::Protocol:   result+=" protocol "; break; // translate me!
         case ClassDef::Category:   result+=" category "; break; // translate me!
         case ClassDef::Exception:  result+=" IDL prekinitev "; break;
+        default: break;
       }
-         result += (QCString)clName;
+      result += (QCString)clName;
       
       return result;
     }
@@ -429,6 +430,7 @@ class TranslatorSlovene : public TranslatorAdapter_1_4_6
         case ClassDef::Protocol:   result+="protocol"; break; // translate me!
         case ClassDef::Category:   result+="category"; break; // translate me!
         case ClassDef::Exception:  result+="prekinitve (exception)"; break;
+        default: break;
       }
       result+=" je zgrajen na podlagi naslednj";
       if (single) result+="e "; else result+="ih";
index df3feea..836d7f2 100644 (file)
@@ -2,7 +2,7 @@
  *
  *
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby
@@ -17,6 +17,7 @@
 
 // Updates:
 // --------
+// 2013/05/14 - Updates for "new since 1.8.4".
 // 2012/08/02 - Updates for "new since 1.8.2".
 // 2012/04/18 - Updates for "new since 1.8.0".
 // 2011/07/28 - Updates for "new since 1.7.5".
@@ -593,6 +594,7 @@ class TranslatorSlovak : public Translator
         case ClassDef::Protocol:   result+="protokol "; break;
         case ClassDef::Category:   result+="kategória "; break;
         case ClassDef::Exception:  result+="výnimky "; break;
+        default: break;
       }
       result+=clName;
       return result;
@@ -765,6 +767,7 @@ class TranslatorSlovak : public Translator
         case ClassDef::Protocol:   result+="protokol"; break;
         case ClassDef::Category:   result+="kategória"; break;
         case ClassDef::Exception:  result+="túto výnimku"; break;
+        default: break;
       }
       result+=" bola generovaná z ";
       if (single) result+="nasledujúceho súboru:";
@@ -1172,7 +1175,7 @@ class TranslatorSlovak : public Translator
     /*! Used as ansicpg for RTF fcharset */
     virtual QCString trRTFCharSet()
     {
-      return "3";
+      return "238";
     }
 
     /*! Used as header RTF general index */
@@ -1645,6 +1648,7 @@ class TranslatorSlovak : public Translator
         case ClassDef::Protocol:   result += "protokolu "; break;
         case ClassDef::Category:   result += "kategórie "; break;
         case ClassDef::Exception:  result += "výnimky "; break;
+        default: break;
       }
       result += clName;
       return result;
@@ -1712,6 +1716,7 @@ class TranslatorSlovak : public Translator
         case ClassDef::Protocol:   result+="k tomuto protokolu"; break;
         case ClassDef::Category:   result+="k tejto kategórii"; break;
         case ClassDef::Exception:  result+="k tejto výnimke"; break;
+        default: break;
       }
       result+=" bola vygenerovaná z ";
       if (single) result+="nasledujúceho súboru:";
@@ -1959,6 +1964,62 @@ class TranslatorSlovak : public Translator
     }
 
 //////////////////////////////////////////////////////////////////////////
+// new since 1.8.4
+//////////////////////////////////////////////////////////////////////////
+
+    /** old style UNO IDL services: implemented interfaces */
+    virtual QCString trInterfaces()
+    { return "Exportované rozhrania"; }
+
+    /** old style UNO IDL services: inherited services */
+    virtual QCString trServices()
+    { return "Začlenené služby"; }
+
+    /** UNO IDL constant groups */
+    virtual QCString trConstantGroups()
+    { return "Konštantné skupiny"; }
+
+    /** UNO IDL constant groups */
+    virtual QCString trConstantGroupReference(const char *namespaceName)
+    {
+      QCString result="Konštantné skupiny z ";
+      result += namespaceName;
+      return result;
+    }
+    /** UNO IDL service page title */
+    virtual QCString trServiceReference(const char *sName)
+    {
+      QCString result="Popis služby ";
+      result += sName;
+      return result;
+    }
+    /** UNO IDL singleton page title */
+    virtual QCString trSingletonReference(const char *sName)
+    {
+      QCString result="Popis singletonu ";
+      result += sName;
+      return result;
+    }
+    /** UNO IDL service page */
+    virtual QCString trServiceGeneratedFromFiles(bool single)
+    {
+      // single is true implies a single file
+      QCString result="Dokumentácia k tejto službe bola vygenerovaná ";
+      if (single) result+="z nasledujúceho súboru:";
+      else        result+="z nasledujúcich súborov:";
+      return result;
+    }
+    /** UNO IDL singleton page */
+    virtual QCString trSingletonGeneratedFromFiles(bool single)
+    {
+      // single is true implies a single file
+      QCString result="Dokumentácia k tomuto singletonu bola vygenerovaná ";
+      if (single) result+="z nasledujúceho súboru:";
+      else        result+="z nasledujúcich súborov:";
+      return result;
+    }
+
+//////////////////////////////////////////////////////////////////////////
 };
 
 #endif // TRANSLATOR_SK_H
index b12f87c..7311eac 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -623,6 +623,7 @@ private:
         case ClassDef::Protocol:   result+="protokola "; break;
         case ClassDef::Category:   result+="kategorije "; break;
         case ClassDef::Exception:  result+="izuzetka "; break;
+        default: break;
       }
       if (isTemplate) result += "šablona ";  
       result += clName;
@@ -782,6 +783,7 @@ private:
         case ClassDef::Protocol:   result+="ovog protokola"; break;
         case ClassDef::Category:   result+="ove kategorije"; break;
         case ClassDef::Exception:  result+="ovog izuzetka"; break;
+        default: break;
       }
       result+=" je napravljena na osnovu ";
       if (single) result+="datoteke "; else result+="sledećih datoteka:";
@@ -1680,6 +1682,7 @@ private:
         case ClassDef::Protocol:   result+=" Protokol"; break;
         case ClassDef::Category:   result+=" Kategorija"; break;
         case ClassDef::Exception:  result+=" Izuzetak"; break;
+        default: break;
       }
       result+=" - sažet pregled";
       if (isTemplate) result+=" šablona";
@@ -1747,6 +1750,7 @@ private:
         case ClassDef::Protocol:   result+="protokol"; break;
         case ClassDef::Category:   result+="kategoriju"; break;
         case ClassDef::Exception:  result+="izuzetak"; break;
+        default: break;
       }
       result+=" napravljena je automatski od sledeć";
       if (single) result+="e datoteke:"; else result+="ih datoteka:";
index d6eeff7..b6bb3d7 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -509,6 +509,7 @@ class TranslatorSwedish : public TranslatorAdapter_1_6_0
         case ClassDef::Protocol:   result+=" protocol"; break; // translate me!
         case ClassDef::Category:   result+=" category"; break; // translate me!
         case ClassDef::Exception:  result+=" undantag"; break;
+        default: break;
       }
       if (isTemplate) result+="template";
       result+="referens";
@@ -650,6 +651,7 @@ class TranslatorSwedish : public TranslatorAdapter_1_6_0
         case ClassDef::Protocol:   result+="protocol"; break; // translate me!
         case ClassDef::Category:   result+="category"; break; // translate me!
         case ClassDef::Exception:  result+="detta undantag "; break;
+        default: break;
       }
       result+="var genererad från följande fil";
       if (single) result+=":"; else result+="er:";
@@ -1548,6 +1550,7 @@ class TranslatorSwedish : public TranslatorAdapter_1_6_0
         case ClassDef::Protocol:   result+=" Protokoll"; break;
         case ClassDef::Category:   result+=" Kategori"; break;
         case ClassDef::Exception:  result+=" Undantag"; break;
+        default: break;
       }
       if (isTemplate) result+=" Mall";
       result+=" Referens";
@@ -1613,6 +1616,7 @@ class TranslatorSwedish : public TranslatorAdapter_1_6_0
         case ClassDef::Protocol:   result+="protokoll"; break;
         case ClassDef::Category:   result+="kategori"; break;
         case ClassDef::Exception:  result+="undantag"; break;
+        default: break;
       }
       result+=" genererades från följade fil";
       if (single) result+=":"; else result+="er:";
index 4370400..9c66c55 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -620,6 +620,7 @@ class TranslatorTurkish : public TranslatorAdapter_1_7_5
         case ClassDef::Protocol:   result+=" Protokol"; break;
         case ClassDef::Category:   result+=" Kategori"; break;
         case ClassDef::Exception:  result+=" İstisna"; break;
+        default: break;
       }
       if (isTemplate) result+=" Şablon";
       result+=" Referans";
@@ -779,6 +780,7 @@ class TranslatorTurkish : public TranslatorAdapter_1_7_5
         case ClassDef::Protocol:   result+="protokol"; break;
         case ClassDef::Category:   result+="kategori"; break;
         case ClassDef::Exception:  result+="istisna"; break;
+        default: break;
       }
       result+=" için dokümantasyon aşağıdaki dosya";
       if (single) result+=""; else result+="lar";
@@ -1676,6 +1678,7 @@ class TranslatorTurkish : public TranslatorAdapter_1_7_5
         case ClassDef::Protocol:   result+=" Protokol"; break;
         case ClassDef::Category:   result+=" Kategori"; break;
         case ClassDef::Exception:  result+=" İstisna"; break;
+        default: break;
       }
       if (isTemplate) result+=" Şablon";
       result+=" Referans";
@@ -1743,6 +1746,7 @@ class TranslatorTurkish : public TranslatorAdapter_1_7_5
         case ClassDef::Protocol:   result+="protokol"; break;
         case ClassDef::Category:   result+="kategori"; break;
         case ClassDef::Exception:  result+="istisna"; break;
+        default: break;
       }
       result+=" için dokümantasyon aşağıdaki dosya";
       if (single) result+=":"; else result+="lar";
index 002c8a0..29f2cd3 100644 (file)
@@ -2,7 +2,7 @@
  *
  *
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby
@@ -627,6 +627,7 @@ class TranslatorChinesetraditional : public TranslatorAdapter_1_8_0
         case ClassDef::Protocol:   result+=" 協定"; break; 
         case ClassDef::Category:   result+=" 分類"; break;
         case ClassDef::Exception:  result+=" 例外"; break;
+        default: break;
       }
       if (isTemplate) result+=" 樣版";
       result+=" 參考文件";
@@ -786,6 +787,7 @@ class TranslatorChinesetraditional : public TranslatorAdapter_1_8_0
         case ClassDef::Protocol:   result+="協定(protocol)"; break;
         case ClassDef::Category:   result+="分類(category)"; break;
         case ClassDef::Exception:  result+="例外(exception)"; break;
+        default: break;
       }
       result+=" 文件是由下列檔案中產生";
       if (single) result+=":"; else result+=":";
@@ -1659,6 +1661,7 @@ class TranslatorChinesetraditional : public TranslatorAdapter_1_8_0
         case ClassDef::Protocol:   result+="協議"; break;
         case ClassDef::Category:   result+="分類"; break;
         case ClassDef::Exception:  result+="例外"; break;
+        default: break;
       }
       if (isTemplate) result+=" Template";
       result+="參考文件";
@@ -1725,6 +1728,7 @@ class TranslatorChinesetraditional : public TranslatorAdapter_1_8_0
         case ClassDef::Protocol:   result+="協議"; break;
         case ClassDef::Category:   result+="分類"; break;
         case ClassDef::Exception:  result+="例外"; break;
+        default: break;
       }
       result+="文件由下列檔案產生";
       return result;
index 022100d..2a80e22 100644 (file)
@@ -1,12 +1,10 @@
 /******************************************************************************
  *
- * 
- *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby 
- * granted. No representations are made about the suitability of this software 
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
  * for any purpose. It is provided "as is" without express or implied warranty.
  * See the GNU General Public License for more details.
  *
  *
  * The translation into Ukrainian was provided by
  *   Olexij Tkatchenko (olexij.tkatchenko@parcs.de)
+ *   Petro  Yermolenko (python@i.ua)
  */
 
 #ifndef TRANSLATOR_UA_H
 #define TRANSLATOR_UA_H
 
-class TranslatorUkrainian : public TranslatorAdapter_1_4_1
+class TranslatorUkrainian : public TranslatorAdapter_1_8_2
 {
-  private:
-    /*! The Decode() inline assumes the source written in the 
-        Koi8-U encoding (maintainer dependent). 
-     */
-    inline QCString decode(const QCString & sInput)
-    { 
-//#ifdef _WIN32
-//      return Koi8RToWindows1251(sInput);
-//#else
-      return sInput;
-//#endif
-    }
-
   public:
     /*! Used for identification of the language. */
     virtual QCString idLanguage()
@@ -43,155 +29,143 @@ class TranslatorUkrainian : public TranslatorAdapter_1_4_1
     /* Used to get the command(s) for the language support. */
     virtual QCString latexLanguageSupportCommand()
     {
-//#ifdef _WIN32
-//      return "\\usepackage[cp1251]{inputenc}\n\\usepackage[ukrainian]{babel}\n"; 
-//#else
-      return "\\usepackage[T2A]{fontenc}\n\\usepackage[ukrainian]{babel}\n"; 
-//#endif
+      return "\\usepackage[T2A]{fontenc}\n\\usepackage[ukrainian]{babel}\n";
     }
 
     /*! return the language charset. This will be used for the HTML output */
     virtual QCString idLanguageCharset()
     {
-//#ifdef _WIN32
-//      return "Windows-1251"; 
-//#else
-      return "koi8-u";
-//#endif
+        return "utf-8";
     }
 
     // --- Language translation methods -------------------
 
     /*! used in the compound documentation before a list of related functions. */
     virtual QCString trRelatedFunctions()
-    { return decode("óÐÏÒ¦ÄÎÅΦ ÆÕËæ§"); }
+    { return "Споріднені фукції"; }
 
     /*! subscript for the related functions. */
     virtual QCString trRelatedSubscript()
-    { return decode("(ÎÅ ÍÅÔÏÄÉ ËÏÍÐÏÎÅÎÔ)"); }
+    { return "(не методи компонент)"; }
 
     /*! header that is put before the detailed description of files, classes and namespaces. */
     virtual QCString trDetailedDescription()
-    { return decode("äÅÔÁÌØÎÉÊ ÏÐÉÓ"); }
+    { return "Детальний опис"; }
 
     /*! header that is put before the list of typedefs. */
     virtual QCString trMemberTypedefDocumentation()
-    { return decode("ïÐÉÓ ÔÉЦנËÏÒÉÓÔÕ×ÁÞÁ"); }
+    { return "Опис типів користувача"; }
 
     /*! header that is put before the list of enumerations. */
     virtual QCString trMemberEnumerationDocumentation()
-    { return decode("ïÐÉÓ ÐÅÒÅ̦˦נËÏÒÉÓÔÕ×ÁÞÁ"); }
+    { return "Опис переліків користувача"; }
 
     /*! header that is put before the list of member functions. */
     virtual QCString trMemberFunctionDocumentation()
-    { return decode("ïÐÉÓ ÍÅÔÏĦנËÏÍÐÏÎÅÎÔ"); }
+    { return "Опис методів компонент"; }
 
     /*! header that is put before the list of member attributes. */
     virtual QCString trMemberDataDocumentation()
     {
       if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
       {
-        return decode( "ðÏÌÑ" );
+        return  "Поля" ;
       }
       else
       {
-        return decode( "ëÏÍÐÏÎÅÎÔΦ ÄÁΦ" );
+        return  "Компонентні дані" ;
       }
     }
 
     /*! this is the text of a link put after brief descriptions. */
     virtual QCString trMore()
-    { return decode("äÅÔÁÌØΦÛÅ..."); }
+    { return "Детальніше..."; }
 
     /*! put in the class documentation */
     /* Dosn't use when optimization for C is on. */
     virtual QCString trListOfAllMembers()
     {
-      return decode( "óÐÉÓÏË ×ӦȠÅÌÅÍÅÎÔ¦×" );
+      return  "Список всіх елементів" ;
     }
 
     /*! used as the title of the "list of all members" page of a class */
     /* Dosn't use when optimization for C is on. */
     virtual QCString trMemberList()
     {
-      return decode( "CÐÉÓÏË ÅÌÅÍÅÎÔ¦×" );
+      return  "Cписок елементів" ;
     }
 
     /*! this is the first part of a sentence that is followed by a class name */
     /* Dosn't use when optimization for C is on. */
     virtual QCString trThisIsTheListOfAllMembers()
-    { return decode("ðÏ×ÎÉÊ ÓÐÉÓÏË ÅÌÅÍÅÎÔ¦×"); }
+    { return "Повний список елементів"; }
 
     /*! this is the remainder of the sentence after the class name */
     /* Dosn't use when optimization for C is on. */
     virtual QCString trIncludingInheritedMembers()
-    { return decode(", ×ËÌÀÞÁÀÞÉ ×Ó¦ ÕÓÐÁÄËÏ×ÁΦ ÅÌÅÍÅÎÔÉ"); }
+    { return ", включаючи всі успадковані елементи"; }
 
     /*! this is put at the author sections at the bottom of man pages.
      *  parameter s is name of the project name.
      */
     virtual QCString trGeneratedAutomatically(const char *s)
-    { QCString result=decode("á×ÔÏÍÁÔÉÞÎÏ ÓÔ×ÏÒÅÎÏ ÚÁ ÄÏÐÏÍÏÇÏÀ Doxygen");
-      if (s) result+=decode(" ÄÌÑ ")+s;
-      result+=decode(" Ú ÔÅËÓÔÕ ÐÒÏÇÒÁÍÉ."); 
+    { QCString result="Автоматично створено за допомогою Doxygen";
+      if (s) result+=QCString(" для ")+s;
+      result+=" з тексту програми.";
       return result;
     }
 
     /*! put after an enum name in the list of all members */
     virtual QCString trEnumName()
-    { return decode("ðÅÒÅ̦Ë"); }
+    { return "Перелік"; }
 
     /*! put after an enum value in the list of all members */
     virtual QCString trEnumValue()
-    { return decode("åÌÅÍÅÎÔ ÐÅÒÅ̦ËÕ"); }
+    { return "Елемент переліку"; }
 
     /*! put after an undocumented member in the list of all members */
     virtual QCString trDefinedIn()
-    { return decode("×ÉÚÎÁÞÅÎÏ × "); }
+    { return "визначено в "; }
 
     // quick reference sections
 
-    /*! This is put above each page as a link to the list of all groups of 
+    /*! This is put above each page as a link to the list of all groups of
      *  compounds or files (see the \\group command).
      */
     virtual QCString trModules()
-    { return decode("ðÒÏÇÒÁÍΦ ÍÏÄÕ̦"); }
+    { return "Програмні модулі"; }
 
     /*! This is put above each page as a link to the class hierarchy */
     virtual QCString trClassHierarchy()
-    { return decode("¶¤ÒÁÒȦѠËÌÁÓ¦×"); }
+    { return "Ієрархія класів"; }
 
     /*! This is put above each page as a link to the list of annotated classes */
     virtual QCString trCompoundList()
     {
       if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
       {
-        return decode( "óÔÒÕËÔÕÒÉ ÄÁÎÉÈ" );
+        return  "Структури даних" ;
       }
       else
       {
-        return decode( "ëÌÁÓÉ" );
+        return  "Класи" ;
       }
     }
 
     /*! This is put above each page as a link to the list of documented files */
     virtual QCString trFileList()
-    { return decode("æÁÊÌÉ"); }
-
-    /*! This is put above each page as a link to the list of all verbatim headers */
-    virtual QCString trHeaderFiles()
-    { return decode("úÁÇÏÌÏ×ÏÞΦ ÆÁÊÌÉ"); }
+    { return "Файли"; }
 
     /*! This is put above each page as a link to all members of compounds. */
     virtual QCString trCompoundMembers()
     {
       if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
       {
-        return decode( "ðÏÌÑ ÓÔÒÕËÔÕÒ" );
+        return  "Поля структур" ;
       }
       else
       {
-        return decode( "åÌÅÍÅÎÔÉ ËÌÁÓ¦×" );
+        return  "Елементи класів" ;
       }
     }
 
@@ -199,34 +173,34 @@ class TranslatorUkrainian : public TranslatorAdapter_1_4_1
     /*??*/
     virtual QCString trFileMembers()
     {
-      return decode( "åÌÅÍÅÎÔÉ ÆÁÊÌÕ" );
+      return  "Елементи файлу" ;
     }
 
     /*! This is put above each page as a link to all related pages. */
     virtual QCString trRelatedPages()
-    /* ?? ÷ÁÒÉÁÎÔ ÐÅÒÅ×ÏÄÁ "óÍ. ÔÁËÖÅ: " ÂÏÌÅÅ ÕÄÁÞÎÙÊ, ÎÏ ÎÅ × ÚÁÇÏÌÏ×ËÅ,
-     ËÁË × ÄÁÎÎÏÍ ÓÌÕÞÁÅ. */
-    { return decode("äÏÄÁÔËÏ×Á ¦ÎÆÏÒÍÁæÑ"); }
+    /* ?? Вариант перевода "См. также: " более удачный, но не в заголовке,
+     как в данном случае. */
+    { return "Додаткова інформація"; }
 
     /*! This is put above each page as a link to all examples. */
     virtual QCString trExamples()
-    { return decode("ðÒÉËÌÁÄÉ"); }
+    { return "Приклади"; }
 
     /*! This is put above each page as a link to the search engine. */
     virtual QCString trSearch()
-    { return decode("ðÏÛÕË"); }
+    { return "Пошук"; }
 
     /*! This is an introduction to the class hierarchy. */
     virtual QCString trClassHierarchyDescription()
-    { return decode("óÐÉÓÏË ÕÓÐÁÄËÕ×ÁÎØ ×ÐÏÒÑÄËÏ×ÁÎÏ ÎÁÂÌÉÖÅÎÏ ÄÏ ÁÌÆÁצÔÕ"); }
+    { return "Список успадкувань впорядковано наближено до алфавіту"; }
 
     /*! This is an introduction to the list with all files. */
     virtual QCString trFileListDescription(bool extractAll)
     {
-      QCString result="ðÏ×ÎÉÊ ÓÐÉÓÏË ";
-      if (!extractAll) result+="ÄÏËÕÍÅÎÔÏ×ÁÎÉÈ ";
-      result+="ÆÁÊ̦×.";
-      return decode(result);
+      QCString result="Повний список ";
+      if (!extractAll) result+="документованих ";
+      result+="файлів.";
+      return result;
     }
 
     /*! This is an introduction to the annotated compound list. */
@@ -234,117 +208,106 @@ class TranslatorUkrainian : public TranslatorAdapter_1_4_1
     {
       if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
       {
-        return decode( "óÔÒÕËÔÕÒÉ ÄÁÎÉÈ Ú ËÏÒÏÔËÉÍ ÏÐÉÓÏÍ." );
+        return  "Структури даних з коротким описом." ;
       }
       else
       {
-        return decode( "ëÌÁÓÉ, ÓÔÒÕËÔÕÒÉ, ÏÂ'¤ÄÎÁÎÎÑ ÔÁ ¦ÎÔÅÒÆÅÊÓÉ  Ú ËÏÒÏÔËÉÍ ÏÐÉÓÏÍ." );
+        return  "Класи, структури, об'єднання та інтерфейси  з коротким описом." ;
       }
     }
 
     /*! This is an introduction to the page with all class members. */
     virtual QCString trCompoundMembersDescription(bool extractAll)
     {
-        QCString result="óÐÉÓÏË ×ӦȠ";
-        if(!extractAll) result+="ÄÏËÕÍÅÎÔÏÁÎÉÈ ";
+        QCString result="Список всіх ";
+        if(!extractAll) result+="документоаних ";
         if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
-          result+="ÅÌÅÍÅÎԦנÓÔÒÕËÔÕÒ ÄÁÎÉÈ Ú ÐÏÓÉÌÁÎÎÑÍ ÎÁ ";
+          result+="елементів структур даних з посиланням на ";
         else
-          result+="ÅÌÅÍÅÎԦנËÌÁӦנÄÁÎÉÈ Ú ÐÏÓÉÌÁÎÎÑÍ ÎÁ ";
+          result+="елементів класів даних з посиланням на ";
         if(extractAll)
         {
           if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
-            result+="ÄÏËÕÍÅÎÔÁæÀ ÐÏ ÓÔÒÕËÔÕÒ¦/ÏÂ'¤ÄÎÁÎÎÀ ËÏÖÎÏÇÏ ÅÌÅÍÅÎÔÕ.";
+            result+="документацію по структурі/об'єднанню кожного елементу.";
           else
-            result+="ÄÏËÕÍÅÎÔÁæÀ ÐÏ ËÌÁÓÕ ËÏÖÎÏÇÏ ÅÌÅÍÅÎÔÕ.";
+            result+="документацію по класу кожного елементу.";
         }
         else
         {
           if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
-            result += "צÄÐÏצÄΦ ÓÔÒÕËÔÕÒÉ";
+            result += "відповідні структури";
           else
-            result += "צÄÐÏצÄΦ ËÌÁÓÉ";
-          result+=", ÄÏ ÑËÉÈ ×ÏÎÉ ÎÁÌÅÖÁÔØ.";
+            result += "відповідні класи";
+          result+=", до яких вони належать.";
         }
-        return decode( result );
+        return  result ;
     }
 
     /*! This is an introduction to the page with all file members. */
     virtual QCString trFileMembersDescription(bool extractAll)
     {
-      QCString result="óÐÉÓÏË ×ӦȠ";
-      if (!extractAll) result+="ÄÏËÕÍÅÎÔÏ×ÁÎÉÈ ";
+      QCString result="Список всіх ";
+      if (!extractAll) result+="документованих ";
 
       if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
       {
-        result+="ÆÕÎËæÊ, ÚͦÎÎÉÈ, ÍÁËÒÏÏÚÎÁÞÅÎØ, "
-                "ÐÅÒÅ̦˦נ¦ ÏÚÎÁÞÅÎØ ÔÉЦ×";
+        result+="функцій, змінних, макровизначень, "
+                "пеÑ\80елÑ\96кÑ\96в Ñ\96 Ð²Ð¸Ð·Ð½Ð°Ñ\87енÑ\8c Ñ\82ипÑ\96в";
       }
       else
       {
-        result+="ÅÌÅÍÅÎԦנÆÁÊ̦נ";
+        result+="елементів файлів ";
       }
-      result+=" Ú ÐÏÓÉÌÁÎÑÍ ÎÁ ";
+      result+=" з посиланям на ";
       if (extractAll)
-        result+="ÆÁÊÌÉ, ÄÏ ÑËÉÈ ×ÏÎÉ ÎÁÌÅÖÁÔØ.";
+        result+="файли, до яких вони належать.";
       else
-        result+="ÄÏËÕÍÅÎÔÁæÀ.";
-      return decode( result );
+        result+="документацію.";
+      return  result ;
     }
 
-    /*! This is an introduction to the page with the list of all header files. */
-    virtual QCString trHeaderFilesDescription()
-    { return decode("ðÏ×ÎÉÊ ÓÐÉÓÏË ÚÁÇÏÌÏ×ÏÞÎÉÈ ÆÁÊ̦×."); }
-
     /*! This is an introduction to the page with the list of all examples */
     virtual QCString trExamplesDescription()
-    { return decode("ðÏ×ÎÉÊ ÓÐÉÓÏË ÐÒÉËÌÁĦ×."); }
+    { return "Повний список прикладів."; }
 
     /*! This is an introduction to the page with the list of related pages */
     virtual QCString trRelatedPagesDescription()
-    { return decode("ðÏ×ÎÉÊ ÓÐÉÓÏË ÄÏÄÁÔËÏ×ÉÈ ÏÐÉÓ¦×."); }
+    { return "Повний список додаткових описів."; }
 
     /*! This is an introduction to the page with the list of class/file groups */
     virtual QCString trModulesDescription()
-    { return decode("ðÏ×ÎÉÊ ÓÐÉÓÏË ÍÏÄÕ̦×."); }
-
-    /*! This sentences is used in the annotated class/file lists if no brief
-     * description is given. 
-     */
-    virtual QCString trNoDescriptionAvailable()
-    { return decode("ïÐÉӠצÄÓÕÔΦÊ"); }
-
-    // index titles (the project name is prepended for these) 
+    { return "Повний список модулів."; }
 
+    // index titles (the project name is prepended for these)
 
     /*! This is used in HTML as the title of index.html. */
     virtual QCString trDocumentation()
-    { return decode("äÏËÕÍÅÎÔÁæÑ"); }
+    { return "Документація"; }
 
-    /*! This is used in LaTeX as the title of the chapter with the 
+    /*! This is used in LaTeX as the title of the chapter with the
      * index of all groups.
      */
     virtual QCString trModuleIndex()
-    { return decode("áÌÆÁצÔÎÉÊ ÐÏËÁÖÞÉË ÍÏÄÕ̦×"); }
+    { return "Алфавітний покажчик модулів"; }
 
-    /*! This is used in LaTeX as the title of the chapter with the 
+    /*! This is used in LaTeX as the title of the chapter with the
      * class hierarchy.
      */
     virtual QCString trHierarchicalIndex()
-    { return decode("¶¤ÒÁÒȦÞÎÉÊ ÐÏËÁÖÞÉË ËÌÁÓ¦×"); }
+    { return "Ієрархічний покажчик класів"; }
 
-    /*! This is used in LaTeX as the title of the chapter with the 
+    /*! This is used in LaTeX as the title of the chapter with the
      * annotated compound index.
      */
     virtual QCString trCompoundIndex()
     {
       if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
       {
-        return decode( "áÌÆÁצÔÎÉÊ ÐÏËÁÖÞÉË ÓÔÒÕËÔÕÒ ÄÁÎÉÈ" );
+        return  "Алфавітний покажчик структур даних" ;
       }
       else
       {
-        return decode( "áÌÆÁצÔÎÉÊ ÐÏËÁÖÞÉË ËÌÁÓ¦×" );
+        return  "Алфавітний покажчик класів" ;
       }
     }
 
@@ -352,13 +315,13 @@ class TranslatorUkrainian : public TranslatorAdapter_1_4_1
      * list of all files.
      */
     virtual QCString trFileIndex()
-    { return decode( "ðÏËÁÖÞÉË ÆÁÊÌ×" ); }
+    { return  "Покажчик файлв" ; }
 
     /*! This is used in LaTeX as the title of the chapter containing
      *  the documentation of all groups.
      */
     virtual QCString trModuleDocumentation()
-    { return decode("ðÒÏÇÒÁÍΦ íÏÄÕ̦"); }
+    { return "Програмні Модулі"; }
 
     /*! This is used in LaTeX as the title of the chapter containing
      *  the documentation of all classes, structs and unions.
@@ -367,11 +330,11 @@ class TranslatorUkrainian : public TranslatorAdapter_1_4_1
     {
       if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
       {
-        return decode( "óÔÒÕËÔÕÒÉ ÄÁÎÉÈ" );
+        return  "Структури даних" ;
       }
       else
       {
-        return decode( "ëÌÁÓÉ" );
+        return  "Класи" ;
       }
     }
 
@@ -379,230 +342,214 @@ class TranslatorUkrainian : public TranslatorAdapter_1_4_1
      *  the documentation of all files.
      */
     virtual QCString trFileDocumentation()
-    { return decode("æÁÊÌÉ"); }
+    { return "Файли"; }
 
     /*! This is used in LaTeX as the title of the chapter containing
      *  the documentation of all examples.
      */
     virtual QCString trExampleDocumentation()
-    { return decode("ðÒÉËÌÁÄÉ"); }
+    { return "Приклади"; }
 
     /*! This is used in LaTeX as the title of the chapter containing
      *  the documentation of all related pages.
      */
     virtual QCString trPageDocumentation()
-    { return decode("äÏËÕÍÅÎÔÁæѠÐÏ ÔÅͦ"); }
+    { return "Документація по темі"; }
 
     /*! This is used in LaTeX as the title of the document */
     virtual QCString trReferenceManual()
-    { return decode("äÏצÄËÏ×ÉÊ ÐÏÓ¦ÂÎÉË"); }
+    { return "Довідковий посібник"; }
 
-    /*! This is used in the documentation of a file as a header before the 
+    /*! This is used in the documentation of a file as a header before the
      *  list of defines
      */
     virtual QCString trDefines()
-    { return decode("íÁËÒÏÏÚÎÁÞÅÎÎÑ"); }
+    { return "Макровизначення"; }
 
-    /*! This is used in the documentation of a file as a header before the 
+    /*! This is used in the documentation of a file as a header before the
      *  list of function prototypes
      */
     virtual QCString trFuncProtos()
-    { return decode("ðÒÏÔÏÔÉÐÉ ÆÕËæÊ"); }
+    { return "Прототипи фукцій"; }
 
-    /*! This is used in the documentation of a file as a header before the 
+    /*! This is used in the documentation of a file as a header before the
      *  list of typedefs
      */
     virtual QCString trTypedefs()
-    { return decode("ïÚÎÁÞÅÎÎÑ ÔÉЦ×"); }
+    { return "Визначення типів"; }
 
-    /*! This is used in the documentation of a file as a header before the 
+    /*! This is used in the documentation of a file as a header before the
      *  list of enumerations
      */
     virtual QCString trEnumerations()
-    { return decode("ðÅÒÅ̦ËÉ"); }
+    { return "Переліки"; }
 
-    /*! This is used in the documentation of a file as a header before the 
+    /*! This is used in the documentation of a file as a header before the
      *  list of (global) functions
      */
     virtual QCString trFunctions()
-    { return decode("æÕÎËæ§"); }
+    { return "Функції"; }
 
-    /*! This is used in the documentation of a file as a header before the 
+    /*! This is used in the documentation of a file as a header before the
      *  list of (global) variables
      */
     virtual QCString trVariables()
-    { return decode("úͦÎΦ"); }
+    { return "Змінні"; }
 
-    /*! This is used in the documentation of a file as a header before the 
+    /*! This is used in the documentation of a file as a header before the
      *  list of (global) variables
      */
     virtual QCString trEnumerationValues()
-    { return decode("åÌÅÍÅÎÔÉ ÐÅÒÅ̦˦×"); }
+    { return "Елементи переліків"; }
 
     /*! This is used in the documentation of a file before the list of
      *  documentation blocks for defines
      */
     virtual QCString trDefineDocumentation()
-    { return decode("ïÐÉÓ ÍÁËÒÏÏÚÎÁÞÅÎØ"); }
+    { return "Опис макровизначень"; }
 
-    /*! This is used in the documentation of a file/namespace before the list 
+    /*! This is used in the documentation of a file/namespace before the list
      *  of documentation blocks for function prototypes
      */
     virtual QCString trFunctionPrototypeDocumentation()
-    { return decode("ïÐÉÓ ÐÒÏÔÏÔÉЦנÆÕÎËæÊ"); }
+    { return "Опис прототипів функцій"; }
 
-    /*! This is used in the documentation of a file/namespace before the list 
+    /*! This is used in the documentation of a file/namespace before the list
      *  of documentation blocks for typedefs
      */
     virtual QCString trTypedefDocumentation()
-    { return decode("ïÐÉÓ ÏÚÎÁÞÅÎØ ÔÉЦ×"); }
+    { return "Опис визначень типів"; }
 
-    /*! This is used in the documentation of a file/namespace before the list 
+    /*! This is used in the documentation of a file/namespace before the list
      *  of documentation blocks for enumeration types
      */
     virtual QCString trEnumerationTypeDocumentation()
-    { return decode("ïÐÉÓ ÐÅÒÅ̦˦×"); }
+    { return "Опис переліків"; }
 
-    /*! This is used in the documentation of a file/namespace before the list 
-     *  of documentation blocks for enumeration values
-     */
-    virtual QCString trEnumerationValueDocumentation()
-    { return decode("ïÐÉÓ ÅÌÅÍÅÎԦנÐÅÒÅ̦ËÕ"); }
-
-    /*! This is used in the documentation of a file/namespace before the list 
+    /*! This is used in the documentation of a file/namespace before the list
      *  of documentation blocks for functions
      */
     virtual QCString trFunctionDocumentation()
-    { return decode("ïÐÉÓ ÆÕÎËæÊ"); }
+    { return "Опис функцій"; }
 
-    /*! This is used in the documentation of a file/namespace before the list 
+    /*! This is used in the documentation of a file/namespace before the list
      *  of documentation blocks for variables
      */
     virtual QCString trVariableDocumentation()
-    { return decode("ïÐÉÓ ÚͦÎÎÉÈ"); }
+    { return "Опис змінних"; }
 
-    /*! This is used in the documentation of a file/namespace/group before 
+    /*! This is used in the documentation of a file/namespace/group before
      *  the list of links to documented compounds
      */
     virtual QCString trCompounds()
     {
       if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
       {
-        return decode( "óÔÒÕËÔÕÒÉ ÄÁÎÉÈ" );
+        return  "Структури даних" ;
       }
       else
-      { 
-        return decode( "ëÌÁÓÉ" );
+      {
+        return  "Класи" ;
       }
 
     }
 
-    /*! This is used in the documentation of a group before the list of 
+    /*! This is used in the documentation of a group before the list of
      *  links to documented files
      */
-    /*! This is used in the standard footer of each page and indicates when 
-     *  the page was generated 
+    /*! This is used in the standard footer of each page and indicates when
+     *  the page was generated
      */
     virtual QCString trGeneratedAt(const char *date,const char *projName)
-    { 
-      QCString result=decode("äÏËÕÍÅÎÔÁæѠ");
-      if (projName) result+=decode("ÄÏ ")+projName;
-      result+=decode(" ÓÔ×ÏÒÅÎÁ ")+date;
-      result+=decode(" ÓÉÓÔÅÍÏÀ");
+    {
+      QCString result="Документація ";
+      if (projName) result+=QCString("до ")+projName;
+      result+=QCString(" створена ")+date;
+      result+=" системою";
       return result;
     }
     /*! This is part of the sentence used in the standard footer of each page.
      */
     virtual QCString trWrittenBy()
     {
-      return decode("á×ÔÏÒ:");
+      return "Автор:";
     }
 
     /*! this text is put before a class diagram */
     virtual QCString trClassDiagram(const char *clName)
     {
-      return decode("óÈÅÍÁ ÕÓÐÁÄËÕ×ÁÎØ ÄÌÑ ")+clName;
+      return QCString("Схема успадкувань для ")+clName;
     }
 
     /*! this text is generated when the \\internal command is used. */
     virtual QCString trForInternalUseOnly()
-    { return decode("ô¦ÌØËÉ ÄÌÑ ×ÎÕÔÒ¦ÛÎØÏÇÏ ËÏÒÉÓÔÕ×ÁÎÎÑ"); }
-
-    /*! this text is generated when the \\reimp command is used. */
-    virtual QCString trReimplementedForInternalReasons()
-    /*??*/
-    { return decode("úͦÎÅÎÏ Ú ×ÎÕÔÒ¦ÛΦȠÐÒÉÞÉÎ. úͦÎÉ ÎÅ ÔÏÒËÁÀÔØÓÑ API."); 
-    }
+    { return "Тільки для внутрішнього користування"; }
 
     /*! this text is generated when the \\warning command is used. */
     virtual QCString trWarning()
-    { return decode("úÁÓÔÅÒÅÖÅÎÎÑ"); }
-
-    /*! this text is generated when the \\bug command is used. */
-    virtual QCString trBugsAndLimitations()
-    { return decode("ðÏÍÉÌËÉ ÔÁ ÏÂÍÅÖÅÎÎÑ ÚÁÓÔÏÓÕ×ÁÎÎÑ"); }
+    { return "Застереження"; }
 
     /*! this text is generated when the \\version command is used. */
     virtual QCString trVersion()
-    { return decode("÷ÅÒÓ¦Ñ"); }
+    { return "Версія"; }
 
     /*! this text is generated when the \\date command is used. */
     virtual QCString trDate()
-    { return decode("äÁÔÁ"); }
+    { return "Дата"; }
 
     /*! this text is generated when the \\return command is used. */
     virtual QCString trReturns()
-    { return decode("ðÏ×ÅÒÔÁ¤"); }
+    { return "Повертає"; }
 
     /*! this text is generated when the \\sa command is used. */
     virtual QCString trSeeAlso()
-    { return decode("äÉ×. ÔÁËÏÖ"); }
+    { return "Див. також"; }
 
     /*! this text is generated when the \\param command is used. */
     virtual QCString trParameters()
-    { return decode("áÒÇÕÍÅÎÔÉ"); }
+    { return "Аргументи"; }
 
     /*! this text is generated when the \\exception command is used. */
     virtual QCString trExceptions()
-    { return decode("ïÂÒÏÂËÁ ×ÉÎÑÔËÏ×ÉÈ ÓÉÔÕÁæÊ"); }
+    { return "Обробка виняткових ситуацій"; }
 
     /*! this text is used in the title page of a LaTeX document. */
     virtual QCString trGeneratedBy()
-    { return decode("óÔ×ÏÒÅÎÏ ÓÉÓÔÅÍÏÀ"); }
-    
+    { return "Створено системою"; }
+
 //////////////////////////////////////////////////////////////////////////
-// new since 0.49-990307 
+// new since 0.49-990307
 //////////////////////////////////////////////////////////////////////////
-    
+
     /*! used as the title of page containing all the index of all namespaces. */
     virtual QCString trNamespaceList()
-    { return decode("ðÒÏÓÔ¦Ò ¦ÍÅÎ"); }
+    { return "Простір імен"; }
 
     /*! used as an introduction to the namespace list */
     virtual QCString trNamespaceListDescription(bool extractAll)
     {
-      QCString result="ðÏ×ÎÉÊ ÐÅÒÅ̦ˠ";
-      if (!extractAll) result+="ÄÏËÕÍÅÎÔÏ×ÁÎÉÈ ";
-      result+="ÐÒÏÓÔÏҦנ¦ÍÅÎ.";
-      return decode(result);
+      QCString result="Повний список ";
+      if (!extractAll) result+="документованих ";
+      result+="пÑ\80оÑ\81Ñ\82оÑ\80Ñ\96в Ñ\96мен.";
+      return result;
     }
 
     /*! used in the class documentation as a header before the list of all
      *  friends of a class
      */
     virtual QCString trFriends()
-    { return decode("äÒÕÖΦ ËÌÁÓÉ"); }
+    { return "Дружні класи"; }
 
 //////////////////////////////////////////////////////////////////////////
 // new since 0.49-990405
 //////////////////////////////////////////////////////////////////////////
-    
+
     /*! used in the class documentation as a header before the list of all
-     * related classes 
+     * related classes
      */
     virtual QCString trRelatedFunctionDocumentation()
-      { return decode("äÏËÕÍÅÎÔÁÃÉÑ ÄÏ ÄÒÕÖΦȠËÌÁӦנÔÁ ×¦ÄÐÏצÄÎÉÈ ÆÕÎËæÊ"); }
-    
+      { return "Документация до дружніх класів та відповідних функцій"; }
+
 //////////////////////////////////////////////////////////////////////////
 // new since 0.49-990425
 //////////////////////////////////////////////////////////////////////////
@@ -613,70 +560,72 @@ class TranslatorUkrainian : public TranslatorAdapter_1_4_1
                                  bool isTemplate)
     {
       QCString result;
-      if (isTemplate) 
+      if (isTemplate)
       {
-        result="ûÁÂÌÏΠ";
+        result="Шаблон ";
         switch(compType)
         {
-          case ClassDef::Class:  result+="ËÌÁÓÕ"; break;
-          case ClassDef::Struct: result+="ÓÔÒÕËÔÕÒÉ"; break;
-          case ClassDef::Union:  result+="ÏÂ'¤ÄÎÁÎÎÑ"; break;
-          case ClassDef::Interface:  result+="¦ÎÔÅÒÆÅÊÓÕ"; break;
-          case ClassDef::Protocol:   result+="ÐÒÏÔÏËÏÌÕ"; break;
-          case ClassDef::Category:   result+="ËÁÔÅÇÏÒ¦§"; break;
-          case ClassDef::Exception:  result+="÷ÉÎÑÔÏË"; break;
+          case ClassDef::Class:  result+="класу"; break;
+          case ClassDef::Struct: result+="структури"; break;
+          case ClassDef::Union:  result+="об'єднання"; break;
+          case ClassDef::Interface:  result+="інтерфейсу"; break;
+          case ClassDef::Protocol:   result+="протоколу"; break;
+          case ClassDef::Category:   result+="категорії"; break;
+          case ClassDef::Exception:  result+="Виняток"; break;
+          default: break;
         }
       }
       else
       {
         switch(compType)
         {
-          case ClassDef::Class:  result+="ëÌÁÓ"; break;
-          case ClassDef::Struct: result+="óÔÒÕËÔÕÒÁ"; break;
-          case ClassDef::Union:  result+="ïÂ'¤ÄÎÁÎÎÑ"; break;
-          case ClassDef::Interface:  result+="¶ÎÔÅÒÆÅÊÓ"; break;
-          case ClassDef::Protocol:   result+="ðÒÏÔÏËÏÌ"; break;
-          case ClassDef::Category:   result+="ëÁÔÅÇÏÒ¦Ñ"; break;
-          case ClassDef::Exception:  result+="÷ÉÎÑÔÏË"; break;
+          case ClassDef::Class:  result+="Клас"; break;
+          case ClassDef::Struct: result+="Структура"; break;
+          case ClassDef::Union:  result+="Об'єднання"; break;
+          case ClassDef::Interface:  result+="Інтерфейс"; break;
+          case ClassDef::Protocol:   result+="Протокол"; break;
+          case ClassDef::Category:   result+="Категорія"; break;
+          case ClassDef::Exception:  result+="Виняток"; break;
+          default: break;
         }
       }
       result+=" ";
-      return decode(result)+clName;
+      return result+clName;
     }
 
     /*! used as the title of the HTML page of a file */
     virtual QCString trFileReference(const char *fileName)
     {
-      return decode("æÁÊÌ ")+fileName;
+      return QCString("Файл ")+fileName;
     }
 
     /*! used as the title of the HTML page of a namespace */
     virtual QCString trNamespaceReference(const char *namespaceName)
     {
-      return decode("ðÒÏÓÔ¦Ò ¦ÍÅΠ")+namespaceName;
+      return QCString("Простір імен ")+namespaceName;
     }
-    
+
     virtual QCString trPublicMembers()
-    { return decode("úÁÇÁÌØÎÏÄÏÓÔÕÐΦ ÅÌÅÍÅÎÔÉ"); }
+    { return "Загальнодоступні елементи"; }
     virtual QCString trPublicSlots()
-    { return decode("úÁÇÁÌØÎÏÄÏÓÔÕÐΦ ÓÌÏÔÉ"); }
+    { return "Загальнодоступні слоти"; }
     virtual QCString trSignals()
-    { return decode("óÉÇÎÁÌÉ"); }
+    { return "Сигнали"; }
     virtual QCString trStaticPublicMembers()
-    { return decode("úÁÇÁÌØÎÏÄÏÓÔÕÐΦ ÓÔÁÔÉÞΦ ÅÌÅÍÅÎÔÉ"); }
+    { return "Загальнодоступні статичні елементи"; }
     virtual QCString trProtectedMembers()
-    { return decode("úÁÈÉÝÅΦ ÅÌÅÍÅÎÔÉ"); }
+    { return "Захищені елементи"; }
     virtual QCString trProtectedSlots()
-    { return decode("úÁÈÉÝÅΦ ÓÌÏÔÉ"); }
+    { return "Захищені слоти"; }
     virtual QCString trStaticProtectedMembers()
-    { return decode("úÁÈÉÝÅΦ ÓÔÁÔÉÞΦ ÅÌÅÍÅÎÔÉ"); }
+    { return "Захищені статичні елементи"; }
     virtual QCString trPrivateMembers()
-    { return decode("ðÒÉ×ÁÔΦ ÅÌÅÍÅÎÔÉ"); }
+    { return "Приватні елементи"; }
     virtual QCString trPrivateSlots()
-    { return decode("ðÒÉ×ÁÔΦ ÓÌÏÔÉ"); }
+    { return "Приватні слоти"; }
     virtual QCString trStaticPrivateMembers()
-    { return decode("ðÒÉ×ÁÔΦ ÓÔÁÔÉÞΦ ÅÌÅÍÅÎÔÉ"); }
-    
+    { return "Приватні статичні елементи"; }
+
     /*! this function is used to produce a comma-separated list of items.
      *  use generateMarker(i) to indicate where item i should be put.
      */
@@ -685,29 +634,29 @@ class TranslatorUkrainian : public TranslatorAdapter_1_4_1
       QCString result;
       int i;
       // the inherits list contain `numEntries' classes
-      for (i=0;i<numEntries;i++) 
+      for (i=0;i<numEntries;i++)
       {
         // use generateMarker to generate placeholders for the class links!
-        result+=generateMarker(i); // generate marker for entry i in the list 
+        result+=generateMarker(i); // generate marker for entry i in the list
                                    // (order is left to right)
-        
+
         if (i!=numEntries-1)  // not the last entry, so we need a separator
         {
-          if (i<numEntries-2) // not the fore last entry 
+          if (i<numEntries-2) // not the fore last entry
             result+=", ";
           else                // the fore last entry
-            result+=decode( " ¦ " );
+            result+= " і " ;
         }
       }
-      return result; 
+      return result;
     }
-    
+
     /*! used in class documentation to produce a list of base classes,
      *  if class diagrams are disabled.
      */
     virtual QCString trInheritsList(int numEntries)
     {
-      return decode("õÓÐÁÄËÏ×Õ¤ ËÌÁÓ ")+trWriteList(numEntries)+".";
+      return "Успадковує клас "+trWriteList(numEntries)+".";
     }
 
     /*! used in class documentation to produce a list of super classes,
@@ -715,15 +664,15 @@ class TranslatorUkrainian : public TranslatorAdapter_1_4_1
      */
     virtual QCString trInheritedByList(int numEntries)
     {
-      return decode("õÓÐÁÄËÏ×ÁÎÏ ËÌÁÓÁÍÉ ")+trWriteList(numEntries)+".";
+      return "Успадковано класами "+trWriteList(numEntries)+".";
     }
 
-    /*! used in member documentation blocks to produce a list of 
+    /*! used in member documentation blocks to produce a list of
      *  members that are hidden by this one.
      */
     virtual QCString trReimplementedFromList(int numEntries)
     {
-      return decode("ðÅÒÅÏÚÎÁÞÅÎÎÑ Ú ")+trWriteList(numEntries)+".";
+      return "Переозначення з "+trWriteList(numEntries)+".";
     }
 
     /*! used in member documentation blocks to produce a list of
@@ -731,37 +680,37 @@ class TranslatorUkrainian : public TranslatorAdapter_1_4_1
      */
     virtual QCString trReimplementedInList(int numEntries)
     {
-      return decode("ðÅÒÅÏÚÎÁÞÁ¤ÔØÓÑ × ")+trWriteList(numEntries)+".";
+      return "Переозначається в "+trWriteList(numEntries)+".";
     }
 
     /*! This is put above each page as a link to all members of namespaces. */
     virtual QCString trNamespaceMembers()
-    { return decode("åÌÅÍÅÎÔÉ ÐÒÏÓÔÏÒÕ ¦ÍÅÎ"); }
+    { return "Елементи простору імен"; }
 
     /*! This is an introduction to the page with all namespace members */
     virtual QCString trNamespaceMemberDescription(bool extractAll)
     {
-      QCString result="ðÏ×ÎÉÊ ÐÅÒÅ̦ˠ";
-      if (!extractAll) result+="ÄÏËÕÍÅÎÔÏ×ÁÎÉÈ ";
-      result+="ÅÌÅÍÅԦנÐÒÏÓÔÏÒÕ ¦ÍÅΠڠÐÏÓÉÌÁÎÎÑÍ ";
-      if (extractAll) 
-        result+="ÎÁ ÄÏËÕÍÅÎÔÁæÀ ÄÌÑ ËÏÖÎÏÇÏ ÅÌÅÍÅÎÔÕ:";
-      else 
-        result+="ÎÁ ÐÒÏÓÔ¦Ò ¦ÍÅΠÄÏ ÑËÏÇÏ ×ÏÎÉ ÎÁÌÅÖÁÔØ:";
-      return decode(result);
+      QCString result="Повний список ";
+      if (!extractAll) result+="документованих ";
+      result+="елеметів простору імен з посиланням ";
+      if (extractAll)
+        result+="на документацію для кожного елементу:";
+      else
+        result+="на простір імен до якого вони належать:";
+      return result;
     }
 
-    /*! This is used in LaTeX as the title of the chapter with the 
+    /*! This is used in LaTeX as the title of the chapter with the
      *  index of all namespaces.
      */
     virtual QCString trNamespaceIndex()
-    { return decode("áÌÆÁצÔÎÉÊ ÐÏËÁÖÞÉË ÐÒÏÓÔÏÒÕ ¦ÍÅÎ"); }
+    { return "Алфавітний покажчик простору імен"; }
 
     /*! This is used in LaTeX as the title of the chapter containing
      *  the documentation of all namespaces.
      */
     virtual QCString trNamespaceDocumentation()
-    { return decode("ïÐÉÓ ÐÒÏÓÔÏÒÕ ¦ÍÅÎ"); }
+    { return "Опис простору імен"; }
 
 //////////////////////////////////////////////////////////////////////////
 // new since 0.49-990522
@@ -771,7 +720,7 @@ class TranslatorUkrainian : public TranslatorAdapter_1_4_1
      *  namespaces in a file.
      */
     virtual QCString trNamespaces()
-    { return decode( "ðÒÏÓÔÏÒÉ ¦ÍÅÎ" ); }
+    { return  "Простори імен" ; }
 
 //////////////////////////////////////////////////////////////////////////
 // new since 0.49-990728
@@ -784,41 +733,43 @@ class TranslatorUkrainian : public TranslatorAdapter_1_4_1
         bool single)
     { // here s is one of " Class", " Struct" or " Union"
       // single is true implies a single file
-      QCString result=(QCString)"äÏËÕÍÅÎÔÁæѠ ";
+      QCString result=(QCString)"Документація  ";
       switch(compType)
       {
         case ClassDef::Class:
-          if (single) result+="ÃØÏÇÏ ËÌÁÓÕ"; else result+="ÃÉÈ ËÌÁÓ¦×";
+          if (single) result+="цього класу"; else result+="цих класів";
           break;
         case ClassDef::Struct:
-          if (single) result+="椧 ÓÔÒÕËÔÕÒÉ"; else result+="ÃÉÈ ÓÔÒÕËÔÕÒ";
+          if (single) result+="цієї структури"; else result+="цих структур";
           break;
         case ClassDef::Union:
-          if (single) result+="ÃØÏÇÏ ÏÂ'¤ÄÎÁÎÎÑ"; else result+="ÃÉÈ ÏÂ'¤ÄÎÁÎØ";
+          if (single) result+="цього об'єднання"; else result+="цих об'єднань";
           break;
         case ClassDef::Interface:
-          if (single) result+="ÃØÏÇÏ ¦ÎÔÅÒÆÅÊÓÕ"; else result+="ÃÉÈ ¦ÎÔÅÒÆÅÊÓ¦×";
+          if (single) result+="цього інтерфейсу"; else result+="цих інтерфейсів";
+          break;
+        case ClassDef::Protocol:
+          if (single) result+="цього протоколу"; else result+="цих протоколів";
           break;
-        case ClassDef::Protocol:  
-          if (single) result+="ÃØÏÇÏ ÐÒÏÔÏËÏÌÕ"; else result+="ÃÉÈ ÐÒÏÔÏËÏ̦×";
-          break; 
         case ClassDef::Category:
-          if (single) result+="椧 ËÁÔÅÇÏÒ¦§"; else result+="ÃÉÈ ËÁÔÅÇÏÒ¦Ê";
-          break; 
+          if (single) result+="цієї категорії"; else result+="цих категорій";
+          break;
         case ClassDef::Exception:
-          if (single) result+="ÃØÏÇÏ ×ÉÎÑÔËÕ"; else result+="ÃÉÈ ×ÉÎÑÔ˦×";
+          if (single) result+="цього винятку"; else result+="цих винятків";
+          break;
+        default: 
           break;
       }
-      result+=" ÂÕÌÁ ÓÔ×ÏÒÅÎÁ Ú ÆÁÊÌ";
-      if (single) result+="Õ:"; else result+="¦×:";
-      return decode(result);
+      result+=" була створена з файл";
+      if (single) result+="у:"; else result+="ів:";
+      return result;
     }
 
     /*! This is in the (quick) index as a link to the alphabetical compound
      * list.
      */
     virtual QCString trAlphabeticalList()
-    { return decode("áÌÆÁצÔÎÉÊ ÐÏËÁÖÞÉË"); }
+    { return "Алфавітний покажчик"; }
 
 //////////////////////////////////////////////////////////////////////////
 // new since 0.49-990901
@@ -826,34 +777,30 @@ class TranslatorUkrainian : public TranslatorAdapter_1_4_1
 
     /*! This is used as the heading text for the retval command. */
     virtual QCString trReturnValues()
-    { return decode("úÎÁÞÅÎÎÑ, ÝÏ ÐÏ×ÅÒÔÁÀÔØÓÑ"); }
+    { return "Значення, що повертаються"; }
 
     /*! This is in the (quick) index as a link to the main page (index.html)
      */
     virtual QCString trMainPage()
-    { return decode("ôÉÔÕÌØÎÁ ÓÔÏÒ¦ÎËÁ"); }
+    { return "Титульна сторінка"; }
 
-    /*! This is used in references to page that are put in the LaTeX 
+    /*! This is used in references to page that are put in the LaTeX
      *  documentation. It should be an abbreviation of the word page.
      */
     virtual QCString trPageAbbreviation()
-    { return decode("ÓÔÏÒ."); }
+    { return "стор."; }
 
 //////////////////////////////////////////////////////////////////////////
 // new since 0.49-991106
 //////////////////////////////////////////////////////////////////////////
 
-    virtual QCString trSources()
-    {
-      return decode("÷ÉȦÄΦ ÔÅËÓÔÉ.");
-    }
     virtual QCString trDefinedAtLineInSourceFile()
     {
-      return decode("äÉ×. ÏÚÎÁÞÅÎÎÑ × ÆÁÊ̦ @1, ÒÑÄÏË @0");
+      return "Див. визначення в файлі @1, рядок @0";
     }
     virtual QCString trDefinedInSourceFile()
     {
-      return decode("äÉ×. ÏÚÎÁÞÅÎÎÑ × ÆÁÊ̦ @0");
+      return "Див. визначення в файлі @0";
     }
 
 //////////////////////////////////////////////////////////////////////////
@@ -862,7 +809,7 @@ class TranslatorUkrainian : public TranslatorAdapter_1_4_1
 
     virtual QCString trDeprecated()
     {
-      return decode("îÅ ÒÅËÏÍÅÎÄÏ×ÁÎÏ");
+      return "Не рекомендовано";
     }
 
 //////////////////////////////////////////////////////////////////////////
@@ -872,120 +819,120 @@ class TranslatorUkrainian : public TranslatorAdapter_1_4_1
     /*! this text is put before a collaboration diagram */
     virtual QCString trCollaborationDiagram(const char *clName)
     {
-      return (QCString)decode("ä¦ÁÇÒÁÍÁ Ú×'ÑÚ˦נËÌÁÓÕ ")+clName+":";
+      return (QCString)"Діаграма зв'язків класу "+clName+":";
     }
     /*! this text is put before an include dependency graph */
     virtual QCString trInclDepGraph(const char *fName)
     {
-      return decode("ä¦ÁÇÒÁÍÁ ×ËÌÀÞÅÎÉÈ ÚÁÇÏÌÏ×ÏÞÎÉÈ ÆÁÊ̦נÄÌÑ ")+fName+":";
+      return QCString("Діаграма включених заголовочних файлів для ")+fName+":";
     }
     /*! header that is put before the list of constructor/destructors. */
     virtual QCString trConstructorDocumentation()
     {
-      return decode("ëÏÎÓÔÒÕËÔÏÒ(É)"); 
+      return "Конструктор(и)";
     }
     /*! Used in the file documentation to point to the corresponding sources. */
     virtual QCString trGotoSourceCode()
     {
-      return decode("äÉ×. ×ÉȦÄΦ ÔÅËÓÔÉ.");
+      return "Див. вихідні тексти.";
     }
     /*! Used in the file sources to point to the corresponding documentation. */
     virtual QCString trGotoDocumentation()
     {
-      return decode("äÉ×. ÄÏËÕÍÅÎÔÁæÀ.");
+      return "Див. документацію.";
     }
     /*! Text for the \\pre command */
     virtual QCString trPrecondition()
     {
-      return decode("ðÅÒÅÄÕÍÏ×É");
+      return "Передумови";
     }
     /*! Text for the \\post command */
     virtual QCString trPostcondition()
     {
-      return decode("ð¦ÓÌÑÕÍÏ×É");
+      return "Післяумови";
     }
     /*! Text for the \\invariant command */
     virtual QCString trInvariant()
     {
-      return decode("¶Î×ÁÒ¦ÁÎÔ");
+      return "Інваріант";
     }
     /*! Text shown before a multi-line variable/enum initialization */
     virtual QCString trInitialValue()
     {
-      return decode("ðÏÞÁÔËÏצ ÚÎÁÞÅÎÎÑ");
+      return "Початкові значення";
     }
     /*! Text used the source code in the file index */
     virtual QCString trCode()
     {
-      return decode("÷ÉȦÄΦ ÔÅËÓÔÉ");
+      return "Вихідні тексти";
     }
     virtual QCString trGraphicalHierarchy()
     {
-      return decode("çÒÁƦÞÎÁ ¦¤ÒÁÒȦѠËÌÁÓ¦×");
+      return "Графічна ієрархія класів";
     }
     virtual QCString trGotoGraphicalHierarchy()
     {
-      return decode("ÄÉ×. ÇÒÁƦÞÎÕ ¦¤ÒÁÒȦÀ");
+      return "див. графічну ієрархію";
     }
     virtual QCString trGotoTextualHierarchy()
     {
-      return decode("ÄÉ×. ÔÅËÓÔÏ×Õ ¦¤ÒÁÒȦÀ");
+      return "див. текстову ієрархію";
     }
     virtual QCString trPageIndex()
     {
-      return decode("áÌÆÁצÔÎÉÊ ÐÏËÁÖÞÉË ÔÅÍÁÔÉÞÎÉÈ ÏÐÉÓ¦×");
+      return "Алфавітний покажчик тематичних описів";
     }
 
 //////////////////////////////////////////////////////////////////////////
 // new since 1.1.0
 //////////////////////////////////////////////////////////////////////////
-    
+
     virtual QCString trNote()
     {
-      return decode("îÏÔÁÔËÉ");
+      return "Нотатки";
     }
     virtual QCString trPublicTypes()
     {
-      return decode("úÁÇÁÌØÎÏÄÏÓÔÕÐΦ ÔÉÐÉ");
+      return "Загальнодоступні типи";
     }
     virtual QCString trPublicAttribs()
     {
       if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
       {
-        return decode( "ðÏÌÑ ÄÁÎÉÈ" );
+        return  "Поля даних" ;
       }
       else
       {
-        return decode( "úÁÇÁÌØÎÏÄÏÓÔÕÐΦ ÁÔÒÉÂÕÔÉ" );
+        return  "Загальнодоступні атрибути" ;
       }
     }
     virtual QCString trStaticPublicAttribs()
     {
-      return decode("óÔÁÔÉÞΦ ÚÁÇÁÌØÎÏÄÏÓÔÕÐΦ ÄÁÎΦ");
+      return "Статичні загальнодоступні данні";
     }
     virtual QCString trProtectedTypes()
     {
-      return decode("úÁÈÉÝÅΦ ÔÉÐÉ");
+      return "Захищені типи";
     }
     virtual QCString trProtectedAttribs()
     {
-      return decode("úÁÈÉÝÅΦ ÄÁΦ");
+      return "Захищені дані";
     }
     virtual QCString trStaticProtectedAttribs()
     {
-      return decode("óÔÁÔÉÞΦ ÚÁÈÉÝÅΦ ÄÁΦ");
+      return "Статичні захищені дані";
     }
     virtual QCString trPrivateTypes()
     {
-      return decode("ðÒÉ×ÁÔΦ ÔÉÐÉ");
+      return "Приватні типи";
     }
     virtual QCString trPrivateAttribs()
     {
-      return decode("ðÒÉ×ÁÔΦ ÄÁΦ");
+      return "Приватні дані";
     }
     virtual QCString trStaticPrivateAttribs()
     {
-      return decode("ðÒÉ×ÁÔΦ ÓÔÁÔÉÞΦ ÄÁΦ");
+      return "Приватні статичні дані";
     }
 
 
@@ -997,13 +944,13 @@ class TranslatorUkrainian : public TranslatorAdapter_1_4_1
     virtual QCString trTodo()
     /*??*/
     {
-      return decode("îÅÏÂȦÄÎÏ ÚÒÏÂÉÔÉ");
+      return "Необхідно зробити";
     }
     /*! Used as the header of the todo list */
     virtual QCString trTodoList()
     /*??*/
     {
-      return decode("ðÅÒÅ̦ˠÚÁ×ÄÁÎØ");
+      return "Список завдань";
     }
 
 //////////////////////////////////////////////////////////////////////////
@@ -1012,26 +959,26 @@ class TranslatorUkrainian : public TranslatorAdapter_1_4_1
 
     virtual QCString trReferencedBy()
     {
-      return decode("÷ÖÉ×Á¤ÔØÓÑ ×");
+      return "Вживається в";
     }
     virtual QCString trRemarks()
     {
-      return decode("ðÒÉÍ.");
+      return "Прим.";
     }
     virtual QCString trAttention()
     {
-      return decode("õ×ÁÇÁ");
+      return "Увага";
     }
     virtual QCString trInclByDepGraph()
     {
-      return decode("çÒÁÆ ÆÁÊ̦×, Ñ˦ ×ËÌÀÞÁÀÔØ ÃÅÊ ÆÁÊÌ:");
+      return "Граф файлів, які включають цей файл:";
     }
     virtual QCString trSince()
     /*??*/
     {
-      return decode("ðÏÞÉÎÁÀÞÉ Ú");
+      return "Починаючи з";
     }
-    
+
 //////////////////////////////////////////////////////////////////////////
 // new since 1.1.5
 //////////////////////////////////////////////////////////////////////////
@@ -1039,32 +986,32 @@ class TranslatorUkrainian : public TranslatorAdapter_1_4_1
     /*! title of the graph legend page */
     virtual QCString trLegendTitle()
     {
-      return decode("ìÅÇÅÎÄÁ");
+      return "Легенда";
     }
     /*! page explaining how the dot graph's should be interpreted */
     virtual QCString trLegendDocs()
     {
-      return decode( 
-        "ðÏÚÎÁÞÅÎÎÑ, ÝÏ ×ÉËÏÒÉÓÔÏ×ÕÀÔØÓÑ Õ ÇÒÁÆÁÈ.<p>\n"
-        "òÏÚÇÌÑÎÅÍÏ ÎÁÓÔÕÐÎÉÊ ÐÒÉËÌÁÄ:\n"
+      return
+        "Позначення, що використовуються у графах.<p>\n"
+        "Розглянемо наступний приклад:\n"
         "\\code\n"
-        "/*! îÅ×ÉÄÉÍÉÊ ËÌÁÓ ÞÅÒÅÚ ÚÒ¦ÚÁÎÎÑ */\n"
+        "/*! Невидимий клас через зрізання */\n"
         "class Invisible { };\n\n"
-        "/*! ïÂÍÅÖÅÎÉÊ ËÌÁÓ, ×¦ÄÎÏÛÅÎÎÑ ÕÓÐÁÄËÕ×ÁÎÎÑ ÐÒÉÈÏ×ÁÎÅ */\n"
+        "/*! Обмежений клас, відношення успадкування приховане */\n"
         "class Truncated : public Invisible { };\n\n"
-        "/* îÅÄÏËÕÍÅÎÔÏ×ÁÎÉÊ ËÌÁÓ */\n"
+        "/* Недокументований клас */\n"
         "class Undocumented { };\n\n"
-        "/*! úÁÇÁÌØÎÏÄÏÓÔÕÐÎÅ ÕÓÐÁÄËÕ×ÁÎÎÑ */\n"
+        "/*! Загальнодоступне успадкування */\n"
         "class PublicBase : public Truncated { };\n\n"
         "/*! A template class */\n"
         "template<class T> class Templ { };\n\n"
-        "/*! úÁÈÉÝÅÎÅ ÕÓÐÁÄËÕ×ÁÎÎÑ */\n"
+        "/*! Захищене успадкування */\n"
         "class ProtectedBase { };\n\n"
-        "/*! ðÒÉ×ÁÔÎÅ ÕÓÐÁÄËÕ×ÁÎÎÑ */\n"
+        "/*! Приватне успадкування */\n"
         "class PrivateBase { };\n\n"
-        "/*! ëÌÁÓ, ÝÏ ×ÉËÏÒÉÓÔÏ×Õ¤ÔØÓÑ ËÌÁÓÏÍ Inherited */\n"
+        "/*! Клас, що використовується класом Inherited */\n"
         "class Used { };\n\n"
-        "/*! ëÌÁÓ, ÝÏ ÕÓÐÁÄËÏ×Õ¤ ¦ÎÛ¦ ËÌÁÓÉ */\n"
+        "/*! Клас, що успадковує інші класи */\n"
         "class Inherited : public PublicBase,\n"
         "                  protected ProtectedBase,\n"
         "                  private PrivateBase,\n"
@@ -1075,51 +1022,50 @@ class TranslatorUkrainian : public TranslatorAdapter_1_4_1
         "    Used *m_usedClass;\n"
         "};\n"
         "\\endcode\n"
-        "ñËÝÏ \\c MAX_DOT_GRAPH_HEIGHT × ËÏÎƦÇÕÒÁæÊÎÏÍÕ ÆÁÊ̦ "
-        "ÕÓÔÁÎÏ×ÌÅÎÅ ÎÁ 200, ÏÔÒÉÍÁ¤ÍÏ ÎÁÓÔÕÐÎÉÊ ÇÒÁÆ:"
+        "Таким чином, отримуємо наступний граф:"
         "<p><center><img src=\"graph_legend."+Config_getEnum("DOT_IMAGE_FORMAT")+"\"></center>\n"
         "<p>\n"
-        "ðÒÑÍÏËÕÔÎÉËÉ × ÃØÏÍÕ ÇÒÁƦ ÍÁÀÔØ ÎÁÓÔÕÐÎÉÊ ÚͦÓÔ:\n"
+        "Прямокутники в цьому графі мають наступний зміст:\n"
         "<ul>\n"
-        "<li>úÁÐÏ×ÎÅÎÉÊ ÞÏÒÎÉÊ ÐÒÑÍÏËÕÔÎÉˠצÄÏÂÒÁÖÁ¤ ÓÔÒÕËÔÕÒÕ ÁÂÏ ËÌÁÓ, "
-        "ÄÌÑ ÑËÏÇÏ ÓÔ×ÏÒÅÎÏ ÇÒÁÆ.\n"
-        "<li>ðÒÑÍÏËÕÔÎÉË Ú ÞÏÒÎÏÀ ÍÅÖÅÀ ×¦ÄÏÂÒÁÖÁ¤ ÄÏËÕÍÅÎÔÏ×ÁÎÕ ÓÔÒÕËÔÕÒÕ ÁÂÏ ËÌÁÓ.\n"
-        "<li>ðÒÑÍÏËÕÔÎÉË Ú Ó¦ÒÏÀ ÍÅÖÅÀ ×¦ÄÏÂÒÁÖÁ¤ ÎÅÄÏËÕÍÅÎÔÏ×ÁÎÕ ÓÔÒÕËÔÕÒÕ ÁÂÏ ËÌÁÓ.\n"
-        "<li>ðÒÑÍÏËÕÔÎÉË Ú ÞÅÒ×ÏÎÏÀ ÍÅÖÅÀ ×¦ÄÏÂÒÁÖÁ¤ ÄÏËÕÍÅÎÔÏ×ÁÎÕ ÓÔÒÕËÔÕÒÕ ÁÂÏ ËÌÁÓ, ÄÌÑ ÑËÉÈ\n"
-        " ÎÅ ×Ó¦ ÓЦ×צÄÎÏÛÅÎÎÑ ÕÓÐÁÄËÕ×ÁÎÎÑ/ÚͦÓÔÕ ÐÏËÁÚÁΦ. çÒÁÆ ÚÒ¦ÚÁÎÉê, "
-        "ÑËÝϠצΠÎÅ ×ͦÝÁ¤ÔØÓÑ Õ ×ËÁÚÁΦ ÍÅÖ¦."
+        "<li>Заповнений чорний прямокутник відображає структуру або клас, "
+        "для якого створено граф.\n"
+        "<li>Прямокутник з чорною межею відображає документовану структуру або клас.\n"
+        "<li>Прямокутник з сірою межею відображає недокументовану структуру або клас.\n"
+        "<li>Прямокутник з червоною межею відображає документовану структуру або клас, для яких\n"
+        " не всі співвідношення успадкування/змісту показані. Граф зрізаниЙ, "
+        "Ñ\8fкÑ\89о Ð²Ñ\96н Ð½Ðµ Ð²Ð¼Ñ\96Ñ\89аÑ\94Ñ\82Ñ\8cÑ\81Ñ\8f Ñ\83 Ð²ÐºÐ°Ð·Ð°Ð½Ñ\96 Ð¼ÐµÐ¶Ñ\96."
         "</ul>\n"
-        "óÔÒ¦ÌËÉ ÍÁÀÔØ ÎÁÓÔÕÐÎÉÊ ÚͦÓÔ:\n"
+        "Стрілки мають наступний зміст:\n"
         "<ul>\n"
-        "<li>ôÅÍÎÏÓÉÎÑ ÓÔÒ¦ÌËÁ ×¦ÄÏÂÒÁÖÁ¤ ×¦ÄÎÏÛÅÎÎÑ ÚÁÇÁÌØÎÏÄÏÓÔÕÐÎÏÇÏ ÕÓÐÁÄËÕ×ÁÎÎÑ "
-        "ͦ֠Ä×ÏÍÁ ËÌÁÓÁÍÉ.\n"
-        "<li>ôÅÍÎÏÚÅÌÅÎÁ ÓÔÒ¦ÌËÁ ×ÉËÏÒÉÓÔÏ×Õ¤ÔØÓÑ ÐÒÉ ÚÁÈÉÝÅÎÏÍÕ ÕÓÐÁÄËÕ×ÁÎΦ.\n"
-        "<li>ôÅÍÎÏÞÅÒ×ÏÎÁ ÓÔÒ¦ÌËÁ ×ÉËÏÒÉÓÔÏ×Õ¤ÔØÓÑ ÐÒÉ ÐÒÉ×ÁÔÎÏÍÕ ÕÓÐÁÄËÕ×ÁÎΦ.\n"
-        "<li>ðÕÒÐÕÒÎÁ ÓÔÒ¦ÌËÁ ×ÉËÏÒÉÓÔÏ×Õ¤ÔØÓÑ, ÑËÝÏ ËÌÁӠͦÓÔÉÔØÓÑ ×"
-        "¦ÎÛÏÍÕ ËÌÁÓ¦ ÁÂÏ ÎÉÍ ×ÉËÏÒÉÓÔÏ×Õ¤ÔØÓÑ."
-        "óÔÒ¦ÌËÁ ÅÔÉËÅÔÕ¤ÔØÓÑ ÚͦÎÎÏÀ, "
-        "ÞÅÒÅÚ ÑËՠצÄÂÕ×Á¤ÔØÓÑ ÄÏÓÔÕРÄÏ ×ËÁÚÁÎϧ ÓÔÒÕËÔÕÒÉ ÁÂÏ ËÌÁÓÕ. \n"
-        "</ul>\n");
+        "<li>Темносиня стрілка відображає відношення загальнодоступного успадкування "
+        "між двома класами.\n"
+        "<li>Темнозелена стрілка використовується при захищеному успадкуванні.\n"
+        "<li>Темночервона стрілка використовується при приватному успадкуванні.\n"
+        "<li>Пурпурна стрілка використовується, якщо клас міститься в"
+        "іншому класі або ним використовується."
+        "Стрілка етикетується змінною, "
+        "через яку відбувається доступ до вказаної структури або класу. \n"
+        "</ul>\n";
     }
     /*! text for the link to the legend page */
     virtual QCString trLegend()
     {
-      return decode("ÄÉ×. ÌÅÇÅÎÄÕ");
+      return "див. легенду";
     }
 
 //////////////////////////////////////////////////////////////////////////
 // new since 1.2.0
 //////////////////////////////////////////////////////////////////////////
-    
+
     /*! Used as a marker that is put before a test item */
     virtual QCString trTest()
     {
-      return decode("ôÅÓÔ");
+      return "Тест";
     }
     /*! Used as the header of the test list */
     virtual QCString trTestList()
     {
-      return decode("ðÅÒÅ̦ˠÔÅÓÔ¦×");
+      return "Список тестів";
     }
 
 //////////////////////////////////////////////////////////////////////////
@@ -1129,7 +1075,7 @@ class TranslatorUkrainian : public TranslatorAdapter_1_4_1
     /*! Used as a section header for KDE-2 IDL methods */
     virtual QCString trDCOPMethods()
     {
-      return decode("DCOP íÅÔÏÄÉ");
+      return "DCOP Методи";
     }
 
 //////////////////////////////////////////////////////////////////////////
@@ -1139,79 +1085,69 @@ class TranslatorUkrainian : public TranslatorAdapter_1_4_1
     /*! Used as a section header for IDL properties */
     virtual QCString trProperties()
     {
-      return decode("÷ÌÁÓÔÉ×ÏÓÔ¦");
+      return "Властивості";
     }
     /*! Used as a section header for IDL property documentation */
     virtual QCString trPropertyDocumentation()
     {
-      return decode("ðÏ×ÎÉÊ ÐÅÒÅ̦ˠ×ÌÁÓÔÉ×ÏÓÔÅÊ");
+      return "Повний список властивостей";
     }
 
 //////////////////////////////////////////////////////////////////////////
 // new since 1.2.4
 //////////////////////////////////////////////////////////////////////////
 
-    /*! Used for Java interfaces in the summary section of Java packages */
-    virtual QCString trInterfaces()
-    {
-      return decode("¶ÎÔÅÒÆÅÊÓÉ");
-    }
     /*! Used for Java classes in the summary section of Java packages */
     virtual QCString trClasses()
     {
       if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
       {
-        return decode( "óÔÒÕËÔÕÒÉ ÄÁÎÉÈ" );
+        return  "Структури даних" ;
       }
       else
       {
-        return decode( "ëÌÁÓÉ" );
+        return  "Класи" ;
       }
     }
     /*! Used as the title of a Java package */
     virtual QCString trPackage(const char *name)
     {
-      return decode("ðÁËÅÔ ")+name;
+      return QCString("Пакет ")+name;
     }
     /*! Title of the package index page */
     virtual QCString trPackageList()
     {
-      return decode("ðÏ×ÎÉÊ ÐÅÒÅ̦ˠÐÁËÅÔ¦×");
+      return "Повний список пакетів";
     }
     /*! The description of the package index page */
     virtual QCString trPackageListDescription()
     {
-      return decode("ðÏ×ÎÉÊ ÐÅÒÅ̦ˠÄÏËÕÍÅÎÔÏ×ÁÎÉÈ ÐÁËÅÔ¦×.");
+      return "Повний список документованих пакетів.";
     }
     /*! The link name in the Quick links header for each page */
     virtual QCString trPackages()
     {
-      return decode("ðÁËÅÔÉ");
-    }
-    /*! Used as a chapter title for Latex & RTF output */
-    virtual QCString trPackageDocumentation()
-    {
-      return decode("ïÐÉÓ ÐÁËÅÔ¦×");
+      return "Пакети";
     }
     /*! Text shown before a multi-line define */
     virtual QCString trDefineValue()
     {
-      return decode("íÁËÒÏÏÚÎÁÞÅÎÎÑ:");
+      return "Макровизначення:";
     }
 
 //////////////////////////////////////////////////////////////////////////
 // new since 1.2.5
 //////////////////////////////////////////////////////////////////////////
-    
+
     /*! Used as a marker that is put before a \\bug item */
     virtual QCString trBug()
     {
-      return decode("äÅÆÅËÔ");
+      return "Дефект";
     }
     /*! Used as the header of the bug list */
     virtual QCString trBugList()
     {
-      return decode("ðÅÒÅ̦ˠÄÅÆÅËÔ¦×");
+      return "Список дефектів";
     }
 
 //////////////////////////////////////////////////////////////////////////
@@ -1230,103 +1166,92 @@ class TranslatorUkrainian : public TranslatorAdapter_1_4_1
     /*! Used as header RTF general index */
     virtual QCString trRTFGeneralIndex()
     {
-      return decode("ðÒÅÄÍÅÔÎÉÊ ÐÏËÁÖÞÉË");
+      return "Предметний покажчик";
     }
 
     /*! This is used for translation of the word that will possibly
-     *  be followed by a single name or by a list of names 
+     *  be followed by a single name or by a list of names
      *  of the category.
      */
     virtual QCString trClass(bool first_capital, bool singular)
-    { 
+    {
       if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
       {
-        QCString result((first_capital ? "óÔÒÕËÔÕÒÉ ÄÁÎÉÈ" : "ÓÔÒÕËÔÕÒÉ ÄÁÎÉÈ"));
-        return decode(result); 
+        QCString result((first_capital ? "Структури даних" : "структури даних"));
+        return result;
       }
       else
       {
-        QCString result((first_capital ? "ëÌÁÓ" : "ËÌÁÓ"));
-        if(!singular) result+="É";
-        return decode(result); 
+        QCString result((first_capital ? "Клас" : "клас"));
+        if(!singular) result+="и";
+        return result;
       }
     }
 
     /*! This is used for translation of the word that will possibly
-     *  be followed by a single name or by a list of names 
+     *  be followed by a single name or by a list of names
      *  of the category.
      */
     virtual QCString trFile(bool first_capital, bool singular)
-    { 
-      QCString result((first_capital ? "æÁÊÌ" : "ÆÁÊÌ"));
-      if (!singular)  result+="É";
-      return decode(result); 
+    {
+      QCString result((first_capital ? "Файл" : "файл"));
+      if (!singular)  result+="и";
+      return result;
     }
 
     /*! This is used for translation of the word that will possibly
-     *  be followed by a single name or by a list of names 
+     *  be followed by a single name or by a list of names
      *  of the category.
      */
     virtual QCString trNamespace(bool first_capital, bool singular)
-    { 
-      QCString result((first_capital ? "ðÒÏÓÔ" : "ÐÒÏÓÔ"));
-      result+=(singular?"¦Ò ¦ÍÅÎ":"ÏÒÉ ¦ÍÅÎ");
-      return decode(result); 
+    {
+      QCString result((first_capital ? "Прост" : "прост"));
+      result+=(singular?"ір імен":"ори імен");
+      return result;
     }
 
     /*! This is used for translation of the word that will possibly
-     *  be followed by a single name or by a list of names 
+     *  be followed by a single name or by a list of names
      *  of the category.
      */
     virtual QCString trGroup(bool first_capital, bool singular)
-    { 
-      QCString result((first_capital ? "çÒÕÐ" : "ÇÒÕÐ"));
-      result+=(singular ? "Á" : "É");
-      return decode(result); 
+    {
+      QCString result((first_capital ? "Груп" : "груп"));
+      result+=(singular ? "а" : "и");
+      return result;
     }
 
     /*! This is used for translation of the word that will possibly
-     *  be followed by a single name or by a list of names 
+     *  be followed by a single name or by a list of names
      *  of the category.
      */
     virtual QCString trPage(bool first_capital, bool singular)
-    { 
-      QCString result((first_capital ? "óÔÏÒ¦ÎË" : "ÓÔÏÒ¦ÎË"));
-      result+=(singular ? "Á" : "É");
-      return decode(result); 
+    {
+      QCString result((first_capital ? "Сторінк" : "сторінк"));
+      result+=(singular ? "а" : "и");
+      return result;
     }
 
     /*! This is used for translation of the word that will possibly
-     *  be followed by a single name or by a list of names 
+     *  be followed by a single name or by a list of names
      *  of the category.
      */
     virtual QCString trMember(bool first_capital, bool singular)
-    { 
-      QCString result((first_capital ? "åÌÅÍÅÎÔ" : "ÅÌÅÍÅÎÔ"));
-      if (!singular)  result+="É";
-      return decode(result); 
-    }
-   
-    /*! This is used for translation of the word that will possibly
-     *  be followed by a single name or by a list of names 
-     *  of the category.
-     */
-    virtual QCString trField(bool first_capital, bool singular)
-    { 
-      QCString result((first_capital ? "ðÏÌ" : "ÐÏÌ"));
-      result+=(singular ? "Å" : "Ñ");
-      return decode(result); 
+    {
+      QCString result((first_capital ? "Елемент" : "елемент"));
+      if (!singular)  result+="и";
+      return result;
     }
 
     /*! This is used for translation of the word that will possibly
-     *  be followed by a single name or by a list of names 
+     *  be followed by a single name or by a list of names
      *  of the category.
      */
     virtual QCString trGlobal(bool first_capital, bool singular)
-    { 
-      QCString result((first_capital ? "çÌÏÂÁÌØÎ" : "ÇÌÏÂÁÌØÎ"));
-      result+=(singular ? "ÉÊ" : "¦");
-      return decode(result); 
+    {
+      QCString result((first_capital ? "Глобальн" : "глобальн"));
+      result+=(singular ? "ий" : "і");
+      return result;
     }
 
 //////////////////////////////////////////////////////////////////////////
@@ -1336,10 +1261,10 @@ class TranslatorUkrainian : public TranslatorAdapter_1_4_1
     /*! This text is generated when the \\author command is used and
      *  for the author section in man pages. */
     virtual QCString trAuthor(bool first_capital, bool singular)
-    {                                                                         
-      QCString result((first_capital ? "á×ÔÏÒ" : "Á×ÔÏÒ"));
-      if (!singular) result+="É";
-      return decode(result); 
+    {
+      QCString result((first_capital ? "Автор" : "автор"));
+      if (!singular) result+="и";
+      return result;
     }
 
 //////////////////////////////////////////////////////////////////////////
@@ -1350,19 +1275,19 @@ class TranslatorUkrainian : public TranslatorAdapter_1_4_1
      */
     virtual QCString trReferences()
     {
-      return "÷ÉËÏÒÉÓÔÏ×Õ¤";
+      return "Використовує";
     }
 
 //////////////////////////////////////////////////////////////////////////
 // new since 1.2.13
 //////////////////////////////////////////////////////////////////////////
 
-    /*! used in member documentation blocks to produce a list of 
+    /*! used in member documentation blocks to produce a list of
      *  members that are implemented by this one.
      */
     virtual QCString trImplementedFromList(int numEntries)
     {
-      return "òÅÁ̦ÚÕ¤ " + trWriteList(numEntries) + ".";
+      return "Реалізує " + trWriteList(numEntries) + ".";
     }
 
     /*! used in member documentation blocks to produce a list of
@@ -1370,7 +1295,7 @@ class TranslatorUkrainian : public TranslatorAdapter_1_4_1
      */
     virtual QCString trImplementedInList(int numEntries)
     {
-      return "òÅÁ̦ÚÕ¤ × " + trWriteList(numEntries) + ".";
+      return "Реалізує в " + trWriteList(numEntries) + ".";
     }
 
 //////////////////////////////////////////////////////////////////////////
@@ -1382,37 +1307,37 @@ class TranslatorUkrainian : public TranslatorAdapter_1_4_1
      */
     virtual QCString trRTFTableOfContents()
     {
-      return "úͦÓÔ";
+      return "Зміст";
     }
 
 //////////////////////////////////////////////////////////////////////////
 // new since 1.2.17
 //////////////////////////////////////////////////////////////////////////
 
-    /*! Used as the header of the list of item that have been 
-     *  flagged deprecated 
+    /*! Used as the header of the list of item that have been
+     *  flagged deprecated
      */
     virtual QCString trDeprecatedList()
     {
-      return "úÁÓÔÁҦ̦ ÅÌÅÍÅÎÔÉ";
+      return "Застарілі елементи";
     }
 
 //////////////////////////////////////////////////////////////////////////
 // new since 1.2.18
 //////////////////////////////////////////////////////////////////////////
 
-    /*! Used as a header for declaration section of the events found in 
+    /*! Used as a header for declaration section of the events found in
      * a C# program
      */
     virtual QCString trEvents()
     {
-      return "ðÏĦ§";
+      return "Події";
     }
 
     /*! Header used for the documentation section of a class' events. */
     virtual QCString trEventDocumentation()
     {
-      return "äÏËÕÍÅÎÔÁæѠÐÏĦÊ";
+      return "Документація подій";
     }
 
 //////////////////////////////////////////////////////////////////////////
@@ -1422,83 +1347,83 @@ class TranslatorUkrainian : public TranslatorAdapter_1_4_1
     /*! Used as a heading for a list of Java class types with package scope.
      */
     virtual QCString trPackageTypes()
-    { 
-      return "ôÉÐÉ ÐÁËÅÔ¦×";
+    {
+      return "Типи пакетів";
     }
 
-    /*! Used as a heading for a list of Java class functions with package 
-     * scope. 
+    /*! Used as a heading for a list of Java class functions with package
+     * scope.
      */
     virtual QCString trPackageMembers()
-    { 
-      return "æÕÎË槠ÐÁËÅÔ¦×";
+    {
+      return "Функції пакетів";
     }
 
-    /*! Used as a heading for a list of static Java class functions with 
+    /*! Used as a heading for a list of static Java class functions with
      *  package scope.
      */
     virtual QCString trStaticPackageMembers()
-    { 
-      return "óÔÁÔÉÞΦ ÆÕÎËæÀ ÐÁËÅÔ¦×";
+    {
+      return "Статичні функцію пакетів";
     }
-    
-    /*! Used as a heading for a list of Java class variables with package 
+
+    /*! Used as a heading for a list of Java class variables with package
      * scope.
      */
     virtual QCString trPackageAttribs()
     {
-      return "áÔÒÉÂÕÔÉ ÐÁËÅÔ¦×";
+      return "Атрибути пакетів";
     }
-    
-    /*! Used as a heading for a list of static Java class variables with 
+
+    /*! Used as a heading for a list of static Java class variables with
      * package scope.
      */
     virtual QCString trStaticPackageAttribs()
     {
-      return "óÔÁÔÉÞΦ ÁÔÒÉÂÕÔÉ ÐÁËÅÔ¦×";
+      return "Статичні атрибути пакетів";
     }
-    
+
 //////////////////////////////////////////////////////////////////////////
 // new since 1.3.1
 //////////////////////////////////////////////////////////////////////////
 
-    /*! Used in the quick index of a class/file/namespace member list page 
+    /*! Used in the quick index of a class/file/namespace member list page
      *  to link to the unfiltered list of all members.
      */
     virtual QCString trAll()
     {
-      return "÷Ó¦";
+      return "Всі";
     }
     /*! Put in front of the call graph for a function. */
     virtual QCString trCallGraph()
     {
-      return "çÒÁÆ ×ӦȠ×ÉËÌÉ˦נ椧 ÆÕÎËæ§:";
+      return "Граф всіх викликів цієї функції:";
     }
 
 //////////////////////////////////////////////////////////////////////////
 // new since 1.3.3
 //////////////////////////////////////////////////////////////////////////
 
-    /*! When the search engine is enabled this text is put in the header 
-     *  of each page before the field where one can enter the text to search 
-     *  for. 
+    /*! When the search engine is enabled this text is put in the header
+     *  of each page before the field where one can enter the text to search
+     *  for.
      */
     virtual QCString trSearchForIndex()
     {
-      return "ûÕËÁÔÉ";
+      return "Шукати";
     }
     /*! This string is used as the title for the page listing the search
      *  results.
      */
     virtual QCString trSearchResultsTitle()
     {
-      return "òÅÚÕÌØÔÁÔÉ ÐÏÛÕËÕ";
+      return "Результати пошуку";
     }
     /*! This string is put just before listing the search results. The
      *  text can be different depending on the number of documents found.
      *  Inside the text you can put the special marker $num to insert
      *  the number representing the actual number of search results.
-     *  The @a numDocuments parameter can be either 0, 1 or 2, where the 
+     *  The @a numDocuments parameter can be either 0, 1 or 2, where the
      *  value 2 represents 2 or more matches. HTML markup is allowed inside
      *  the returned string.
      */
@@ -1506,24 +1431,24 @@ class TranslatorUkrainian : public TranslatorAdapter_1_4_1
     {
       if (numDocuments==0)
       {
-        return "îÅ ÚÎÁÊÄÅÎÏ ÄÏËÕÍÅÎԦנצÄÐÏצÄÎÏ ÄÏ ×ÁÛÏÇÏ ÚÁÐÉÔÕ.";
+        return "Не знайдено документів відповідно до вашого запиту.";
       }
       else if (numDocuments==1)
       {
-        return "âÕÌÏ ÚÎÁÊÄÅÎÏ <b>1</b> ÄÏËÕÍÅÎԠצÄÐÏצÄÎÏ ÄÏ ×ÁÛÏÇÏ ÚÁÐÉÔÕ.";
+        return "Було знайдено <b>1</b> документ відповідно до вашого запиту.";
       }
-      else 
+      else
       {
-        return "âÕÌÏ ÚÎÁÊÄÅÎÏ <b>$num</b> ÄÏËÕÍÅÎԦנצÄÐÏצÄÎÏ ÄÏ ×ÁÛÏÇÏ ÚÁÐÉÔÕ. "
-              "îÁÊËÒÁݦ ×¦ÄÐÏצÄÎÏÓÔ¦ ÐÏËÁÚÁÎÏ ÓÐÏÞÁÔËÕ.";
+        return "Було знайдено <b>$num</b> документів відповідно до вашого запиту. "
+              "Найкращі відповідності показано спочатку.";
       }
     }
-    /*! This string is put before the list of matched words, for each search 
+    /*! This string is put before the list of matched words, for each search
      *  result. What follows is the list of words that matched the query.
      */
     virtual QCString trSearchMatches()
     {
-      return "÷¦ÄÐÏצÄΦÓÔØ:";
+      return "Відповідність:";
     }
 
 //////////////////////////////////////////////////////////////////////////
@@ -1534,7 +1459,7 @@ class TranslatorUkrainian : public TranslatorAdapter_1_4_1
      */
     virtual QCString trSourceFile(QCString& filename)
     {
-      return "ôÅËÓÔ ÐÒÏÇÒÁÍÉ "+filename;
+      return "Текст програми "+filename;
     }
 
 //////////////////////////////////////////////////////////////////////////
@@ -1545,43 +1470,500 @@ class TranslatorUkrainian : public TranslatorAdapter_1_4_1
      *  hierarchy.
      */
     virtual QCString trDirIndex()
-    { return "äÅÒÅ×Ï ËÁÔÁÌÏǦ×"; }
+    { return "Дерево каталогів"; }
 
     /*! This is used as the name of the chapter containing the documentation
      *  of the directories.
      */
     virtual QCString trDirDocumentation()
-    { return "äÏËÕÍÅÎÔÁæѠËÁÔÁÌÏǦ×"; }
+    { return "Документація каталогів"; }
 
     /*! This is used as the title of the directory index and also in the
      *  Quick links of a HTML page, to link to the directory hierarchy.
      */
     virtual QCString trDirectories()
-    { return "ëÁÔÁÌÏÇÉ"; }
+    { return "Каталоги"; }
 
-    /*! This returns a sentences that introduces the directory hierarchy. 
+    /*! This returns a sentences that introduces the directory hierarchy.
      *  and the fact that it is sorted alphabetically per level
      */
     virtual QCString trDirDescription()
-    { return "äÅÒÅ×Ï ËÁÔÁÌÏǦנ×ÐÏÒÑÄËÏ×ÁÎÏ ÎÁÂÌÉÖÅÎÏ "
-            "ÄÏ ÁÌÆÁצÔÕ:";
+    { return "Дерево каталогів впорядковано наближено "
+            "до алфавіту:";
     }
 
     /*! This returns the title of a directory page. The name of the
      *  directory is passed via \a dirName.
      */
     virtual QCString trDirReference(const char *dirName)
-    { QCString result="äÏצÄÎÉË ËÁÔÁÌÏÇÕ "; result+=dirName; return result; }
+    { QCString result="Довідник каталогу "; result+=dirName; return result; }
 
     /*! This returns the word directory with or without starting capital
      *  (\a first_capital) and in sigular or plural form (\a singular).
      */
     virtual QCString trDir(bool, bool singular)
-    { 
-      QCString result("ëÁÔÁÌÏÇ");
-      if (!singular) result+="É";
-      return result; 
+    {
+      QCString result("Каталог");
+      if (!singular) result+="и";
+      return result;
+    }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.4.1
+//////////////////////////////////////////////////////////////////////////
+
+    /*! This text is added to the documentation when the \\overload command
+     *  is used for a overloaded function.
+     */
+    virtual QCString trOverloadText()
+    {
+       return "Це перезавантажуваний метод, "
+              "ввкдкний для зручності. Він відрізняється від "
+              "описаної вище функції лише списком аргуметнів.";
+    }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.4.6
+//////////////////////////////////////////////////////////////////////////
+
+    /*! This is used to introduce a caller (or called-by) graph */
+    virtual QCString trCallerGraph()
+    {
+      return "Граф викликів для цієї функції:";
+    }
+
+    /*! This is used in the documentation of a file/namespace before the list
+     *  of documentation blocks for enumeration values
+     */
+    virtual QCString trEnumerationValueDocumentation()
+    { return "Документація переліку"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.5.4 (mainly for Fortran)
+//////////////////////////////////////////////////////////////////////////
+
+    /*! header that is put before the list of member subprograms (Fortran). */
+    virtual QCString trMemberFunctionDocumentationFortran()
+    { return "Документація функції/підпрограми"; }
+
+    /*! This is put above each page as a link to the list of annotated data types (Fortran). */
+    virtual QCString trCompoundListFortran()
+    { return "Список типів даних"; }
+
+    /*! This is put above each page as a link to all members of compounds (Fortran). */
+    virtual QCString trCompoundMembersFortran()
+    { return "Поля даних"; }
+
+    /*! This is an introduction to the annotated compound list (Fortran). */
+    virtual QCString trCompoundListDescriptionFortran()
+    { return "Типи даних з коротким описом:"; }
+
+    /*! This is an introduction to the page with all data types (Fortran). */
+    virtual QCString trCompoundMembersDescriptionFortran(bool extractAll)
+    {
+      QCString result="Список усіх ";
+      if (!extractAll)
+      {
+        result+="задокументованих ";
+      }
+      result+="елементів типів даних";
+      result+=" з посиланнями на ";
+      if (!extractAll)
+      {
+         result+="документацію структури даних кожного елемента";
+      }
+      else
+      {
+         result+="типи даних, до яких вони належать:";
+      }
+      return result;
+    }
+
+    /*! This is used in LaTeX as the title of the chapter with the
+     * annotated compound index (Fortran).
+     */
+    virtual QCString trCompoundIndexFortran()
+    { return "Список типів даних"; }
+
+    /*! This is used in LaTeX as the title of the chapter containing
+     *  the documentation of all data types (Fortran).
+     */
+    virtual QCString trTypeDocumentation()
+    { return "Документація типів даних"; }
+
+    /*! This is used in the documentation of a file as a header before the
+     *  list of (global) subprograms (Fortran).
+     */
+    virtual QCString trSubprograms()
+    { return "Функції/підпрограми"; }
+
+    /*! This is used in the documentation of a file/namespace before the list
+     *  of documentation blocks for subprograms (Fortran)
+     */
+    virtual QCString trSubprogramDocumentation()
+    { return "Документація функцій/підпрограм"; }
+
+    /*! This is used in the documentation of a file/namespace/group before
+     *  the list of links to documented compounds (Fortran)
+     */
+     virtual QCString trDataTypes()
+    { return "Типи даних"; }
+
+    /*! used as the title of page containing all the index of all modules (Fortran). */
+    virtual QCString trModulesList()
+    { return "Список модулів"; }
+
+    /*! used as an introduction to the modules list (Fortran) */
+    virtual QCString trModulesListDescription(bool extractAll)
+    {
+      QCString result="Список усіх ";
+      if (!extractAll) result+="задокументованих ";
+      result+="модулів з коротким описом:";
+      return result;
+    }
+
+    /*! used as the title of the HTML page of a module/type (Fortran) */
+    virtual QCString trCompoundReferenceFortran(const char *clName,
+                                    ClassDef::CompoundType compType,
+                                    bool isTemplate)
+    {
+      QCString result=(QCString)clName;
+      if (isTemplate)
+      {
+       switch(compType)
+       {
+         case ClassDef::Class:      result+=" Модуль"; break;
+         case ClassDef::Struct:     result+=" Тип"; break;
+         case ClassDef::Union:      result+=" Об'єднання"; break;
+         case ClassDef::Interface:  result+=" Інтерфейс"; break;
+         case ClassDef::Protocol:   result+=" Протокол"; break;
+         case ClassDef::Category:   result+=" Категорія"; break;
+         case ClassDef::Exception:  result+=" Виняток"; break;
+          default: break;
+       }
+      }
+      else
+      {
+       if (isTemplate) result+=" Шаблон ";
+       switch(compType)
+       {
+         case ClassDef::Class:      result+="модуля"; break;
+         case ClassDef::Struct:     result+="типу"; break;
+         case ClassDef::Union:      result+="об'єднання"; break;
+         case ClassDef::Interface:  result+="інтерфейсу"; break;
+         case ClassDef::Protocol:   result+="протоколу"; break;
+         case ClassDef::Category:   result+="категорії"; break;
+         case ClassDef::Exception:  result+="винятка"; break;
+          default: break;
+       }
+      }
+      return result;
     }
+    /*! used as the title of the HTML page of a module (Fortran) */
+    virtual QCString trModuleReference(const char *namespaceName)
+    {
+      QCString result=namespaceName;
+      result+=" Модуль";
+      return result;
+    }
+
+    /*! This is put above each page as a link to all members of modules. (Fortran) */
+    virtual QCString trModulesMembers()
+    { return "Елементи модуля"; }
+
+    /*! This is an introduction to the page with all modules members (Fortran) */
+    virtual QCString trModulesMemberDescription(bool extractAll)
+    {
+      QCString result="Список усіх ";
+      if (!extractAll) result+="задокументованих ";
+      result+="елементів модулів з посиланнями на ";
+      if (extractAll)
+      {
+        result+="документацію модуля для кожного елемента:";
+      }
+      else
+      {
+        result+="модулі, до яких вони належать:";
+      }
+      return result;
+    }
+
+    /*! This is used in LaTeX as the title of the chapter with the
+     *  index of all modules (Fortran).
+     */
+    virtual QCString trModulesIndex()
+    { return "Алфавітний покажчик модулів"; }
+
+    /*! This is used for translation of the word that will possibly
+     *  be followed by a single name or by a list of names
+     *  of the category.
+     */
+    virtual QCString trModule(bool first_capital, bool singular)
+    {
+           QCString result((first_capital ? "Модул" : "модул"));
+           result+=(singular? "ь": "і");
+      return result;
+    }
+
+    /*! This is put at the bottom of a module documentation page and is
+     *  followed by a list of files that were used to generate the page.
+     */
+    virtual QCString trGeneratedFromFilesFortran(ClassDef::CompoundType compType,
+        bool single)
+    {
+      // single is true implies a single file
+      QCString result=(QCString)"Документацію для ";
+      switch(compType)
+      {
+        case ClassDef::Class:      result+="цього модуля"; break;
+        case ClassDef::Struct:     result+="цього типу"; break;
+        case ClassDef::Union:      result+="цього об'єднання"; break;
+        case ClassDef::Interface:  result+="цього інтерфейсу"; break;
+        case ClassDef::Protocol:   result+="цього протоколу"; break;
+        case ClassDef::Category:   result+="цієї категорії"; break;
+        case ClassDef::Exception:  result+="цього винятку"; break;
+        default: break;
+      }
+      result+=" було згенеровано з ";
+      if (single) result+="наступного файлу:"; else result+="наступних файлів:";
+      return result;
+    }
+
+    /*! This is used for translation of the word that will possibly
+     *  be followed by a single name or by a list of names
+     *  of the category.
+     */
+    virtual QCString trType(bool first_capital, bool singular)
+    {
+      QCString result((first_capital ? "Тип" : "тип"));
+      if (!singular)  result+="и";
+      return result;
+    }
+
+    /*! This is used for translation of the word that will possibly
+     *  be followed by a single name or by a list of names
+     *  of the category.
+     */
+    virtual QCString trSubprogram(bool first_capital, bool singular)
+    {
+      QCString result((first_capital ? "Підпрограм" : "підпрограм"));
+      result+= (singular? "а": "и");
+      return result;
+    }
+
+    /*! C# Type Constraint list */
+    virtual QCString trTypeConstraints()
+    {
+      return "Обмеження типу";
+    }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.6.0 (mainly for the new search engine)
+//////////////////////////////////////////////////////////////////////////
+
+    /*! directory relation for \a name */
+    virtual QCString trDirRelation(const char *name)
+    {
+      return "Зв'язок з "+QCString(name);
+    }
+
+    /*! Loading message shown when loading search results */
+    virtual QCString trLoading()
+    {
+      return "Завантаження...";
+    }
+
+    /*! Label used for search results in the global namespace */
+    virtual QCString trGlobalNamespace()
+    {
+      return "Глобальний простір імен";
+    }
+
+    /*! Message shown while searching */
+    virtual QCString trSearching()
+    {
+      return "Пошук...";
+    }
+
+    /*! Text shown when no search results are found */
+    virtual QCString trNoMatches()
+    {
+      return "Нічого не знайдено";
+    }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.6.3 (missing items for the directory pages)
+//////////////////////////////////////////////////////////////////////////
+
+    /*! introduction text for the directory dependency graph */
+    virtual QCString trDirDependency(const char *name)
+    {
+      return (QCString)"Граф залежностей каталогу для "+name;
+    }
+
+    /*! when clicking a directory dependency label, a page with a
+     *  table is shown. The heading for the first column mentions the
+     *  source file that has a relation to another file.
+     */
+    virtual QCString trFileIn(const char *name)
+    {
+      return (QCString)"Файл у "+name;
+    }
+
+    /*! when clicking a directory dependency label, a page with a
+     *  table is shown. The heading for the second column mentions the
+     *  destination file that is included.
+     */
+    virtual QCString trIncludesFileIn(const char *name)
+    {
+      return (QCString)"Включає файли в "+name;
+    }
+
+    /** Compiles a date string.
+     *  @param year Year in 4 digits
+     *  @param month Month of the year: 1=January
+     *  @param day Day of the Month: 1..31
+     *  @param dayOfWeek Day of the week: 1=Monday..7=Sunday
+     *  @param hour Hour of the day: 0..23
+     *  @param minutes Minutes in the hour: 0..59
+     *  @param seconds Seconds within the minute: 0..59
+     *  @param includeTime Include time in the result string?
+     */
+    virtual QCString trDateTime(int year,int month,int day,int dayOfWeek,
+                                int hour,int minutes,int seconds,
+                                bool includeTime)
+    {
+      static const char *days[]   = { "Понеділок","Вівторок","Середа","Четвер","П'ятниця","Субота","Неділя" };
+      static const char *months[] = { "січня","лютого","березня","квітня","травня","червня","липня","серпня","вересня","жотня","листопада","грудня" };
+      QCString sdate;
+      sdate.sprintf("%s, %d %s %d",days[dayOfWeek-1],day,months[month-1],year);
+      if (includeTime)
+      {
+        QCString stime;
+        stime.sprintf(" %.2d:%.2d:%.2d",hour,minutes,seconds);
+        sdate+=stime;
+      }
+      return sdate;
+    }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.7.5
+//////////////////////////////////////////////////////////////////////////
+
+    /*! Header for the page with bibliographic citations */
+    virtual QCString trCiteReferences()
+    { return "Бібліографічні посилання"; }
+
+    /*! Text for copyright paragraph */
+    virtual QCString trCopyright()
+    { return "Копірайт"; }
+
+    /*! Header for the graph showing the directory dependencies */
+    virtual QCString trDirDepGraph(const char *name)
+    { return QCString("Граф залежностей каталогу для ")+name+":"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.8.0
+//////////////////////////////////////////////////////////////////////////
+
+    /*! Detail level selector shown for hierarchical indices */
+    virtual QCString trDetailLevel()
+    { return "рівень елемента"; }
+
+    /*! Section header for list of template parameters */
+    virtual QCString trTemplateParameters()
+    { return "Параметри шаблона"; }
+
+    /*! Used in dot graph when UML_LOOK is enabled and there are many fields */
+    virtual QCString trAndMore(const QCString &number)
+    { return "і ще  "+number+"..."; }
+
+    /*! Used file list for a Java enum */
+    virtual QCString trEnumGeneratedFromFiles(bool single)
+    { QCString result = "Документацію для цього переліку булозгенеровано з ";
+           result += (single? "наступного файла": "наступних файлів");
+      result+=":";
+      return result;
+    }
+
+    /*! Header of a Java enum page (Java enums are represented as classes). */
+    virtual QCString trEnumReference(const char *name)
+    { return QCString(name)+" Перелік"; }
+
+    /*! Used for a section containing inherited members */
+    virtual QCString trInheritedFrom(const char *members,const char *what)
+    { return QCString(members)+" успадковано з "+what; }
+
+    /*! Header of the sections with inherited members specific for the
+     *  base class(es)
+     */
+    virtual QCString trAdditionalInheritedMembers()
+    { return "Додаткові успадковані елементи"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.8.2
+//////////////////////////////////////////////////////////////////////////
+
+    /*! Used as a tooltip for the toggle button that appears in the
+     *  navigation tree in the HTML output when GENERATE_TREEVIEW is
+     *  enabled. This tooltip explains the meaning of the button.
+     */
+    virtual QCString trPanelSynchronisationTooltip(bool enable)
+    {
+      QCString opt = enable ? "дозволити" : "заборонити";
+      return "клацніть мишкою, щоб "+opt+" синхронізацію панелі";
+    }
+
+    /*! Used in a method of an Objective-C class that is declared in a
+     *  a category. Note that the @1 marker is required and is replaced
+     *  by a link.
+     */
+    virtual QCString trProvidedByCategory()
+    {
+      return "Забезпечено категорією @1.";
+    }
+
+    /*! Used in a method of an Objective-C category that extends a class.
+     *  Note that the @1 marker is required and is replaced by a link to
+     *  the class method.
+     */
+    virtual QCString trExtendsClass()
+    {
+      return "Розширює клас @1.";
+    }
+
+    /*! Used as the header of a list of class methods in Objective-C.
+     *  These are similar to static public member functions in C++.
+     */
+    virtual QCString trClassMethods()
+    {
+      return "Методи класу";
+    }
+
+    /*! Used as the header of a list of instance methods in Objective-C.
+     *  These are similar to public member functions in C++.
+     */
+    virtual QCString trInstanceMethods()
+    {
+      return "Методи об'єкта";
+    }
+
+    /*! Used as the header of the member functions of an Objective-C class.
+     */
+    virtual QCString trMethodDocumentation()
+    {
+      return "Документація метода";
+    }
+
+    /*! Used as the title of the design overview picture created for the
+     *  VHDL output.
+     */
+    virtual QCString trDesignOverview()
+    {
+      return "Огляд дизайну проекту";
+    }
+
+//////////////////////////////////////////////////////////////////////////
 
 };
 
index d7984a9..36fb48a 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -627,6 +627,7 @@ class TranslatorVietnamese : public TranslatorAdapter_1_6_0
         case ClassDef::Protocol:   result+=" Protocol"; break;
         case ClassDef::Category:   result+=" Category"; break;
         case ClassDef::Exception:  result+=" Exception"; break;
+        default: break;
       }
       if (isTemplate) result+=" Template";
       result+=" Tham chiếu";
@@ -786,6 +787,7 @@ class TranslatorVietnamese : public TranslatorAdapter_1_6_0
         case ClassDef::Protocol:   result+="protocol"; break;
         case ClassDef::Category:   result+="category"; break;
         case ClassDef::Exception:  result+="exception"; break;
+        default: break;
       }
       result+=" được biên soạn từ các file sau đây";
       if (single) result+=":"; else result+=":";
@@ -1210,7 +1212,7 @@ class TranslatorVietnamese : public TranslatorAdapter_1_6_0
      */
     virtual QCString trRTFansicp()
     {
-      return "1252";
+      return "1258";
     }
     
 
@@ -1219,7 +1221,7 @@ class TranslatorVietnamese : public TranslatorAdapter_1_6_0
      */
     virtual QCString trRTFCharSet()
     {
-      return "0";
+      return "163";
     }
 
     /*! Used as header RTF general index */
@@ -1683,6 +1685,7 @@ class TranslatorVietnamese : public TranslatorAdapter_1_6_0
         case ClassDef::Protocol:   result+=" Protocol"; break;
         case ClassDef::Category:   result+=" Category"; break;
         case ClassDef::Exception:  result+=" Exception"; break;
+        default: break;
       }
       if (isTemplate) result+=" Template";
       result+=" Tham chiếu";
@@ -1750,6 +1753,7 @@ class TranslatorVietnamese : public TranslatorAdapter_1_6_0
         case ClassDef::Protocol:   result+="protocol"; break;
         case ClassDef::Category:   result+="category"; break;
         case ClassDef::Exception:  result+="exception"; break;
+        default: break;
       }
       result+=" được biên soạn từ các file sau đây";
       if (single) result+=":"; else result+="s:";
index b3084c6..eb278d6 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -606,6 +606,7 @@ class TranslatorAfrikaans : public TranslatorAdapter_1_6_0
         case ClassDef::Protocol:   result+=" Protocol"; break;
         case ClassDef::Category:   result+=" Kategorie"; break;
         case ClassDef::Exception:  result+=" Exception"; break;
+        default: break;
       }
       if (isTemplate) result+=" Template";
       result+=" Verwysing";
@@ -765,6 +766,7 @@ class TranslatorAfrikaans : public TranslatorAdapter_1_6_0
         case ClassDef::Protocol:   result+="protokol"; break;
         case ClassDef::Category:   result+="kategorie"; break;
         case ClassDef::Exception:  result+="eksepsie"; break;
+        default: break;
       }
       result+=" is gegenereer vanaf die volgende le&euml;r";
       if (single) result+=":"; else result+="s:";
@@ -1663,6 +1665,7 @@ class TranslatorAfrikaans : public TranslatorAdapter_1_6_0
         case ClassDef::Protocol:   result+=" Protokol"; break;
         case ClassDef::Category:   result+=" Kategorie"; break;
         case ClassDef::Exception:  result+=" Eksepsie"; break;
+        default: break;
       }
       if (isTemplate) result+=" Template";
       result+=" Bron";
@@ -1730,6 +1733,7 @@ class TranslatorAfrikaans : public TranslatorAdapter_1_6_0
         case ClassDef::Protocol:   result+="protokcol"; break;
         case ClassDef::Category:   result+="kategorie"; break;
         case ClassDef::Exception:  result+="eksepsie"; break;
+        default: break;
       }
       result+=" is gegenereer vanaf die foldende leer";
       if (single) result+=":"; else result+="s:";
index 7261ee9..6537774 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -789,6 +789,28 @@ class TranslatorDecoder : public Translator
     { return toUtf8(m_translator->trDesignOverview()); }
 
 //////////////////////////////////////////////////////////////////////////
+// new since 1.8.4
+//////////////////////////////////////////////////////////////////////////
+
+    QCString trInterfaces()
+    { return toUtf8(m_translator->trInterfaces()); }
+    QCString trServices()
+    { return toUtf8(m_translator->trServices()); }
+    QCString trConstantGroups()
+    { return toUtf8(m_translator->trConstantGroups()); }
+    QCString trConstantGroupReference(const char *namespaceName)
+    { return toUtf8(m_translator->trConstantGroupReference(fromUtf8(namespaceName))); }
+    QCString trServiceReference(const char *sName)
+    { return toUtf8(m_translator->trServiceReference(fromUtf8(sName))); }
+    QCString trSingletonReference(const char *sName)
+    { return toUtf8(m_translator->trSingletonReference(fromUtf8(sName))); }
+    QCString trServiceGeneratedFromFiles(bool single)
+    { return toUtf8(m_translator->trServiceGeneratedFromFiles(single)); }
+    QCString trSingletonGeneratedFromFiles(bool single)
+    { return toUtf8(m_translator->trSingletonGeneratedFromFiles(single)); }
+
+
+//////////////////////////////////////////////////////////////////////////
   private:
     Translator *m_translator;
     void *m_toUtf8;
index 9bc5827..0c269be 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
  *  @brief This file contains a number of basic enums and types. 
  */
 
+/** Protection level of members */
 enum Protection   { Public, Protected, Private, Package } ;
+
+/** Virtualness of a member. */
 enum Specifier    { Normal, Virtual, Pure } ;
+
+/** Kind of method */
 enum MethodTypes  { Method, Signal, Slot, DCOP, Property, Event };
+
+/** Type of member relation */
 enum RelatesType  { Simple, Duplicate, MemberOf };
+
+/** Kind of member relationship */
 enum Relationship { Member, Related, Foreign };
+
+/** Language as given by extension */
 enum SrcLangExt
 {
   SrcLangExt_Unknown  = 0x00000,
@@ -46,8 +57,10 @@ enum SrcLangExt
   SrcLangExt_Markdown = 0x10000
 };
 
+/** Grouping info */
 struct Grouping 
 {
+  /** Grouping priority */
   enum GroupPri_t 
   {
     GROUPING_LOWEST,
@@ -169,7 +182,14 @@ enum MemberListType
 
   MemberListType_redefinedBy             = 67,
   MemberListType_enumFields              = 68,
-  MemberListType_memberGroup             = 69
+  MemberListType_memberGroup             = 69,
+
+  // this one is for the summary section on the class page
+  MemberListType_interfaces              = 70,
+  // this one is for the detailed section on the class page
+  MemberListType_interfaceMembers        = 71 + MemberListType_detailedLists,
+  MemberListType_services                = 72,
+  MemberListType_serviceMembers          = 73 + MemberListType_detailedLists,
 };
 
 enum MemberType 
@@ -185,7 +205,9 @@ enum MemberType
   MemberType_Friend,
   MemberType_DCOP,
   MemberType_Property,
-  MemberType_Event
+  MemberType_Event,
+  MemberType_Interface,
+  MemberType_Service,
 };
 
 #endif
index 0d48f96..0d70d43 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -278,7 +278,7 @@ static QCString stripFromPath(const QCString &path,QStrList &l)
   {
     QCString prefix = s;
     if (prefix.length() > length &&
-        stricmp(path.left(prefix.length()),prefix)==0) // case insensitive compare
+        qstricmp(path.left(prefix.length()),prefix)==0) // case insensitive compare
     {
       length = prefix.length();
       potential = path.right(path.length()-prefix.length());
@@ -498,7 +498,7 @@ NamespaceDef *getResolvedNamespace(const char *name)
     }
     if (count==10)
     {
-      err("warning: possible recursive namespace alias detected for %s!\n",name);
+      warn_uncond("possible recursive namespace alias detected for %s!\n",name);
     }
     return Doxygen::namespaceSDict->find(subst->data());
   }
@@ -1567,6 +1567,7 @@ ClassDef *getResolvedClass(Definition *scope,
     QCString *pResolvedType
     )
 {
+  static bool optimizeOutputVhdl = Config_getBool("OPTIMIZE_OUTPUT_VHDL");
   g_resolvedTypedefs.clear();
   if (scope==0 ||
       (scope->definitionType()!=Definition::TypeClass && 
@@ -1583,7 +1584,15 @@ ClassDef *getResolvedClass(Definition *scope,
   //    n,
   //    mayBeUnlinkable
   //   );
-  ClassDef *result = getResolvedClassRec(scope,fileScope,n,pTypeDef,pTemplSpec,pResolvedType);
+  ClassDef *result;
+  if (optimizeOutputVhdl)
+  {
+    result = getClass(n);
+  }
+  else
+  {
+    result = getResolvedClassRec(scope,fileScope,n,pTypeDef,pTemplSpec,pResolvedType);
+  }
   if (!mayBeUnlinkable && result && !result->isLinkable()) 
   {
     if (!mayBeHidden || !result->isHidden())
@@ -1815,6 +1824,49 @@ nextChar:
   return growBuf.get();
 }  
 
+/**
+ * Returns the position in the string where a function parameter list
+ * begins, or -1 if one is not found.
+ */
+int findParameterList(const QString &name)
+{
+  int pos=-1;
+  int templateDepth=0;
+  do
+  {
+    if (templateDepth > 0)
+    {
+      int nextOpenPos=name.findRev('>', pos);
+      int nextClosePos=name.findRev('<', pos);
+      if (nextOpenPos!=-1 && nextOpenPos>nextClosePos)
+      {
+        ++templateDepth;
+        pos=nextOpenPos-1;
+      }
+      else
+      {
+        --templateDepth;
+        pos=nextClosePos-1;
+      }
+    }
+    else
+    {
+      int lastAnglePos=name.findRev('>', pos);
+      int bracePos=name.findRev('(', pos);
+      if (lastAnglePos!=-1 && lastAnglePos>bracePos)
+      {
+        ++templateDepth;
+        pos=lastAnglePos-1;
+      }
+      else
+      {
+        return bracePos;
+      }
+    }
+  } while (pos!=-1);
+  return -1;
+}
+
 bool rightScopeMatch(const QCString &scope, const QCString &name)
 {
   return (name==scope || // equal 
@@ -2287,7 +2339,7 @@ QCString transcodeCharacterStringToUTF8(const QCString &input)
   void *cd = portable_iconv_open(outputEncoding,inputEncoding);
   if (cd==(void *)(-1)) 
   {
-    err("error: unsupported character conversion: '%s'->'%s'\n",
+    err("unsupported character conversion: '%s'->'%s'\n",
         inputEncoding.data(),outputEncoding);
     error=TRUE;
   }
@@ -2306,7 +2358,7 @@ QCString transcodeCharacterStringToUTF8(const QCString &input)
     }
     else
     {
-      err("error: failed to translate characters from %s to %s: check INPUT_ENCODING\ninput=[%s]\n",
+      err("failed to translate characters from %s to %s: check INPUT_ENCODING\ninput=[%s]\n",
           inputEncoding.data(),outputEncoding,input.data());
       error=TRUE;
     }
@@ -2351,7 +2403,7 @@ QCString fileToString(const char *name,bool filter,bool isSourceCode)
     QFileInfo fi(name);
     if (!fi.exists() || !fi.isFile())
     {
-      err("error: file `%s' not found\n",name);
+      err("file `%s' not found\n",name);
       return "";
     }
     QCString filterName = getFileFilter(name,isSourceCode);
@@ -2385,7 +2437,7 @@ QCString fileToString(const char *name,bool filter,bool isSourceCode)
       FILE *f=portable_popen(cmd,"r");
       if (!f)
       {
-        err("error: could not execute filter %s\n",filterName.data());
+        err("could not execute filter %s\n",filterName.data());
         return "";
       }
       const int bSize=4096;
@@ -2409,7 +2461,7 @@ QCString fileToString(const char *name,bool filter,bool isSourceCode)
   }
   if (!fileOpened)  
   {
-    err("error: cannot open file `%s' for reading\n",name);
+    err("cannot open file `%s' for reading\n",name);
   }
   return "";
 }
@@ -2449,8 +2501,8 @@ int minClassDistance(const ClassDef *cd,const ClassDef *bcd,int level)
   if (cd==bcd) return level; 
   if (level==256)
   {
-    err("error: Internal inconsistency: found class %s seem to have a recursive "
-        "inheritance relation! Please send a bug report to dimitri@stack.nl\n",cd->name().data());
+    warn_uncond("class %s seem to have a recursive "
+        "inheritance relation!\n",cd->name().data());
     return -1;
   }
   int m=maxInheritanceDepth; 
@@ -2481,7 +2533,7 @@ Protection classInheritedProtectionLevel(ClassDef *cd,ClassDef *bcd,Protection p
   }
   if (level==256)
   {
-    err("error: Internal inconsistency: found class %s seem to have a recursive "
+    err("Internal inconsistency: found class %s seem to have a recursive "
         "inheritance relation! Please send a bug report to dimitri@stack.nl\n",cd->name().data());
   }
   else if (cd->baseClasses())
@@ -2889,11 +2941,11 @@ static bool matchArgument(const Argument *srcA,const Argument *dstA,
   stripIrrelevantConstVolatile(dstAType);
 
   // strip typename keyword
-  if (strncmp(srcAType,"typename ",9)==0)
+  if (qstrncmp(srcAType,"typename ",9)==0)
   {
     srcAType = srcAType.right(srcAType.length()-9); 
   }
-  if (strncmp(dstAType,"typename ",9)==0)
+  if (qstrncmp(dstAType,"typename ",9)==0)
   {
     dstAType = dstAType.right(dstAType.length()-9); 
   }
@@ -3802,13 +3854,13 @@ static void findMembersWithSpecificName(MemberName *mn,
     {
       bool match=TRUE;
       ArgumentList *argList=0;
-      if (args && !md->isDefine() && strcmp(args,"()")!=0)
+      if (args && !md->isDefine() && qstrcmp(args,"()")!=0)
       {
         argList=new ArgumentList;
-        LockingPtr<ArgumentList> mdAl = md->argumentList();
+        ArgumentList *mdAl = md->argumentList();
         stringToArgumentList(args,argList);
         match=matchArguments2(
-            md->getOuterScope(),fd,mdAl.pointer(),
+            md->getOuterScope(),fd,mdAl,
             Doxygen::globalScope,fd,argList,
             checkCV); 
         delete argList; argList=0;
@@ -3937,9 +3989,9 @@ bool getDefs(const QCString &scName,
         {
           //if (mmd->isLinkable())
           //{
-          LockingPtr<ArgumentList> mmdAl = mmd->argumentList();
+          ArgumentList *mmdAl = mmd->argumentList();
           bool match=args==0 || 
-            matchArguments2(mmd->getOuterScope(),mmd->getFileDef(),mmdAl.pointer(),
+            matchArguments2(mmd->getOuterScope(),mmd->getFileDef(),mmdAl,
                 fcd,fcd->getFileDef(),argList,
                 checkCV
                 );  
@@ -3964,7 +4016,7 @@ bool getDefs(const QCString &scName,
         {
           delete argList; argList=0;
         }
-        if (mdist==maxInheritanceDepth && args && strcmp(args,"()")==0)
+        if (mdist==maxInheritanceDepth && args && qstrcmp(args,"()")==0)
           // no exact match found, but if args="()" an arbitrary member will do
         {
           //printf("  >Searching for arbitrary member\n");
@@ -4022,7 +4074,7 @@ bool getDefs(const QCString &scName,
     MemberListIterator mmli(*mn);
     MemberDef *mmd, *fuzzy_mmd = 0;
     ArgumentList *argList = 0;
-    bool hasEmptyArgs = args && strcmp(args, "()") == 0;
+    bool hasEmptyArgs = args && qstrcmp(args, "()") == 0;
 
     if (args)
       stringToArgumentList(args, argList = new ArgumentList);
@@ -4037,8 +4089,8 @@ bool getDefs(const QCString &scName,
 
       QCString className = mmd->getClassDef()->name();
 
-      LockingPtr<ArgumentList> mmdAl = mmd->argumentList();
-      if (matchArguments2(mmd->getOuterScope(),mmd->getFileDef(),mmdAl.pointer(),
+      ArgumentList *mmdAl = mmd->argumentList();
+      if (matchArguments2(mmd->getOuterScope(),mmd->getFileDef(),mmdAl,
             Doxygen::globalScope,mmd->getFileDef(),argList,
             checkCV
             )
@@ -4098,13 +4150,13 @@ bool getDefs(const QCString &scName,
           { // namespace is found
             bool match=TRUE;
             ArgumentList *argList=0;
-            if (args && strcmp(args,"()")!=0)
+            if (args && qstrcmp(args,"()")!=0)
             {
               argList=new ArgumentList;
-              LockingPtr<ArgumentList> mmdAl = mmd->argumentList();
+              ArgumentList *mmdAl = mmd->argumentList();
               stringToArgumentList(args,argList);
               match=matchArguments2(
-                  mmd->getOuterScope(),mmd->getFileDef(),mmdAl.pointer(),
+                  mmd->getOuterScope(),mmd->getFileDef(),mmdAl,
                   fnd,mmd->getFileDef(),argList,
                   checkCV); 
             }
@@ -4120,7 +4172,7 @@ bool getDefs(const QCString &scName,
             }
           }
         }
-        if (!found && args && !strcmp(args,"()")) 
+        if (!found && args && !qstrcmp(args,"()")) 
           // no exact match found, but if args="()" an arbitrary 
           // member will do
         {
@@ -4171,7 +4223,7 @@ bool getDefs(const QCString &scName,
         findMembersWithSpecificName(mn,args,FALSE,currentFile,checkCV,forceTagFile,members);
       }
       //printf("found %d members\n",members.count());
-      if (members.count()!=1 && args && !strcmp(args,"()"))
+      if (members.count()!=1 && args && !qstrcmp(args,"()"))
       {
         // no exact match found, but if args="()" an arbitrary 
         // member will do
@@ -4295,12 +4347,20 @@ bool resolveRef(/* in */  const char *scName,
     bool checkScope
     )
 {
+  //printf("resolveRef(scope=%s,name=%s,inSeeBlock=%d)\n",scName,name,inSeeBlock);
   QCString tsName = name;
   //bool memberScopeFirst = tsName.find('#')!=-1;
   QCString fullName = substitute(tsName,"#","::");
-  fullName = removeRedundantWhiteSpace(substitute(fullName,".","::"));
+  if (fullName.find("anonymous_namespace{")==-1 && fullName.find('<')==-1)
+  {
+    fullName = removeRedundantWhiteSpace(substitute(fullName,".","::"));
+  }
+  else
+  {
+    fullName = removeRedundantWhiteSpace(fullName);
+  }
 
-  int bracePos=fullName.findRev('('); // reverse is needed for operator()(...)
+  int bracePos=findParameterList(fullName);
   int endNamePos=bracePos!=-1 ? bracePos : fullName.length();
   int scopePos=fullName.findRev("::",endNamePos);
   bool explicitScope = fullName.left(2)=="::" &&   // ::scope or #scope
@@ -4457,7 +4517,7 @@ QCString linkToText(SrcLangExt lang,const char *link,bool isFileName)
     // replace # by ::
     result=substitute(result,"#","::");
     // replace . by ::
-    if (!isFileName) result=substitute(result,".","::");
+    if (!isFileName && result.find('<')==-1) result=substitute(result,".","::");
     // strip leading :: prefix if present
     if (result.at(0)==':' && result.at(1)==':')
     {
@@ -4559,6 +4619,7 @@ bool resolveLink(/* in */ const char *scName,
   ClassDef *cd;
   DirDef   *dir;
   NamespaceDef *nd;
+  SectionInfo *si=0;
   bool ambig;
   if (linkRef.isEmpty()) // no reference name!
   {
@@ -4569,7 +4630,6 @@ bool resolveLink(/* in */ const char *scName,
     GroupDef *gd = pd->getGroupDef();
     if (gd)
     {
-      SectionInfo *si=0;
       if (!pd->name().isEmpty()) si=Doxygen::sectionDict->find(pd->name());
       *resContext=gd;
       if (si) resAnchor = si->label;
@@ -4580,6 +4640,12 @@ bool resolveLink(/* in */ const char *scName,
     }
     return TRUE;
   }
+  else if ((si=Doxygen::sectionDict->find(linkRef)))
+  {
+    *resContext=si->definition;
+    resAnchor = si->label;
+    return TRUE;
+  }
   else if ((pd=Doxygen::exampleSDict->find(linkRef))) // link to an example
   {
     *resContext=pd;
@@ -5440,7 +5506,7 @@ QCString convertToJSString(const char *s)
     }
   }
   growBuf.addChar(0);
-  return growBuf.get();
+  return convertCharEntitiesToUTF8(growBuf.get());
 }
 
 
@@ -5587,25 +5653,32 @@ QCString convertCharEntitiesToUTF8(const QCString &s)
     init=FALSE;
   }
 
-  if (s==0) return result;
+  if (s.length()==0) return result;
+  static GrowBuf growBuf;
+  growBuf.clear();
   int p,i=0,l;
   while ((p=entityPat.match(s,i,&l))!=-1)
   {
-    if (p>i) result+=s.mid(i,p-i);
+    if (p>i) 
+    {
+      growBuf.addStr(s.mid(i,p-i));
+    }
     QCString entity = s.mid(p+1,l-2);
     char *code = entityMap.find(entity);
     if (code)
     {
-      result+=code;
+      growBuf.addStr(code);
     }
     else
     {
-      result+=s.mid(p,l);
+      growBuf.addStr(s.mid(p,l));
     }
     i=p+l;
   }
-  result+=s.mid(i,s.length()-i);
-  return result;
+  growBuf.addStr(s.mid(i,s.length()-i));
+  growBuf.addChar(0);
+  //printf("convertCharEntitiesToUTF8(%s)->%s\n",s.data(),growBuf.get());
+  return growBuf.get();
 }
 
 /*! Returns the standard string that is generated when the \\overload
@@ -5633,7 +5706,7 @@ void addMembersToMemberGroup(MemberList *ml,
   {
     if (md->isEnumerate()) // insert enum value of this enum into groups
     {
-      LockingPtr<MemberList> fmdl=md->enumFieldList();
+      MemberList *fmdl=md->enumFieldList();
       if (fmdl!=0)
       {
         MemberDef *fmd=fmdl->first();
@@ -6152,9 +6225,12 @@ PageDef *addRelatedPage(const char *name,const QCString &ptitle,
     if (tagInfo)
     {
       pd->setReference(tagInfo->tagName);
+      pd->setFileName(tagInfo->fileName);
+    }
+    else
+    {
+      pd->setFileName(convertNameToFile(pd->name(),FALSE,TRUE));
     }
-
-    pd->setFileName(convertNameToFile(pd->name(),FALSE,TRUE));
 
     //printf("Appending page `%s'\n",baseName.data());
     Doxygen::pageSDict->append(baseName,pd);
@@ -6195,7 +6271,7 @@ void addRefItem(const QList<ListItemInfo> *sli,
     const char *prefix, const char *name,const char *title,const char *args)
 {
   //printf("addRefItem(sli=%p,key=%s,prefix=%s,name=%s,title=%s,args=%s)\n",sli,key,prefix,name,title,args);
-  if (sli)
+  if (sli && key && key[0]!='@') // check for @ to skip anonymous stuff (see bug427012)
   {
     QListIterator<ListItemInfo> slii(*sli);
     ListItemInfo *lii;
@@ -6230,8 +6306,8 @@ void addRefItem(const QList<ListItemInfo> *sli,
 
 void addGroupListToTitle(OutputList &ol,Definition *d)
 {
-  LockingPtr<GroupList> groups = d->partOfGroups();
-  if (groups!=0) // write list of group to which this definition belongs
+  GroupList *groups = d->partOfGroups();
+  if (groups) // write list of group to which this definition belongs
   {
     ol.pushGeneratorState();
     ol.disableAllBut(OutputGenerator::Html);
@@ -6408,6 +6484,11 @@ QCString stripPath(const char *s)
   {
     result=result.mid(i+1);
   }
+  i=result.findRev('\\');
+  if (i!=-1)
+  {
+    result=result.mid(i+1);
+  }
   return result;
 }
 
@@ -6712,6 +6793,24 @@ bool checkIfTypedef(Definition *scope,FileDef *fileScope,const char *n)
     return FALSE;
 }
 
+const char *writeUtf8Char(FTextStream &t,const char *s)
+{
+  char c=*s++;
+  t << c;
+  if (c<0) // multibyte character
+  {
+    t << *s++;
+    if (((uchar)c&0xE0)==0xE0)
+    {
+      t << *s++; // 111x.xxxx: >=3 byte character
+    }
+    if (((uchar)c&0xF0)==0xF0)
+    {
+      t << *s++; // 1111.xxxx: 4 byte character
+    }
+  }
+  return s;
+}
 
 int nextUtf8CharPosition(const QCString &utf8Str,int len,int startPos)
 {
@@ -7065,7 +7164,7 @@ void writeTypeConstraints(OutputList &ol,Definition *d,ArgumentList *al)
     linkifyText(TextGeneratorOLImpl(ol),d,0,0,a->type);
     ol.endConstraintType();
     ol.startConstraintDocs();
-    ol.parseDoc(d->docFile(),d->docLine(),d,0,a->docs,TRUE,FALSE);
+    ol.generateDoc(d->docFile(),d->docLine(),d,0,a->docs,TRUE,FALSE);
     ol.endConstraintDocs();
   }
   ol.endConstraintList();
@@ -7108,7 +7207,7 @@ static int transcodeCharacterBuffer(const char *fileName,BufStr &srcBuf,int size
   void *cd = portable_iconv_open(outputEncoding,inputEncoding);
   if (cd==(void *)(-1)) 
   {
-    err("error: unsupported character conversion: '%s'->'%s': %s\n"
+    err("unsupported character conversion: '%s'->'%s': %s\n"
         "Check the INPUT_ENCODING setting in the config file!\n",
         inputEncoding,outputEncoding,strerror(errno));
     exit(1);
@@ -7129,7 +7228,7 @@ static int transcodeCharacterBuffer(const char *fileName,BufStr &srcBuf,int size
   }
   else
   {
-    err("%s: error: failed to translate characters from %s to %s: check INPUT_ENCODING\n",
+    err("%s: failed to translate characters from %s to %s: check INPUT_ENCODING\n",
         fileName,inputEncoding,outputEncoding);
     exit(1);
   }
@@ -7153,7 +7252,7 @@ bool readInputFile(const char *fileName,BufStr &inBuf)
     QFile f(fileName);
     if (!f.open(IO_ReadOnly))
     {
-      err("error: could not open file %s\n",fileName);
+      err("could not open file %s\n",fileName);
       return FALSE;
     }
     size=fi.size();
@@ -7161,7 +7260,7 @@ bool readInputFile(const char *fileName,BufStr &inBuf)
     inBuf.skip(size);
     if (f.readBlock(inBuf.data()/*+oldPos*/,size)!=size)
     {
-      err("error: problems while reading file %s\n",fileName);
+      err("problems while reading file %s\n",fileName);
       return FALSE;
     }
   }
@@ -7172,7 +7271,7 @@ bool readInputFile(const char *fileName,BufStr &inBuf)
     FILE *f=portable_popen(cmd,"r");
     if (!f)
     {
-      err("error: could not execute filter %s\n",filterName.data());
+      err("could not execute filter %s\n",filterName.data());
       return FALSE;
     }
     const int bufSize=1024;
@@ -7438,13 +7537,13 @@ bool copyFile(const QCString &src,const QCString &dest)
     }
     else
     {
-      err("error: could not write to file %s\n",dest.data());
+      err("could not write to file %s\n",dest.data());
       return FALSE;
     }
   }
   else
   {
-    err("error: could not open user specified file %s\n",src.data());
+    err("could not open user specified file %s\n",src.data());
     return FALSE;
   }
   return TRUE;
@@ -7638,3 +7737,46 @@ bool fileVisibleInIndex(FileDef *fd,bool &genSourceFile)
          );
 }
 
+void addDocCrossReference(MemberDef *src,MemberDef *dst)
+{
+  static bool referencedByRelation = Config_getBool("REFERENCED_BY_RELATION");
+  static bool referencesRelation   = Config_getBool("REFERENCES_RELATION");
+  static bool callerGraph          = Config_getBool("CALLER_GRAPH");
+  static bool callGraph            = Config_getBool("CALL_GRAPH");
+
+  //printf("--> addDocCrossReference src=%s,dst=%s\n",src->name().data(),dst->name().data());
+  if (dst->isTypedef() || dst->isEnumerate()) return; // don't add types
+  if ((referencedByRelation || callerGraph || dst->hasCallerGraph()) && 
+      src->showInCallGraph()
+     )
+  {
+    dst->addSourceReferencedBy(src);
+    MemberDef *mdDef = dst->memberDefinition();
+    if (mdDef)
+    {
+      mdDef->addSourceReferencedBy(src);
+    }
+    MemberDef *mdDecl = dst->memberDeclaration();
+    if (mdDecl)
+    {
+      mdDecl->addSourceReferencedBy(src);
+    }
+  }
+  if ((referencesRelation || callGraph || src->hasCallGraph()) && 
+      src->showInCallGraph()
+     )
+  {
+    src->addSourceReferences(dst);
+    MemberDef *mdDef = src->memberDefinition();
+    if (mdDef)
+    {
+      mdDef->addSourceReferences(dst);
+    }
+    MemberDef *mdDecl = src->memberDeclaration();
+    if (mdDecl)
+    {
+      mdDecl->addSourceReferences(dst);
+    }
+  }
+}
+
index c324723..e19e829 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -380,6 +380,7 @@ bool patternMatch(const QFileInfo &fi,const QStrList *patList);
 QCString externalLinkTarget();
 QCString externalRef(const QCString &relPath,const QCString &ref,bool href);
 int nextUtf8CharPosition(const QCString &utf8Str,int len,int startPos);
+const char *writeUtf8Char(FTextStream &t,const char *s);
 
 /** Data associated with a HSV colored image. */
 struct ColoredImgDataItem
@@ -407,5 +408,7 @@ QCString stripIndentation(const QCString &s);
 
 bool fileVisibleInIndex(FileDef *fd,bool &genSourceFile);
 
+void addDocCrossReference(MemberDef *src,MemberDef *dst);
+
 #endif
 
index 4752520..9d523c1 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index b3d24d1..8e20419 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -412,7 +412,7 @@ static void writeMultiLineCodeLink(CodeOutputInterface &ol,
 static void setParameterList(MemberDef *md)
 {
   g_classScope = md->getClassDef() ? md->getClassDef()->name().data() : "";
-  LockingPtr<ArgumentList> al = md->argumentList();
+  ArgumentList *al = md->argumentList();
   if (al==0) return; 
   Argument *a = al->first();
   while (a)
@@ -450,7 +450,6 @@ static void generateFuncLink(CodeOutputInterface &ol,MemberDef* mdef)
     addToSearchIndex(memberName);
     return;
   }
-  ol.linkableSymbol(g_yyLineNr,memberName,0,g_currentMemberDef?g_currentMemberDef:g_currentDefinition);
   codifyLines(memberName.data());
   addToSearchIndex(memberName);
 } // generateFuncLink
@@ -493,7 +492,6 @@ static void generateMemLink(CodeOutputInterface &ol,QCString &clName,QCString& m
     return;
   }
   // nothing found, just write out the word
-  ol.linkableSymbol(g_yyLineNr,memberName,0,g_currentMemberDef?g_currentMemberDef:g_currentDefinition);
   codifyLines(memberName.data());
   addToSearchIndex(memberName);
 }// generateMemLink
@@ -521,10 +519,6 @@ static void generateClassOrGlobalLink(CodeOutputInterface &ol,const char *clName
       //{
       //  temp=VhdlDocGen::getClassName(cd);
       //}
-      ol.linkableSymbol(g_yyLineNr,temp,cd,
-                        g_currentMemberDef ? 
-                       g_currentMemberDef : 
-                       g_currentDefinition);
       writeMultiLineCodeLink(ol,cd->getReference(),
                                cd->getOutputFileBase(),
                                cd->anchor(),
@@ -545,7 +539,6 @@ static void generateClassOrGlobalLink(CodeOutputInterface &ol,const char *clName
   }
 
   // nothing found, just write out the word
-  ol.linkableSymbol(g_yyLineNr,clName,0,g_currentMemberDef?g_currentMemberDef:g_currentDefinition);
   codifyLines(clName);
   addToSearchIndex(clName);
 }// generateClasss or global link
@@ -1515,7 +1508,7 @@ void parseVhdlCode(CodeOutputInterface &od,const char *className,const QCString
   if (memberDef)
   {
     ClassDef *dd=memberDef->getClassDef();
-    if (dd) g_CurrClass=dd->className();
+    if (dd) g_CurrClass=dd->name();
     startLine--;
   }
   resetVhdlCodeParserState();
@@ -1573,7 +1566,7 @@ void parseVhdlCode(CodeOutputInterface &od,const char *className,const QCString
   {
     setParameterList(memberDef);
   }
-  int iLine=countLines();
+  /*int iLine=*/countLines();
   vhdlcodeYYrestart( vhdlcodeYYin );
   BEGIN( Bases );
   vhdlcodeYYlex();
@@ -1588,7 +1581,7 @@ void parseVhdlCode(CodeOutputInterface &od,const char *className,const QCString
     delete g_sourceFileDef;
     g_sourceFileDef=0;
   }
-  assert(g_yyLineNr==iLine);
   return;
 }
 
index 0a0141f..8545c90 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby
 #include <qcstring.h>
 #include <qfileinfo.h>
 #include <qstringlist.h>
+
+#ifdef DEBUGFLOW
+#include <qmap.h>
+#endif
+
 /* --------------------------------------------------------------- */
 
 // local includes
@@ -95,12 +100,11 @@ const MemberDef* VhdlDocGen::getFlowMember()
 //--------------------------------------------------------------------------------------------------
 static void codify(FTextStream &t,const char *str)
 {
-
   if (str)
   { 
     const char *p=str;
     char c;
-      while (*p)
+    while (*p)
     {
       c=*p++;
       switch(c)
@@ -122,6 +126,38 @@ static void codify(FTextStream &t,const char *str)
   }
 }
 
+static void writeLink(const MemberDef* mdef,OutputList &ol)
+{
+  ol.writeObjectLink(mdef->getReference(),
+      mdef->getOutputFileBase(),
+      mdef->anchor(),
+      mdef->name());
+}
+
+static void startFonts(const QCString& q, const char *keyword,OutputList& ol)
+{
+  ol.startFontClass(keyword);
+  ol.docify(q.data());
+  ol.endFontClass();
+}
+
+static QCString splitString(QCString& str,char c)
+{
+  QCString n=str;
+  int i=str.find(c);
+  if (i>0)
+  {
+    n=str.left(i);
+    str=str.remove(0,i+1);
+  }
+  return n;
+}
+
+static int compareString(const QCString& s1,const QCString& s2)
+{
+  return qstricmp(s1.stripWhiteSpace(),s2.stripWhiteSpace());
+}
+
 static void createSVG()
 {
     QCString ov =Config_getString("HTML_OUTPUT");
@@ -330,7 +366,7 @@ static void writeColumn(FTextStream &t,MemberDef *md,bool start)
   QCString toolTip;
 
   static QRegExp reg("[%]");
-  bool bidir=(md!=0 &&( stricmp(md->typeString(),"inout")==0));
+  bool bidir=(md!=0 &&( qstricmp(md->typeString(),"inout")==0));
 
   if (md)
   {
@@ -766,7 +802,7 @@ MemberDef* VhdlDocGen::findMemberDef(ClassDef* cd,const QCString& key,MemberList
 
   for (fmni.toFirst();(md=fmni.current());++fmni)
   {
-    if (stricmp(key.data(),md->name().data())==0)
+    if (qstricmp(key,md->name())==0)
     {
       return md;
     }
@@ -838,13 +874,13 @@ MemberDef* VhdlDocGen::findFunction(const QList<Argument> &ql,
     for (fmni.toFirst();(mdef=fmni.current());++fmni)
     {
       QCString mname=mdef->name();
-      if ((VhdlDocGen::isProcedure(mdef) || VhdlDocGen::isVhdlFunction(mdef)) && (VhdlDocGen::compareString(funcname,mname)==0))
+      if ((VhdlDocGen::isProcedure(mdef) || VhdlDocGen::isVhdlFunction(mdef)) && (compareString(funcname,mname)==0))
       {
-        LockingPtr<ArgumentList> alp = mdef->argumentList();
+        ArgumentList *alp = mdef->argumentList();
 
         //  ArgumentList* arg2=mdef->getArgumentList();
         if (alp==0) break;
-        ArgumentListIterator ali(*alp.pointer());
+        ArgumentListIterator ali(*alp);
         ArgumentListIterator ali1(ql);
 
         if (ali.count() != ali1.count()) break;
@@ -855,18 +891,18 @@ MemberDef* VhdlDocGen::findFunction(const QList<Argument> &ql,
         for (;(arg=ali.current());++ali)
         {
           arg1=ali1.current(); ++ali1;
-          equ+=abs(VhdlDocGen::compareString(arg->type,arg1->type));
+          equ+=abs(compareString(arg->type,arg1->type));
 
           QCString s1=arg->type;
           QCString s2=arg1->type;
           VhdlDocGen::deleteAllChars(s1,' ');
           VhdlDocGen::deleteAllChars(s2,' ');
-          equ+=abs(VhdlDocGen::compareString(s1,s2));
+          equ+=abs(compareString(s1,s2));
           s1=arg->attrib;
           s2=arg1->attrib;
           VhdlDocGen::deleteAllChars(s1,' ');
           VhdlDocGen::deleteAllChars(s2,' ');
-          equ+=abs(VhdlDocGen::compareString(s1,s2));
+          equ+=abs(compareString(s1,s2));
           // printf("\n 1. type [%s] name [%s] attrib [%s]",arg->type,arg->name,arg->attrib);
           // printf("\n 2. type [%s] name [%s] attrib [%s]",arg1->type,arg1->name,arg1->attrib);
         } // for
@@ -1003,9 +1039,9 @@ void VhdlDocGen::findAllArchitectures(QList<QCString>& qll,const ClassDef *cd)
     {
       QStringList ql=QStringList::split("-",jj,FALSE);
       QCString temp=ql[1].utf8();
-      if (stricmp(cd->className().data(),temp.data())==0)
+      if (qstricmp(cd->className(),temp)==0)
       {
-        QCString *cl=new QCString(jj.data());
+        QCString *cl=new QCString(jj);
         qll.insert(0,cl);
       }
     }
@@ -1057,14 +1093,6 @@ void VhdlDocGen::writeVhdlLink(const ClassDef* ccd ,OutputList& ol,QCString& typ
   ol.lineBreak();
 }
 
-bool VhdlDocGen::compareString(const QCString& s1,const QCString& s2)
-{
-  QCString str1=s1.stripWhiteSpace();
-  QCString str2=s2.stripWhiteSpace();
-
-  return stricmp(str1.data(),str2.data());
-}
-
 
 /*!
  * strips the "--" prefixes of vhdl comments
@@ -1078,7 +1106,7 @@ void VhdlDocGen::prepareComment(QCString& qcs)
   {
     index=qcs.find(s,0,TRUE);
     if (index<0) break;
-    qcs=qcs.remove(index,strlen(s));
+    qcs=qcs.remove(index,qstrlen(s));
   }
   qcs=qcs.stripWhiteSpace();
 }
@@ -1176,7 +1204,7 @@ QCString VhdlDocGen::getProtectionName(int prot)
   return "";
 }
 
-QCString VhdlDocGen::trTypeString(int type)
+QCString VhdlDocGen::trTypeString(uint64 type)
 {
   switch(type)
   {
@@ -1295,16 +1323,16 @@ void VhdlDocGen::writeFormatString(const QCString& s,OutputList&ol,const MemberD
       find=find.left(j);
       buf[0]=temp[j];
       ss=VhdlDocGen::findKeyWord(find);
-      bool k=VhdlDocGen::isNumber(find); // is this a number
+      bool k=isNumber(find); // is this a number
       if (k)
       {
         ol.docify(" ");
-        VhdlDocGen::startFonts(find,"vhdldigit",ol);
+        startFonts(find,"vhdldigit",ol);
         ol.docify(" ");
       }
       else if (j != 0 && ss)
       {
-        VhdlDocGen::startFonts(find,ss->data(),ol);
+        startFonts(find,ss->data(),ol);
       }
       else
       {
@@ -1313,7 +1341,7 @@ void VhdlDocGen::writeFormatString(const QCString& s,OutputList&ol,const MemberD
           VhdlDocGen::writeStringLink(mdef,find,ol);
         }
       }
-      VhdlDocGen::startFonts(&buf[0],"vhdlchar",ol);
+      startFonts(&buf[0],"vhdlchar",ol);
 
       QCString st=temp.remove(0,j+1);
       find=st;
@@ -1323,7 +1351,7 @@ void VhdlDocGen::writeFormatString(const QCString& s,OutputList&ol,const MemberD
         if (ii>1)
         {
           QCString com=find.left(ii+1);
-          VhdlDocGen::startFonts(com,"keyword",ol);
+          startFonts(com,"keyword",ol);
           temp=find.remove(0,ii+1);
         }
       }
@@ -1336,7 +1364,7 @@ void VhdlDocGen::writeFormatString(const QCString& s,OutputList&ol,const MemberD
   }//if
   else
   {
-    VhdlDocGen::startFonts(find,"vhdlchar",ol);
+    startFonts(find,"vhdlchar",ol);
   }
   ol.endBold();
 }// writeFormatString
@@ -1344,7 +1372,6 @@ void VhdlDocGen::writeFormatString(const QCString& s,OutputList&ol,const MemberD
 /*!
  * returns TRUE if this string is a number
  */
-
 bool VhdlDocGen::isNumber(const QCString& s)
 {
   static QRegExp regg("[0-9][0-9eEfFbBcCdDaA_.#-+?xXzZ]*");
@@ -1357,12 +1384,6 @@ bool VhdlDocGen::isNumber(const QCString& s)
 
 }// isNumber
 
-void VhdlDocGen::startFonts(const QCString& q, const char *keyword,OutputList& ol)
-{
-  ol.startFontClass(keyword);
-  ol.docify(q.data());
-  ol.endFontClass();
-}
 
 /*!
  * inserts white spaces for  better readings
@@ -1452,16 +1473,18 @@ void VhdlDocGen::writeProcedureProto(OutputList& ol,const ArgumentList* al,const
     arg->defval+=" ";
     if (str)
     {
-      VhdlDocGen::startFonts(arg->defval,str->data(),ol);
+      startFonts(arg->defval,str->data(),ol);
     }
     else
     {
-      VhdlDocGen::startFonts(arg->defval,"vhdlchar",ol); // write type (variable,constant etc.)
+      startFonts(arg->defval,"vhdlchar",ol); // write type (variable,constant etc.)
     }
 
-    VhdlDocGen::startFonts(nn,"vhdlchar",ol); // write name
-    if (stricmp(arg->attrib.data(),arg->type.data()) != 0)
-      VhdlDocGen::startFonts(arg->attrib.lower(),"stringliteral",ol); // write in|out
+    startFonts(nn,"vhdlchar",ol); // write name
+    if (qstricmp(arg->attrib,arg->type) != 0)
+    {
+      startFonts(arg->attrib.lower(),"stringliteral",ol); // write in|out
+    }
     ol.docify(" ");
     VhdlDocGen::formatString(arg->type,ol,mdef);
     sem=TRUE;
@@ -1517,23 +1540,23 @@ void VhdlDocGen::writeFunctionProto(OutputList& ol,const ArgumentList* al,const
       if (str)
         VhdlDocGen::formatString(att,ol,mdef);
       else
-        VhdlDocGen::startFonts(att,"vhdlchar",ol);
+        startFonts(att,"vhdlchar",ol);
     }
 
     QCString nn=arg->name;
     nn+=": ";
     QCString ss=arg->type.stripWhiteSpace(); //.lower();
     QCString w=ss.stripWhiteSpace();//.upper();
-    VhdlDocGen::startFonts(nn,"vhdlchar",ol);
-    VhdlDocGen::startFonts("in ","stringliteral",ol);
+    startFonts(nn,"vhdlchar",ol);
+    startFonts("in ","stringliteral",ol);
     QCString *str=VhdlDocGen::findKeyWord(ss);
     if (str)
       VhdlDocGen::formatString(w,ol,mdef);
     else
-      VhdlDocGen::startFonts(w,"vhdlchar",ol);
+      startFonts(w,"vhdlchar",ol);
 
     if (arg->attrib)
-      VhdlDocGen::startFonts(arg->attrib,"vhdlchar",ol);
+      startFonts(arg->attrib,"vhdlchar",ol);
 
 
     sem=TRUE;
@@ -1577,7 +1600,7 @@ void VhdlDocGen::writeProcessProto(OutputList& ol,const ArgumentList* al,const M
       ol.docify(" , ");
     }
     QCString nn=arg->name;
-    // VhdlDocGen::startFonts(nn,"vhdlchar",ol);
+    // startFonts(nn,"vhdlchar",ol);
     VhdlDocGen::writeFormatString(nn,ol,mdef);
     sem=TRUE;
   }
@@ -1761,27 +1784,27 @@ static void setGlobalType(MemberList *ml)
   {
     QCString l=mdd->typeString();
 
-    if (strcmp(mdd->argsString(),"package")==0)
+    if (qstrcmp(mdd->argsString(),"package")==0)
     {
        mdd->setMemberSpecifiers(VhdlDocGen::INSTANTIATION);
     }
-    else if (strcmp(mdd->argsString(),"configuration")==0)
+    else if (qstrcmp(mdd->argsString(),"configuration")==0)
     {
       mdd->setMemberSpecifiers(VhdlDocGen::CONFIG);
     }
-    else if (strcmp(mdd->typeString(),"library")==0)
+    else if (qstrcmp(mdd->typeString(),"library")==0)
     {
       mdd->setMemberSpecifiers(VhdlDocGen::LIBRARY);
     }
-    else if (strcmp(mdd->typeString(),"use")==0)
+    else if (qstrcmp(mdd->typeString(),"use")==0)
     {
       mdd->setMemberSpecifiers(VhdlDocGen::USE);
     }
-    else if (stricmp(mdd->typeString(),"misc")==0)
+    else if (qstricmp(mdd->typeString(),"misc")==0)
     {
       mdd->setMemberSpecifiers(VhdlDocGen::MISCELLANEOUS);
     }
-    else if (stricmp(mdd->typeString(),"ucf_const")==0)
+    else if (qstricmp(mdd->typeString(),"ucf_const")==0)
     {
       mdd->setMemberSpecifiers(VhdlDocGen::UCF_CONST);
     }
@@ -1821,7 +1844,7 @@ bool VhdlDocGen::writeVHDLTypeDocumentation(const MemberDef* mdef, const Definit
       ol.docify(" ");
     }
     ol.docify(mdef->name());
-    hasParams = VhdlDocGen::writeFuncProcDocu(mdef,ol, mdef->argumentList().pointer());
+    hasParams = VhdlDocGen::writeFuncProcDocu(mdef,ol, mdef->argumentList());
   }
 
 
@@ -1880,7 +1903,6 @@ void VhdlDocGen::writeVHDLDeclaration(MemberDef* mdef,OutputList &ol,
     bool /*inGroup*/)
 {
   static QRegExp reg("[%]");
-  LockingPtr<MemberDef> lock(mdef,mdef);
 
   Definition *d=0;
 
@@ -1939,9 +1961,9 @@ void VhdlDocGen::writeVHDLDeclaration(MemberDef* mdef,OutputList &ol,
     Doxygen::tagFile << "      <anchor>" << convertToXML(mdef->anchor()) << "</anchor>" << endl;
 
     if (VhdlDocGen::isVhdlFunction(mdef))
-      Doxygen::tagFile << "      <arglist>" << convertToXML(VhdlDocGen::convertArgumentListToString(mdef->argumentList().pointer(),TRUE)) << "</arglist>" << endl;
+      Doxygen::tagFile << "      <arglist>" << convertToXML(VhdlDocGen::convertArgumentListToString(mdef->argumentList(),TRUE)) << "</arglist>" << endl;
     else if (VhdlDocGen::isProcedure(mdef))
-      Doxygen::tagFile << "      <arglist>" << convertToXML(VhdlDocGen::convertArgumentListToString(mdef->argumentList().pointer(),FALSE)) << "</arglist>" << endl;
+      Doxygen::tagFile << "      <arglist>" << convertToXML(VhdlDocGen::convertArgumentListToString(mdef->argumentList(),FALSE)) << "</arglist>" << endl;
     else
       Doxygen::tagFile << "      <arglist>" << convertToXML(mdef->argsString()) << "</arglist>" << endl;
 
@@ -1971,6 +1993,10 @@ void VhdlDocGen::writeVHDLDeclaration(MemberDef* mdef,OutputList &ol,
   // start a new member declaration
   bool isAnonymous = annoClassDef; // || m_impl->annMemb || m_impl->annEnumType;
   ///printf("startMemberItem for %s\n",name().data());
+  int mm=mdef->getMemberSpecifiers();
+  if (mm==VhdlDocGen::MISCELLANEOUS)
+      isAnonymous=TRUE;
+
   ol.startMemberItem( mdef->anchor(), isAnonymous ); //? 1 : m_impl->tArgList ? 3 : 0);
 
   // If there is no detailed description we need to write the anchor here.
@@ -1996,19 +2022,18 @@ void VhdlDocGen::writeVHDLDeclaration(MemberDef* mdef,OutputList &ol,
   ltype=ltype.replace(reg," ");
   QCString largs(mdef->argsString());
   largs=largs.replace(reg," ");
-  int mm=mdef->getMemberSpecifiers();
   mdef->setType(ltype.data());
   mdef->setArgsString(largs.data());
   //ClassDef * plo=mdef->getClassDef();
   ClassDef *kl=0;
-  LockingPtr<ArgumentList> alp = mdef->argumentList();
+  ArgumentList *alp = mdef->argumentList();
   QCString nn;
   //VhdlDocGen::adjustRecordMember(mdef);
   if (gd) gd=0;
-  switch(mm)
+  switch (mm)
   {
     case VhdlDocGen::MISCELLANEOUS:
-      VhdlDocGen::writeCodeFragment(mdef,ol);
+      VhdlDocGen::writeSource(mdef,ol,nn);
       break;
     case VhdlDocGen::PROCEDURE:
     case VhdlDocGen::FUNCTION:
@@ -2020,10 +2045,10 @@ void VhdlDocGen::writeVHDLDeclaration(MemberDef* mdef,OutputList &ol,
 
       writeLink(mdef,ol);
       if (alp!=0 && mm==VhdlDocGen::FUNCTION)
-        VhdlDocGen::writeFunctionProto(ol,alp.pointer(),mdef);
+        VhdlDocGen::writeFunctionProto(ol,alp,mdef);
 
       if (alp!=0 && mm==VhdlDocGen::PROCEDURE)
-        VhdlDocGen::writeProcedureProto(ol,alp.pointer(),mdef);
+        VhdlDocGen::writeProcedureProto(ol,alp,mdef);
 
       break;
     case VhdlDocGen::USE:
@@ -2086,7 +2111,7 @@ void VhdlDocGen::writeVHDLDeclaration(MemberDef* mdef,OutputList &ol,
     case VhdlDocGen::PROCESS:
       writeLink(mdef,ol);
       ol.insertMemberAlign();
-      VhdlDocGen::writeProcessProto(ol,alp.pointer(),mdef);
+      VhdlDocGen::writeProcessProto(ol,alp,mdef);
       break;
     case VhdlDocGen::PACKAGE:
     case VhdlDocGen::ENTITY:
@@ -2182,17 +2207,13 @@ void VhdlDocGen::writeVHDLDeclaration(MemberDef* mdef,OutputList &ol,
       bRec=largs.stripPrefix("record") ;
       bUnit=largs.stripPrefix("units") ;
       ol.startBold();
-      if (bRec)
-        ol.docify("record: ");
-      if (bUnit)
-        ol.docify("units: ");
+      if (bRec)  ol.docify("record: ");
+      if (bUnit) ol.docify("units: ");
       writeLink(mdef,ol);
       ol.insertMemberAlign();
-      if (!bRec)
-        VhdlDocGen::formatString(ltype,ol,mdef);
+      if (!bRec) VhdlDocGen::formatString(ltype,ol,mdef);
       if (bUnit) ol.lineBreak();
-      if (bRec || bUnit)
-        writeRecorUnit(largs,ol,mdef);
+      if (bRec || bUnit) writeRecorUnit(largs,ol,mdef);
       ol.endBold();
       break;
 
@@ -2222,7 +2243,7 @@ void VhdlDocGen::writeVHDLDeclaration(MemberDef* mdef,OutputList &ol,
   if (!mdef->briefDescription().isEmpty() &&   Config_getBool("BRIEF_MEMBER_DESC") /* && !annMemb */)
   {
     ol.startMemberDescription(mdef->anchor());
-    ol.parseDoc(mdef->briefFile(),mdef->briefLine(),
+    ol.generateDoc(mdef->briefFile(),mdef->briefLine(),
         mdef->getOuterScope()?mdef->getOuterScope():d,
         mdef,mdef->briefDescription(),TRUE,FALSE,0,TRUE,FALSE);
     if (detailsVisible)
@@ -2251,14 +2272,6 @@ void VhdlDocGen::writeVHDLDeclaration(MemberDef* mdef,OutputList &ol,
 }// end writeVhdlDeclaration
 
 
-void VhdlDocGen::writeLink(const MemberDef* mdef,OutputList &ol)
-{
-  ol.writeObjectLink(mdef->getReference(),
-      mdef->getOutputFileBase(),
-      mdef->anchor(),
-      mdef->name());
-}
-
 void VhdlDocGen::writePlainVHDLDeclarations(
     MemberList* mlist,OutputList &ol,
     ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd,int specifier)
@@ -2266,8 +2279,6 @@ void VhdlDocGen::writePlainVHDLDeclarations(
 
   SDict<QCString> pack(1009);
 
-  ol.pushGeneratorState();
-
   bool first=TRUE;
   MemberDef *md;
   MemberListIterator mli(*mlist);
@@ -2293,7 +2304,7 @@ void VhdlDocGen::writePlainVHDLDeclarations(
   pack.clear();
 }//plainDeclaration
 
-bool VhdlDocGen::membersHaveSpecificType(MemberList *ml,int type)
+static bool membersHaveSpecificType(MemberList *ml,uint64 type)
 {
   if (ml==0) return FALSE;
   MemberDef *mdd=0;
@@ -2338,7 +2349,7 @@ void VhdlDocGen::writeVHDLDeclarations(MemberList* ml,OutputList &ol,
   if (subtitle && subtitle[0]!=0)
   {
     ol.startMemberSubtitle();
-    ol.parseDoc("[generated]",-1,0,0,subtitle,FALSE,FALSE,0,TRUE,FALSE);
+    ol.generateDoc("[generated]",-1,0,0,subtitle,FALSE,FALSE,0,TRUE,FALSE);
     ol.endMemberSubtitle();
   } //printf("memberGroupList=%p\n",memberGroupList);
 
@@ -2364,7 +2375,7 @@ void VhdlDocGen::writeVHDLDeclarations(MemberList* ml,OutputList &ol,
         {
           //printf("Member group has docs!\n");
           ol.startMemberGroupDocs();
-          ol.parseDoc("[generated]",-1,0,0,mg->documentation()+"\n",FALSE,FALSE);
+          ol.generateDoc("[generated]",-1,0,0,mg->documentation()+"\n",FALSE,FALSE);
           ol.endMemberGroupDocs();
         }
         ol.startMemberGroup();
@@ -2381,7 +2392,6 @@ void VhdlDocGen::writeVHDLDeclarations(MemberList* ml,OutputList &ol,
 bool VhdlDocGen::writeClassType( ClassDef *& cd,
     OutputList &ol ,QCString & cname)
 {
   int id=cd->protection();
   QCString qcs = VhdlDocGen::trTypeString(id+2);
   cname=VhdlDocGen::getClassName(cd);
@@ -2393,7 +2403,7 @@ bool VhdlDocGen::writeClassType( ClassDef *& cd,
   return FALSE;
 }// writeClassLink
 
-QCString VhdlDocGen::trVhdlType(int type,bool sing)
+QCString VhdlDocGen::trVhdlType(uint64 type,bool sing)
 {
   switch(type)
   {
@@ -2537,53 +2547,56 @@ void VhdlDocGen::writeStringLink(const MemberDef *mdef,QCString mem, OutputList&
       }
     }
   }
-  VhdlDocGen::startFonts(mem,"vhdlchar",ol);
+  startFonts(mem,"vhdlchar",ol);
 }// found component
 
-void VhdlDocGen::writeCodeFragment( MemberDef *mdef,OutputList& ol)
+
+
+void VhdlDocGen::writeSource(MemberDef *mdef,OutputList& ol,QCString & cname)
 {
+  ParserInterface *pIntf = Doxygen::parserManager->getParser(".vhd");
+  pIntf->resetCodeParserState();
+   
   QCString codeFragment=mdef->documentation();
-  QStringList qsl=QStringList::split("\n",codeFragment);
-  writeLink(mdef,ol);
-  ol.docify(" ");
-  ol.insertMemberAlign();
-  int len= qsl.count();
-  for(int j=0;j<len;j++)
+
+  if (cname.isEmpty()) 
   {
-    QCString q=qsl[j].utf8();
-    VhdlDocGen::writeFormatString(q,ol,mdef);
-    ol.lineBreak();
-    if (j==2) // only the first three lines are shown
+    writeLink(mdef,ol);
+    int fi=0;
+    int j=0;
+    do 
     {
-      q = "...";
-      VhdlDocGen::writeFormatString(q,ol,mdef);
-      break;
+     fi=codeFragment.find("\n",++fi);
+    } while(fi>=0 && j++ <3);
+   
+    // show only the first four lines 
+    if (j==4)
+    {
+      codeFragment=codeFragment.left(fi);
+      codeFragment.append("\n    ....    ");
     }
   }
-}
-
-void VhdlDocGen::writeSource(MemberDef *mdef,OutputList& ol,QCString & cname)
-{
-  QCString codeFragment=mdef->documentation();
-  int start=mdef->getStartBodyLine();
-  QStringList qsl=QStringList::split("\n",codeFragment);
+  
+  codeFragment.prepend("\n");
+  ol.pushGeneratorState();
   ol.startCodeFragment();
-  int len = qsl.count();
-  QCString lineNumber;
-  int j;
-  for (j=0;j<len;j++)
-  {
-    lineNumber.sprintf("%05d",start++);
-    lineNumber+=" ";
-    ol.startBold();
-    ol.docify(lineNumber.data());
-    ol.endBold();
-    ol.insertMemberAlign();
-    QCString q=qsl[j].utf8();
-    VhdlDocGen::writeFormatString(q,ol,mdef);
-    ol.lineBreak();
-  }
+  pIntf->parseCode(ol,                   // codeOutIntf
+                       0,                // scope
+                       codeFragment,     // input
+                       FALSE,            // isExample
+                       0,                // exampleName
+                       mdef->getFileDef(),            // fileDef
+                       mdef->getStartBodyLine(),      // startLine
+                       mdef->getEndBodyLine(),        // endLine
+                       TRUE,             // inlineFragment
+                       mdef,             // memberDef
+                       TRUE              // show line numbers
+                      );
   ol.endCodeFragment();
+  ol.popGeneratorState();
+  if (cname.isEmpty()) return;
 
   mdef->writeSourceDef(ol,cname);
   mdef->writeSourceRefs(ol,cname);
@@ -2591,6 +2604,7 @@ void VhdlDocGen::writeSource(MemberDef *mdef,OutputList& ol,QCString & cname)
 }
 
 
+
 QCString VhdlDocGen::convertFileNameToClassName(QCString name)
 {
 
@@ -2620,7 +2634,7 @@ void VhdlDocGen::parseUCF(const char*  input,  Entry* entity,QCString fileName,b
   QCString comment("#!");
   QCString brief;
 
-  while(!ucFile.isEmpty())
+  while (!ucFile.isEmpty())
   {
     int i=ucFile.find("\n");
     if (i<0) break;
@@ -2642,7 +2656,9 @@ void VhdlDocGen::parseUCF(const char*  input,  Entry* entity,QCString fileName,b
         {
           int i=temp.find("-name");
           if (i>0)
+          {
             temp=temp.remove(0,i+5);
+          }
 
           temp.stripPrefix("set_location_assignment");
 
@@ -2673,7 +2689,7 @@ static void initUCF(Entry* root,const char*  type,QCString &  qcs,int line,QCStr
   QRegExp sp("\\s");
   QRegExp reg("[\\s=]");
   QCString n;
-  // bool bo=(stricmp(type,qcs.data())==0);
+  // bool bo=(qstricmp(type,qcs.data())==0);
 
   VhdlDocGen::deleteAllChars(qcs,';');
   qcs=qcs.stripWhiteSpace();
@@ -2730,7 +2746,7 @@ static void writeUCFLink(const MemberDef* mdef,OutputList &ol)
 {
 
   QCString largs(mdef->argsString());
-  QCString n= VhdlDocGen::splitString(largs, '#');
+  QCString n= splitString(largs, '#');
   // VhdlDocGen::adjustRecordMember(mdef);
   bool equ=(n.length()==largs.length());
 
@@ -2742,25 +2758,17 @@ static void writeUCFLink(const MemberDef* mdef,OutputList &ol)
   }
 
   if (mdef->name().contains("dummy")==0)
-    VhdlDocGen::writeLink(mdef,ol);
+  {
+    writeLink(mdef,ol);
+  }
   if (equ)
+  {
     ol.insertMemberAlign();
+  }
   ol.docify(" ");
   VhdlDocGen::formatString(largs,ol,mdef);
 }
 
-QCString VhdlDocGen::splitString(QCString& str,  char c)
-{
-  QCString n=str;
-  int i=str.find(c);
-  if (i>0)
-  {
-    n=str.left(i);
-    str=str.remove(0,i+1);
-  }
-  return n;
-}
-
 bool VhdlDocGen::findConstraintFile(LayoutNavEntry *lne)
 {
   FileName *fn=Doxygen::inputNameList->first();
@@ -2773,10 +2781,10 @@ bool VhdlDocGen::findConstraintFile(LayoutNavEntry *lne)
 
   if (Config_getBool("HAVE_DOT") && Config_getEnum("DOT_IMAGE_FORMAT")=="svg")
   {
-     QCString ov = theTranslator->trDesignOverview();
-     QCString ofile("vhdl_design_overview");
-     LayoutNavEntry *oo=new LayoutNavEntry( lne,LayoutNavEntry::MainPage,TRUE,ofile,ov,"");  
-     kk->addChild(oo); 
+    QCString ov = theTranslator->trDesignOverview();
+    QCString ofile("vhdl_design_overview");
+    LayoutNavEntry *oo=new LayoutNavEntry( lne,LayoutNavEntry::MainPage,TRUE,ofile,ov,"");  
+    kk->addChild(oo); 
   }
 
   while (fn)
@@ -2819,7 +2827,9 @@ QCString  VhdlDocGen::parseForConfig(QCString & entity,QCString & arch)
     arch= ql[2].utf8();
     ql=QStringList::split(exp,arch,FALSE);
     if (ql.count()>1) // expression
+    {
       arch="";
+    }
   }
   return label; // label
 }
@@ -2835,16 +2845,22 @@ QCString  VhdlDocGen::parseForBinding(QCString & entity,QCString & arch)
   QStringList ql=QStringList::split(exp,entity,FALSE);
 
   if (ql.contains("open"))
+  {
     return "open";
+  }
 
   label=ql[0].utf8();
 
   entity = ql[1].utf8();
   if ((index=entity.findRev("."))>=0)
+  {
     entity.remove(0,index+1);
+  }
 
   if (ql.count()==3)
+  {
     arch=ql[2].utf8();
+  }
   return label;
 }
 
@@ -2858,8 +2874,10 @@ QCString  VhdlDocGen::parseForBinding(QCString & entity,QCString & arch)
   ClassDef *cd;
   for (;(cd=cli.current());++cli)
   {
-    if(stricmp(className,cd->name().data())==0)
-    return cd; 
+    if (qstricmp(className,cd->name().data())==0)
+    {
+      return cd; 
+    }
   }
   return 0;
  }
@@ -2878,27 +2896,27 @@ void assignBinding(VhdlConfNode * conf)
 {
   QList<Entry> instList= getVhdlInstList();
   QListIterator<Entry> eli(instList);
-  Entry *cur;
-  ClassDef *archClass,*entClass;
+  Entry *cur=0;
+  ClassDef *archClass=0,*entClass=0;
   QCString archName,entityName;
   QCString arcBind,entBind;
+
   bool others,all;
   entBind=conf->binding;
   QCString conf2=VhdlDocGen::parseForBinding(entBind,arcBind);
-     
-  if(stricmp(conf2.data(),"configuration")==0)
+
+  if (qstricmp(conf2,"configuration")==0)
   {
     QList<VhdlConfNode> confList =  getVhdlConfiguration();
     VhdlConfNode* vconf;
-    bool found=false;
+    //  bool found=false;
     for (uint iter=0;iter<confList.count(); iter++)
     {
       vconf= (VhdlConfNode *)confList.at(iter);
       QCString n=VhdlDocGen::getIndexWord(vconf->confVhdl.data(),0);
       if (n==entBind)
       {
-        found=true;
+        // found=true;
         entBind=VhdlDocGen::getIndexWord(vconf->confVhdl.data(),1);   
         QCString a=VhdlDocGen::getIndexWord(conf->compSpec.data(),0);
         QCString e=VhdlDocGen::getIndexWord(conf->confVhdl.data(),1);    
@@ -2908,24 +2926,31 @@ void assignBinding(VhdlConfNode * conf)
         break;
       }
     }
-    if (!found) 
-      err("error: %s%s",conf->binding.data()," could not be found");
-    //return;
-  }// if
-  else{ // find entity work.entname(arch?)
-    QCString a=VhdlDocGen::getIndexWord(conf->compSpec.data(),0);
-    QCString e=VhdlDocGen::getIndexWord(conf->confVhdl.data(),1);    
-    a=e+"::"+a;
-    archClass= VhdlDocGen::findVhdlClass(a.data());//Doxygen::classSDict->find(a.data());
+  }
+  else  // conf2!=configuration
+  {
+    QCString a,c,e;
+    if (conf->isInlineConf)
+    {
+      c=conf->confVhdl;
+      e=VhdlDocGen::getIndexWord(conf->confVhdl.data(),0);    
+    }
+    else
+    {
+      a=VhdlDocGen::getIndexWord(conf->compSpec.data(),0);
+      e=VhdlDocGen::getIndexWord(conf->confVhdl.data(),1);    
+      c=e+"::"+a;
+    } 
+    archClass= VhdlDocGen::findVhdlClass(c.data());//Doxygen::classSDict->find(a.data());
     entClass= VhdlDocGen::findVhdlClass(e.data()); //Doxygen::classSDict->find(e.data());
   }
-  
+
   QCString label=conf->compSpec.lower();
   //label.prepend("|");
 
   if (!archClass)
   {
   err("\n error:architecture %s not found ! ",conf->confVhdl.data());
//   err("architecture %s not found ! ",conf->confVhdl.data());
     return;
   }
 
@@ -2933,57 +2958,60 @@ void assignBinding(VhdlConfNode * conf)
   QCString allOt=VhdlDocGen::getIndexWord(conf->arch.data(),0);
   all=allOt.lower()=="all" ;
   others= allOt.lower()=="others"; 
-  
-  for (;(cur=eli.current());++eli){
-   
+
+  for (;(cur=eli.current());++eli)
+  {
     if (cur->exception.lower()==label || conf->isInlineConf)
     {
       QCString sign,archy;
 
       if (all || others)
+      {
         archy=VhdlDocGen::getIndexWord(conf->arch.data(),1);
-       else
+      }
+      else
+      {
         archy=conf->arch;
-      
-      
-  QCString       inst1=VhdlDocGen::getIndexWord(archy.data(),0).lower();
-  QCString       comp=VhdlDocGen::getIndexWord(archy.data(),1).lower();
+      }
 
-  QStringList ql=QStringList::split(",",inst1);
+      QCString   inst1=VhdlDocGen::getIndexWord(archy.data(),0).lower();
+      QCString   comp=VhdlDocGen::getIndexWord(archy.data(),1).lower();
 
- for(uint j=0;j<ql.count();j++)
- {
-      QCString archy1,sign1;
-     if(all || others) 
-     { 
-      archy1=VhdlDocGen::getIndexWord(conf->arch.data(),1);
-       sign1=cur->type;
-     }
-     else
-     {
-      archy1=comp+":"+ql[j].utf8();
-      sign1=cur->type+":"+cur->name;
-    }
-    
-      if (archy1==sign1.lower() && !cur->stat)
+      QStringList ql=QStringList::split(",",inst1);
+
+      for (uint j=0;j<ql.count();j++)
       {
-       // fprintf(stderr," \n label [%s] [%s] [%s]",cur->exception.data(),cur->type.data(),cur->name.data());
-       ClassDef *ent= VhdlDocGen::findVhdlClass(entBind.data());//Doxygen::classSDict->find(entBind.data());
-     
-        if (entClass==0 || ent==0)
-          continue;
-   
-   addInstance(ent,archClass,entClass,cur);
-    cur->stat=TRUE;
-       break;
-      }
-    }// for
-   }
-  }//for
+        QCString archy1,sign1;
+        if (all || others) 
+        { 
+          archy1=VhdlDocGen::getIndexWord(conf->arch.data(),1);
+          sign1=cur->type;
+        }
+        else
+        {
+          archy1=comp+":"+ql[j].utf8();
+          sign1=cur->type+":"+cur->name;
+        }
 
-}//assignBinding
+        if (archy1==sign1.lower() && !cur->stat)
+        {
+          // fprintf(stderr," \n label [%s] [%s] [%s]",cur->exception.data(),cur->type.data(),cur->name.data());
+          ClassDef *ent= VhdlDocGen::findVhdlClass(entBind.data());//Doxygen::classSDict->find(entBind.data());
 
+          if (entClass==0 || ent==0)
+          {
+            continue;
+          }
+
+          addInstance(ent,archClass,entClass,cur);
+          cur->stat=TRUE;
+          break;
+        }
+      }// for
+    }
+  }//for each element in instList
 
+}//assignBinding
 
 /*
 
@@ -2997,7 +3025,7 @@ void assignBinding(VhdlConfNode * conf)
 //          ........
 //  end architecture
 
- */
+*/
 void VhdlDocGen::computeVhdlComponentRelations()
 {
 
@@ -3008,7 +3036,9 @@ void VhdlDocGen::computeVhdlComponentRelations()
   {
     VhdlConfNode* conf= (VhdlConfNode *)confList.at(iter);
     if (!(conf->isInlineConf || conf->isLeaf))
+    {
       continue;
+    }
     assignBinding(conf);
   }
 
@@ -3019,7 +3049,9 @@ void VhdlDocGen::computeVhdlComponentRelations()
   for (eli.toFirst();(cur=eli.current());++eli)
   {
     if (cur->stat ) //  was bind
+    {
       continue;
+    }
 
     if (cur->includeName=="entity" || cur->includeName=="component" )
     {
@@ -3031,17 +3063,18 @@ void VhdlDocGen::computeVhdlComponentRelations()
       entity=cur->type;
     }
     
-    
-    
     ClassDef *classEntity= VhdlDocGen::findVhdlClass(entity.data());//Doxygen::classSDict->find(entity);
     inst=VhdlDocGen::getIndexWord(cur->args.data(),0);
     ClassDef *cd=Doxygen::classSDict->find(inst);
     ClassDef *ar=Doxygen::classSDict->find(cur->args);
 
-    if (cd==0) continue;
+    if (cd==0) 
+    {
+      continue;
+    }
 
-    if (classEntity==0)
-      err("error: %s:%d:Entity:%s%s",cur->fileName.data(),cur->startLine,entity.data()," could not be found");
+    // if (classEntity==0)
+    //   err("%s:%d:Entity:%s%s",cur->fileName.data(),cur->startLine,entity.data()," could not be found");
     
     addInstance(classEntity,ar,cd,cur);
   }
@@ -3050,23 +3083,23 @@ void VhdlDocGen::computeVhdlComponentRelations()
 
 static void addInstance(ClassDef* classEntity, ClassDef* ar,
                         ClassDef *cd , Entry *cur,ClassDef* /*archBind*/)
+{
+
+  QCString bName,n1; 
+  if (ar==0) return;
+
+  if (classEntity==0)
   {
-    QCString bName,n1; 
-    if (ar==0) return;
+    //add component inst  
+    n1=cur->type;
+    goto ferr;
+  }
 
-    if(classEntity==0)
-    {
-      //add component inst  
-      n1=cur->type;
-      goto ferr;
-    }
   if (classEntity==cd) return;
 
-   bName=classEntity->name();
- // fprintf(stderr,"\naddInstance %s to %s %s %s\n", classEntity->name().data(),cd->name().data(),ar->name().data(),cur->name);
-   n1=classEntity->name().data();
+  bName=classEntity->name();
 // fprintf(stderr,"\naddInstance %s to %s %s %s\n", classEntity->name().data(),cd->name().data(),ar->name().data(),cur->name);
+  n1=classEntity->name().data();
 
   if (!cd->isBaseClass(classEntity, true, 0))
   {
@@ -3086,7 +3119,7 @@ static void addInstance(ClassDef* classEntity, ClassDef* ar,
 ferr:
   QCString uu=cur->name;
   MemberDef *md=new MemberDef(
-      ar->getDefFileName(), cur->startLine,
+      ar->getDefFileName(), cur->startLine,cur->startColumn,
       n1,uu,uu, 0,
       Public, Normal, cur->stat,Member,
       MemberType_Variable,
@@ -3111,17 +3144,20 @@ ferr:
   md->setDocumentation(cur->doc.data(),cur->docFile.data(),cur->docLine); 
   FileDef *fd=ar->getFileDef();
   md->setBodyDef(fd);
+
+
+  QCString info="Info: Elaborating entity "+n1; 
+  fd=ar->getFileDef();
+  info+=" for hierarchy ";
+  QRegExp epr("[|]");
+  QCString label=cur->type+":"+cur->write+":"+cur->name;
+  label.replace(epr,":");
+  info+=label;
+  fprintf(stderr,"\n[%s:%d:%s]\n",fd->fileName().data(),cur->startLine,info.data()); 
+
   
-   QCString info="Info: Elaborating entity "+n1; 
-   fd=ar->getFileDef();
-   info+=" for hierarchy ";
-   QRegExp epr("[|]");
-   QCString label=cur->type+":"+cur->write+":"+cur->name;
-   label.replace(epr,":");
-   info+=label;
-   fprintf(stderr,"\n[%s:%d:%s]\n",fd->fileName().data(),cur->startLine,info.data()); 
-   ar->insertMember(md);
+  ar->insertMember(md);
+
 }
 
 
@@ -3141,8 +3177,7 @@ void  VhdlDocGen::writeRecorUnit(QCString & largs,OutputList& ol ,const MemberDe
 void VhdlDocGen::writeRecUnitDocu(
     const MemberDef *md,
     OutputList& ol,
-    QCString largs
-    )
+    QCString largs)
 {
 
   QStringList ql=QStringList::split("#",largs,FALSE);
@@ -3167,27 +3202,7 @@ void VhdlDocGen::writeRecUnitDocu(
   }
 }//#
 
-void VhdlDocGen::writeCodeFragment(OutputList& ol,int start, QCString & codeFragment,const MemberDef* mdef)
-{
-  QStringList qsl=QStringList::split("\n",codeFragment);
-  ol.startCodeFragment();
-  int len = qsl.count();
-  QCString lineNumber;
-  int j;
-  for (j=0;j<len;j++)
-  {
-    lineNumber.sprintf("%05d",start++);
-    lineNumber+=" ";
-    ol.startBold();
-    ol.docify(lineNumber.data());
-    ol.endBold();
-    ol.insertMemberAlign();
-    QCString q=qsl[j].utf8();
-    VhdlDocGen::writeFormatString(q,ol,mdef);
-    ol.docify("\n");
-  }
-  ol.endCodeFragment();
-}
+
 
 bool VhdlDocGen::isSubClass(ClassDef* cd,ClassDef *scd, bool followInstances,int level)
 {
@@ -3273,6 +3288,8 @@ static MemberDef* findMemFlow(const MemberDef* mdef)
 
 void VhdlDocGen::createFlowChart(const MemberDef *mdef)
 {
+  if (mdef==0) return;
+
   QCString codeFragment;
   MemberDef* mm=0; 
   if((mm=findMemFlow(mdef))!=0)
@@ -3282,7 +3299,9 @@ void VhdlDocGen::createFlowChart(const MemberDef *mdef)
     return;
   }
   else
+  {
     mdList.append(mdef);
+  }
 
   //fprintf(stderr,"\n create flow mem %s %p\n",mdef->name().data(),mdef);
 
@@ -3295,8 +3314,10 @@ void VhdlDocGen::createFlowChart(const MemberDef *mdef)
   VHDLLanguageScanner *pIntf =(VHDLLanguageScanner*) Doxygen::parserManager->getParser(".vhd");
   VhdlDocGen::setFlowMember(mdef);
   Entry root;
-  pIntf->parseInput("",codeFragment.data(),&root);
-
+  QStrList filesInSameTu;
+  pIntf->startTranslationUnit("");
+  pIntf->parseInput("",codeFragment.data(),&root,FALSE,filesInSameTu);
+  pIntf->finishTranslationUnit();
 }
 
 bool VhdlDocGen::isConstraint(const MemberDef *mdef) 
@@ -3358,97 +3379,346 @@ bool VhdlDocGen::isMisc(const MemberDef *mdef)
 
 //############################## Flowcharts #################################################
 
+#define STARTL   (FlowChart::WHILE_NO     | FlowChart::IF_NO    | \
+                  FlowChart::FOR_NO       | FlowChart::CASE_NO  | \
+                  FlowChart::LOOP_NO      | WHEN_NO)
+#define DECLN    (FlowChart::WHEN_NO      | \
+                  FlowChart::ELSIF_NO     | FlowChart::IF_NO    | \
+                  FlowChart::FOR_NO       | FlowChart::WHILE_NO | \
+                  FlowChart::CASE_NO      | FlowChart::LOOP_NO )
+#define STARTFIN (FlowChart::START_NO     | FlowChart::END_NO)
+#define LOOP     (FlowChart::FOR_NO       | FlowChart::WHILE_NO | \
+                  FlowChart::LOOP_NO )
+#define ENDCL    (FlowChart::END_CASE     | FlowChart::END_LOOP)
+#define EEND     (FlowChart::ENDIF_NO     | FlowChart::ELSE_NO )
+#define IFF      (FlowChart::ELSIF_NO     | FlowChart::IF_NO)
+#define EXITNEXT (FlowChart::EXIT_NO      | FlowChart::NEXT_NO )
+#define EMPTY    (EEND                    | FlowChart::ELSIF_NO)  
+#define EE       (FlowChart::ELSE_NO      | FlowChart::ELSIF_NO)
+#define EMPTNODE (ENDCL | EEND            | FlowChart::ELSIF_NO)
+#define FLOWLEN (flowList.count()-1)
+
+static int ifcounter=0;
+static int nodeCounter=0;
+
+static struct 
+{
+   // link colors
+   const char *textNodeLink; 
+   const char *yesNodeLink;
+   const char *noNodeLink;
+   
+   // node colors
+   const char* comment;
+   const char* decisionNode;
+   const char* varNode;
+   const char *startEndNode;
+   const char* textNode;
+} flowCol = 
+{ "green",       // textNodeLink
+  "red",         // yesNodeLink
+  "black",       // noNodeLink
+  "khaki",       // comment
+  "0.7 0.3 1.0", // decisionNode
+  "lightyellow", // varNode
+  "white",       // startEndNode
+  "lightcyan"    // textNode
+};
+
+QList<FlowChart>  FlowChart::flowList;
 
-#define STARTL   (FlowNode::WHILE_NO     | FlowNode::IF_NO    | \
-                  FlowNode::FOR_NO       | FlowNode::CASE_NO  | \
-                  FlowNode::LOOP_NO )
-#define DECLN    (FlowNode::NEXT_WHEN_NO | FlowNode::WHEN_NO  | \
-                  FlowNode::ELSIF_NO     | FlowNode::IF_NO    | \
-                  FlowNode::FOR_NO       | FlowNode::WHILE_NO | \
-                  FlowNode::CASE_NO      | FlowNode::LOOP_NO )
-#define STARTFIN (FlowNode::START_NO     | FlowNode::END_NO)
-#define LOOP     (FlowNode::FOR_NO       | FlowNode::WHILE_NO | \
-                  FlowNode::LOOP_NO )
-#define ENDCL    (FlowNode::END_CASE     | FlowNode::END_LOOP)
-#define EEND     (FlowNode::ENDIF_NO     | FlowNode::ELSE_NO)
-#define IFF      (FlowNode::ELSIF_NO     | FlowNode::IF_NO)
-#define EWHEN    (FlowNode::NEXT_WHEN_NO)
-#define EMPTY    (EEND | FlowNode::ELSIF_NO)  
-
-int FlowNode::ifcounter=0;
-int FlowNode::nodeCounter=0;
-int FlowNode::imageCounter=0;
-int FlowNode::caseCounter=0;
-QList<FlowNode>  FlowNode::flowList;
-
-void  FlowNode::colTextNodes()
+#ifdef DEBUGFLOW
+static QMap<QCString,int> keyMap;
+#endif
+
+void alignText(QCString & q)
 {
-  QCString text;
-  FlowNode *flno;
-  bool found=FALSE;
-  for (uint j=0;j<flowList.count();j++)
+  if (q.length()<=80) return;
+  if (q.length()>200)
   {
-    FlowNode *flo=flowList.at(j);
-    if (flo->type==TEXT_NO)
-    {
-      text+=flo->text+'\n';
-      if (!found)
-        flno=flo;
-      if (found)
-      {
-        flno->text+=flo->text;
-        flowList.remove(flo);
-        if (j>0)j=j-1;
-      }
-      found=TRUE;
-    }  
-    else 
-      found=FALSE;
+    q.resize(200);
   }
 
-  // find if..endif without text
-  //       if..elseif without text
-  for (uint j=0;j<flowList.count()-1;j++)
+  q.append(" ...");
+  QRegExp reg("[\\s|]");
+  QCString str(q.data());
+  QCString temp;
+  
+  while (str.length()>80)
   {
-    FlowNode *flo=flowList.at(j);
-    int kind=flo->type;
-    if ( kind & IFF || flo->type==ELSE_NO)
+    int j=str.findRev(reg,80);
+    if (j<=0)
     {
-      FlowNode *ftemp=flowList.at(j+1);
-      if (ftemp->type & EMPTY)
-      {
-        FlowNode *fNew = new FlowNode(TEXT_NO,"empty ",0);
-        fNew->stamp=flo->stamp;
-        flowList.insert(j+1,fNew);
-      }
-    }  
-  }
-
-}// colTextNode
-
-QCString FlowNode::getNodeName(int n)
-{
-  QCString node;
-  node.setNum(n);
-  return node.prepend("node");
+      temp+=str;
+      q=temp;
+      return;
+    }
+    else
+    {
+      QCString qcs=str.left(j);
+      temp+=qcs+"\\";
+      temp+="n";
+      str.remove(0,j);
+    }
+  }//while
+  
+ q=temp+str;
+// #endif
 }
 
-void FlowNode::delFlowList()
+void FlowChart::printNode(const FlowChart* flo)
 {
-  ifcounter=0;
-  nodeCounter=0;
-  uint size=flowList.count();
+  if (flo==0) return;  
+  QCString ui="-"; 
+  QCString q,t;
+  QRegExp ep("[\t\n\r]");
 
-  for (uint j=0;j <size ;j++)
+  ui.fill('-',255);
+
+  if (flo->type & STARTL)
   {
-    FlowNode *fll=flowList.at(j);
-    delete fll;
-  }
+    if (flo->stamp>0)  
+    {
+      q=ui.left(2*flo->stamp);
+    }
+    else
+    {
+      q=" ";   
+    }
+    QCString nn=flo->exp.stripWhiteSpace(); 
+    printf("\nYES: %s%s[%d,%d]",q.data(),nn.data(),flo->stamp,flo->id);
+  }
+  else
+  {
+    if (flo->type & COMMENT_NO)
+    {
+      t=flo->label;
+    }
+    else
+    {
+      t=flo->text;
+    }
+    t=t.replace(ep,"");
+    if (t.isEmpty())
+    {
+      t=" ";
+    }
+    if (flo->stamp>0)
+    {
+      q=ui.left(2*flo->stamp);
+    }
+    else
+    {
+      q=" ";       
+    }
+    if (flo->type & EMPTNODE)
+    {
+      printf("\n NO: %s%s[%d,%d]",q.data(),FlowChart::getNodeType(flo->type),flo->stamp,flo->id);
+    }
+    else if (flo->type & COMMENT_NO)
+    {
+      printf("\n NO: %s%s[%d,%d]",t.data(),FlowChart::getNodeType(flo->type),flo->stamp,flo->id);
+    }
+    else
+    {
+      printf("\n NO: %s%s[%d,%d]",q.data(),t.data(),flo->stamp,flo->id);
+    }
+  }
+}
+
+void  FlowChart::printFlowTree()
+{
+  uint size=flowList.count();
+  for (uint j=0;j<size;j++)
+  {
+    printNode(flowList.at(j));
+  }
+}
+
+void  FlowChart::colTextNodes()
+{
+  QCString text;
+  FlowChart *flno;
+  bool found=FALSE;
+  for (uint j=0;j<flowList.count();j++)
+  {
+    FlowChart *flo=flowList.at(j);
+    if (flo->type&TEXT_NO)
+    {
+      text+=flo->text+'\n';
+      if (!found)
+      {
+        flno=flo;
+      }
+      if (found)
+      {
+        flno->text+=flo->text;
+        flowList.remove(flo);
+        if (j>0) j=j-1;
+      }
+      found=TRUE;
+    }  
+    else 
+      found=FALSE;
+  }
+
+  // find if..endif without text
+  //       if..elseif without text
+  for (uint j=0;j<flowList.count()-1;j++)
+  {
+    FlowChart *flo=flowList.at(j);
+    int kind=flo->type;
+    if ( (kind & IFF) || (flo->type & ELSE_NO))
+    {
+      FlowChart *ftemp=flowList.at(j+1);
+      if (ftemp->type & EMPTY)
+      {
+        FlowChart *fNew = new FlowChart(TEXT_NO,"empty ",0);
+        fNew->stamp=flo->stamp;
+        flowList.insert(j+1,fNew);
+      }
+    }  
+  }
+
+}// colTextNode
+
+QCString FlowChart::getNodeName(int n)
+{
+  QCString node;
+  node.setNum(n);
+  return node.prepend("node");
+}
+
+void FlowChart::delFlowList()
+{
+  ifcounter=0;
+  nodeCounter=0;
+  uint size=flowList.count();
+
+  for (uint j=0;j <size ;j++)
+  {
+    FlowChart *fll=flowList.at(j);
+    delete fll;
+  }
   flowList.clear();
 }
 
+void FlowChart::alignCommentNode(FTextStream &t,QCString com)
+{
+  uint max=0;
+  QCString s;
+  QStringList ql=QStringList::split("\n",com);
+  for (uint j=0;j<ql.count();j++)
+  {
+    s=(QCString)ql[j].utf8();
+    if (max<s.length()) max=s.length();
+  }
+  s=ql.last().utf8();
+  int diff=max-s.length();
+  
+  QCString n(1);
+  if (diff>0)
+  {
+    n.fill(' ',2*diff);
+    n.append(".");
+    s+=n;
+    ql.remove(ql.last());
+    ql.append(s);
+  }
+  for (uint j=0;j<ql.count();j++)
+  {
+    s=(QCString)ql[j].utf8();
+    if (j<ql.count()-1)
+    {
+      s+="\n";
+    }
+    FlowChart::codify(t,s.data());  
+  } 
+}
+
 
-void FlowNode::codify(FTextStream &t,const char *str)
+void FlowChart::buildCommentNodes(FTextStream & t)
+{
+  uint size=flowList.count();
+  bool begin=false;
+
+  for (uint j=0;j < size-1 ;j++)
+  {
+    FlowChart *fll=flowList.at(j);
+    if (fll->type & COMMENT_NO)
+    {
+      FlowChart* to=flowList.at(j+1);
+      if (to->type & COMMENT_NO)
+      {
+        fll->label+="\n";
+        QCString temp=fll->label+to->label;
+        to->label=temp;
+        flowList.remove(j);
+        size--;
+        if (j>0) j--;
+      }
+    }
+  }// for
+
+  for (uint j=0;j <flowList.count() ;j++)
+  {
+    FlowChart *fll=flowList.at(j);
+
+    if (fll->type & BEGIN_NO)
+    {
+      begin = true;
+      continue;
+    }
+
+    if (fll->type & COMMENT_NO)
+    {
+      FlowChart* to;
+      if (!begin)
+      {
+        //  comment between function/process .. begin is linked to start node
+        to=flowList.at(0);
+      }
+      else 
+      { 
+        if (j>0 && flowList.at(j-1)->line==fll->line)
+          to=flowList.at(j-1);
+        else
+          to=flowList.at(j+1);
+       }
+      t << getNodeName(fll->id);
+      t << "[shape=none, label=<\n";
+      t << "<TABLE BORDER=\"0\" CELLBORDER=\"1\" CELLSPACING=\"0\" CELLPADDING=\"2\" >\n ";
+      t << "<TR><TD BGCOLOR=\"";
+      t << flowCol.comment;
+      t << "\" > ";
+
+      FlowChart::alignCommentNode(t,fll->label);
+      t << " </TD></TR></TABLE>>];";
+      writeEdge(t,fll->id,to->id,2);
+    }
+  }// for
+
+  // delete comment nodes;
+  size=flowList.count();
+  for (uint j=0;j < size;j++)
+  {
+    FlowChart *fll=flowList.at(j);
+    if (fll->type & (COMMENT_NO | BEGIN_NO))
+    {
+      flowList.remove(j);
+      delete fll;
+      fll=0;
+      size--;
+      if (j>0) j--;
+    }
+  }// for;
+}
+
+void FlowChart::codify(FTextStream &t,const char *str)
 {
   if (str)
   { 
@@ -3471,31 +3741,38 @@ void FlowNode::codify(FTextStream &t,const char *str)
   }
 }//codify
 
-FlowNode::~FlowNode()
+FlowChart::~FlowChart()
 {
 }
 
-FlowNode::FlowNode(int typ,const char * t,const char* ex,const char* label)
+FlowChart::FlowChart(int typ,const char * t,const char* ex,const char* lab)
 { 
+  stamp=ifcounter;
+
   if (typ & STARTL)
   {
     ifcounter++;
   }
 
-  stamp=FlowNode::ifcounter;
   text=t;
   exp=ex;
   type=typ;
-  this->label=label;
+  label=lab;
 
+  if (typ & (ELSE_NO | ELSIF_NO))
+  {
+    stamp--;
+  }
 
-  if (typ==START_NO || typ==END_NO || typ==VARIABLE_NO)
-    stamp=-1;
+  if (typ & (START_NO | END_NO | VARIABLE_NO))
+  {
+    stamp=0;
+  }
 
-  id=++nodeCounter;
+  id=nodeCounter++;
 }
 
-void FlowNode::addFlowNode(int type,const char* text,const char* exp, const char *label)
+void FlowChart::addFlowChart(int type,const char* text,const char* exp, const char *label)
 {
   static QRegExp reg("[;]");
   static QRegExp reg1("[\"]");
@@ -3512,122 +3789,89 @@ void FlowNode::addFlowNode(int type,const char* text,const char* exp, const char
   }
 
   if (exp)
+  {
     expression=expression.replace(reg1,"\\\"");
+  }
 
-  FlowNode *fl=new FlowNode(type,typeString.data(),expression.data(),label);
-  if (type==START_NO)
+  FlowChart *fl=new FlowChart(type,typeString.data(),expression.data(),label);
+
+  fl->line=getVhdlCont()->yyLineNr;
+
+  if (type & (START_NO | VARIABLE_NO))
+  {
     flowList.prepend(fl);
-  else if (type==VARIABLE_NO) 
-    flowList.insert(1,fl);
+  }
   else
+  {
     flowList.append(fl);
+  }
 
 }
 
-void FlowNode::moveToPrevLevel()
+void FlowChart::moveToPrevLevel()
 {
   if (!VhdlDocGen::getFlowMember()) return;
   ifcounter--;
 }
 
 
-void FlowNode::setLabel(const char* t)
-{
-  FlowNode *fll=flowList.last();
-  fll->label=t;
-  assert(fll->type & LOOP);
-
-}
-
-void FlowNode::printFlowList()
-{
-  uint size=FlowNode::flowList.count();
-  for (uint j=0;j<size;j++)
-  {
-    FlowNode *fll=flowList.at(j);
-    QCString ty=getNodeType(fll->type);
-
-    printf("============================================");
-    if (!fll->text.isEmpty())
-    {
-      printf("\n (%d)  NODE:type  %s text %s stamp:%d\n",fll->id,ty.data(),fll->text.data(),fll->stamp);
-    }
-    else
-    {
-      printf("\n (%d)   NODE:type  %s exp %s stamp:%d [%s]\n",fll->id,ty.data(),fll->exp.data(),fll->stamp,fll->label.data());
-    }
-
-    printf("============================================");
-  }// for
-}
-
-
-QCString FlowNode::convertNameToFileName()
+QCString FlowChart::convertNameToFileName()
 {
-  static QRegExp exp ("[#&*+-/<=>|$?^]");
+  static QRegExp exp ("[^][a-z_A-Z0-9]");
   QCString temp,qcs;
   const  MemberDef* md=VhdlDocGen::getFlowMember();
 
- temp.sprintf("%p",md);
- qcs=md->name();
-
-//long pp=(long)&temp;
-  
-  // string literal
-  VhdlDocGen::deleteAllChars(qcs,'"');
-
-  // functions like "<=", ">"
-  int u=qcs.find(exp,0);
+  temp.sprintf("%p",md);
+  qcs=md->name();
 
-  if (u>=0)
+  if (qcs.find(exp,0)>=0)
   { 
     qcs.prepend("Z"); 
     qcs=qcs.replace(exp,"_");
   }    
 
- // temp=temp.setNum(1);  
   return qcs+temp;
 }
 
-const char* FlowNode::getNodeType(int c)
+const char* FlowChart::getNodeType(int c)
 {
   switch(c)
   {
-    case FlowNode::IF_NO:        return "if ";
-    case FlowNode::ELSIF_NO:     return "elsif ";
-    case FlowNode::ELSE_NO:      return "else ";
-    case FlowNode::CASE_NO:      return "case ";
-    case FlowNode::WHEN_NO:      return "when ";
-    case FlowNode::EXIT_NO:      return "exit ";
-    case FlowNode::END_NO:       return "end ";
-    case FlowNode::TEXT_NO:      return "text ";
-    case FlowNode::START_NO:     return "start  ";
-    case FlowNode::ENDIF_NO:     return "endif  ";
-    case FlowNode::FOR_NO:       return "for ";
-    case FlowNode::WHILE_NO:     return "while  ";
-    case FlowNode::END_LOOP:     return "end_loop  ";
-    case FlowNode::END_CASE:     return "end_case  ";
-    case FlowNode::VARIABLE_NO:  return "variable_decl  ";
-    case FlowNode::RETURN_NO:    return "return  ";
-    case FlowNode::LOOP_NO:      return "infinte loop  ";
-    case FlowNode::NEXT_NO:      return "next  ";
-    case FlowNode::EXIT_WHEN_NO: return "exit_when  ";
-    case FlowNode::NEXT_WHEN_NO: return "next_when  ";
-    case FlowNode::EMPTY_NO:     return "empty  ";
+    case IF_NO:        return "if ";
+    case ELSIF_NO:     return "elsif ";
+    case ELSE_NO:      return "else ";
+    case CASE_NO:      return "case ";
+    case WHEN_NO:      return "when ";
+    case EXIT_NO:      return "exit ";
+    case END_NO:       return "end ";
+    case TEXT_NO:      return "text ";
+    case START_NO:     return "start  ";
+    case ENDIF_NO:     return "endif  ";
+    case FOR_NO:       return "for ";
+    case WHILE_NO:     return "while  ";
+    case END_LOOP:     return "end_loop  ";
+    case END_CASE:     return "end_case  ";
+    case VARIABLE_NO:  return "variable_decl  ";
+    case RETURN_NO:    return "return  ";
+    case LOOP_NO:      return "infinte loop  ";
+    case NEXT_NO:      return "next  ";
+    case COMMENT_NO:   return "comment  ";
+    case EMPTY_NO:     return "empty  ";
+    case BEGIN_NO:     return "<begin>  ";
     default: return "--failure--";
   }
 }
 
-void FlowNode::createSVG()
+void FlowChart::createSVG()
 {
   QCString qcs("/");
   QCString ov = Config_getString("HTML_OUTPUT");
 
-  FlowNode::imageCounter++;
-  qcs+=FlowNode::convertNameToFileName()+".svg";
+  qcs+=FlowChart::convertNameToFileName()+".svg";
 
   //const  MemberDef *m=VhdlDocGen::getFlowMember();
-  //fprintf(stderr,"\n creating  flowchart  : %s  %s in file %s \n",VhdlDocGen::trTypeString(m->getMemberSpecifiers()),m->name().data(),m->getFileDef()->name().data());   
+  //if (m)
+  //  fprintf(stderr,"\n creating  flowchart  : %s  %s in file %s \n",VhdlDocGen::trTypeString(m->getMemberSpecifiers()),m->name().data(),m->getFileDef()->name().data());   
 
   QCString dir=" -o "+ov+qcs;
   ov+="/flow_design.dot";
@@ -3640,8 +3884,7 @@ void FlowNode::createSVG()
   }
 }
 
-
-void FlowNode::startDot(FTextStream &t)
+void FlowChart::startDot(FTextStream &t)
 {
   t << " digraph G { \n"; 
   t << "rankdir=TB \n";
@@ -3649,12 +3892,12 @@ void FlowNode::startDot(FTextStream &t)
   t << "stylesheet=\"doxygen.css\"\n";
 }
 
-void FlowNode::endDot(FTextStream &t)
+void FlowChart::endDot(FTextStream &t)
 {
   t << " } \n"; 
 }
 
-void FlowNode::writeFlowNode()
+void FlowChart::writeFlowChart()
 {
   //  assert(VhdlDocGen::flowMember);
 
@@ -3665,29 +3908,35 @@ void FlowNode::writeFlowNode()
 
   if (!f.open(IO_WriteOnly))
   {
-    err("Error: Cannot open file %s for writing\n",fileName.data());
+    err("Cannot open file %s for writing\n",fileName.data());
     return;
   }
 
   colTextNodes();
-  // printFlowList( );
-  FlowNode::startDot(t);
+
+#ifdef DEBUGFLOW
+  printFlowTree();
+#endif
+    
+  startDot(t);
+  buildCommentNodes(t);
+
   uint size=flowList.count();
 
   for (uint j=0;j <size ;j++)
   {
-    FlowNode *fll=flowList.at(j);
+    FlowChart *fll=flowList.at(j);
     writeShape(t,fll);
   }
   writeFlowLinks(t);
 
-  FlowNode::endDot(t);
+  FlowChart::endDot(t);
   delFlowList();
   f.close();
-  FlowNode::createSVG(); 
-}// writeFlowNode
+  FlowChart::createSVG(); 
+}// writeFlowChart
 
-void FlowNode::writeShape(FTextStream &t,const FlowNode* fl)
+void FlowChart::writeShape(FTextStream &t,const FlowChart* fl)
 {
   if (fl->type & EEND) return;
   QCString var;
@@ -3706,10 +3955,40 @@ void FlowNode::writeShape(FTextStream &t,const FlowNode* fl)
 
   t<<getNodeName(fl->id).data();
   QCString q=getNodeType(fl->type);
+
+#ifdef DEBUGFLOW  
+  QCString qq(getNodeName(fl->id).data());
+  keyMap.insert(qq,fl->id);
+#endif 
+
   bool dec=(fl->type & DECLN);
+  bool exit=(fl->type & EXITNEXT);
+  if (exit && !fl->exp.isEmpty())
+  {
+    dec=TRUE;
+  }
   if (dec)
   {
-    t << " [shape=diamond,style=filled,color=\".7 .3 1.0\",label=\" "+fl->exp+var+"\"]\n";
+    QCString exp=fl->exp;
+    alignText(exp);
+
+    t << " [shape=diamond,style=filled,color=\"";
+    t << flowCol.decisionNode;
+    t << "\",label=\" ";
+    QCString kl;
+    if (exit) kl=fl->text+"  ";
+
+    if (fl->label)
+    {
+      kl+=fl->label+":"+exp+var;
+    }
+    else
+    {
+      kl+=exp+var;
+    }
+
+    FlowChart::alignCommentNode(t,kl);
+    t << "\"]\n";
   }
   else if (fl->type & ENDCL)
   {
@@ -3718,22 +3997,27 @@ void FlowNode::writeShape(FTextStream &t,const FlowNode* fl)
   }
   else if (fl->type & STARTFIN)
   {
-    static QRegExp reg1("[\"]");
     QCString val=fl->text;
-    val=val.replace(reg1,"\\\"");
     t << "[shape=box , style=rounded label=<\n";
     t << "<TABLE BORDER=\"0\" CELLBORDER=\"0\" CELLSPACING=\"0\" CELLPADDING=\"0\" >\n ";
-    t << "<TR><TD BGCOLOR=\"white\" > ";
-    FlowNode::codify(t,val.data());
+    t << "<TR><TD BGCOLOR=\"";
+    t<< flowCol.startEndNode;
+    t<< "\"> ";
+    FlowChart::alignCommentNode(t,val);
     t << " </TD></TR></TABLE>>];";
   }
   else 
   {
     if (fl->text.isEmpty()) return;
-    bool var=(fl->type & FlowNode::VARIABLE_NO) ;
+    bool var=(fl->type & FlowChart::VARIABLE_NO);
     QCString repl("<BR ALIGN=\"LEFT\"/>");
     QCString q=fl->text;
 
+    if (exit)
+    {
+      q+=" "+fl->label;
+    }
+
     int z=q.findRev("\n");
 
     if (z==(int)q.length()-1)
@@ -3744,371 +4028,365 @@ void FlowNode::writeShape(FTextStream &t,const FlowNode* fl)
     t << "<TABLE BORDER=\"0\" CELLBORDER=\"1\" CELLSPACING=\"0\" CELLPADDING=\"2\" >\n ";
     if (var)
     {
-      t << "<TR><TD BGCOLOR=\"lightyellow\" > ";
+      t << "<TR><TD BGCOLOR=\"" << flowCol.varNode << "\" > ";
     }
     else
     {
-      t << "<TR><TD BGCOLOR=\"lightcyan\" > ";
+      t << "<TR><TD BGCOLOR=\"" << flowCol.textNode << "\" > ";
     }
-    FlowNode::codify(t,q.data());
+    FlowChart::alignCommentNode(t,q);
     t << " </TD></TR></TABLE>>];";
   }
 }
 
 
-void FlowNode::writeEdge(FTextStream &t,const FlowNode* fl_from,const FlowNode* fl_to,int i)
+void FlowChart::writeEdge(FTextStream &t,const FlowChart* fl_from,const FlowChart* fl_to,int i)
 {
-  checkNode(fl_to);
-  writeEdge(t,fl_from->id,fl_to->id,i);
+  bool b=fl_from->type & STARTL;
+  bool c=fl_to->type & STARTL;
+
+#ifdef DEBUGFLOW 
+  QCString s1(getNodeName(fl_from->id).data());
+  QCString s2(getNodeName(fl_to->id).data());
+  QMap<QCString, int>::Iterator it = keyMap.find(s1);
+  QMap<QCString, int>::Iterator it1 = keyMap.find(s2); 
+  // checks if the link is connected to a valid node 
+  assert(it.key());
+  assert(it1.key());
+#endif
+  
+  writeEdge(t,fl_from->id,fl_to->id,i,b,c);
 }
 
-void FlowNode::writeEdge(FTextStream &t,int fl_from,int fl_to,int i)
+void FlowChart::writeEdge(FTextStream &t,int fl_from,int fl_to,int i,bool bFrom,bool bTo)
 {
   QCString label,col;
 
   if (i==0)
   {
-    col="red";
+    col=flowCol.yesNodeLink;
     label="yes";
   }
   else if (i==1)
   {
-    col="black";
+    col=flowCol.noNodeLink;
     label="no";
   }
   else
   {
-    col="green";
+    col=flowCol.textNodeLink;
     label="";
   }
 
-  t<<"edge [color=\""+col+"\",label=\""+label+"\"]\n";
-  t<<getNodeName(fl_from).data();
-  t<<"->";
-  t<<getNodeName(fl_to).data();
-  t<<"\n";
+  t << "edge [color=\""+col+"\",label=\""+label+"\"]\n";
+  t << getNodeName(fl_from).data();
+  if (bFrom) t << ":s";
+  t << "->";
+  t << getNodeName(fl_to).data();
+  if (bTo) t << ":n";
+  t << "\n";
 }
 
-
-void FlowNode::checkNode(const FlowNode* /*flo*/)
+void FlowChart::alignFuncProc( QCString & q,const ArgumentList* al,bool isFunc)
 {
-  // assert(!(flo->type & IDLE)); 
-}
+  if (al==0) return;
 
-void FlowNode::checkNode(int /*z*/)
-{
-  // FlowNode *flo=flowList.at(z);
-  //assert(!(flo->type & IDLE)); 
-}
+  ArgumentListIterator ali(*al);
+  int index=ali.count();
+  if (index==0) return;
 
-int FlowNode::getNextNode(int index)
-{
-  for (uint j=index+1;j<flowList.count();j++)
+  int len=q.length()+VhdlDocGen::getFlowMember()->name().length();
+  QCString prev,temp;
+  prev.fill(' ',len+1);
+  
+  Argument *arg;
+  q+="\n";
+  for (;(arg=ali.current());++ali)
   {
-    FlowNode *flo=flowList.at(j);
-    int kind=flo->type;
-    if (kind & FlowNode::ENDIF_NO)
-    {
-      continue;
-    }
+    QCString attl=arg->defval+" ";
+    attl+=arg->name+" ";
 
-    if (kind==ELSE_NO || kind==ELSIF_NO)
+    if (!isFunc)
     {
-      j=findNode(j,flo->stamp,FlowNode::ENDIF_NO);
+      attl+=arg->attrib+" ";
     }
     else
     {
-      return j; 
+      attl+=" in ";
     }
-  } 
+    attl+=arg->type;
+    if (--index) attl+=",\n"; else attl+="\n";
+  
+    attl.prepend(prev.data());
+    temp+=attl;
+  }
 
-  return flowList.count()-1;
+  q+=temp;
 }
 
-int FlowNode::findNode(int index,int type)
+int FlowChart::findNextLoop(int index,int stamp)
 {
   for (uint j=index+1;j<flowList.count();j++)
   {
-    FlowNode *flo=flowList.at(j);
-    if (flo->type==type)
+    FlowChart *flo=flowList.at(j);
+    if (flo->stamp==stamp)
+    {
+      continue;
+    }
+    if (flo->type&END_LOOP)
     {
       return j;
     }
   }
   return flowList.count()-1;
-}// findNode
+}
 
+int FlowChart::findPrevLoop(int index,int stamp,bool endif)
+{
+  for (uint j=index;j>0;j--)
+  {
+    FlowChart *flo=flowList.at(j);
+    if (flo->type & LOOP)
+    {
+      if (flo->stamp==stamp && endif)
+      {
+        return j;
+      }
+      else
+      {
+        if (flo->stamp<stamp)
+        {
+          return j;
+        }
+      }
+    }
+  }
+  return flowList.count()-1;
+}
+
+int FlowChart::findLabel(int index,QCString &label)
+{
+  for (uint j=index;j>0;j--)
+  {
+    FlowChart *flo=flowList.at(j);
+    if ((flo->type & LOOP) && !flo->label.isEmpty() && qstricmp(flo->label,label)==0)
+    {
+      return j; 
+    }
+  }    
+  err("could not find label: ",label.data());
+  return 0;
+}
 
-int FlowNode::findNode(int index,int stamp,int type)
+int FlowChart::findNode(int index,int stamp,int type)
 {
   for (uint j=index+1;j<flowList.count();j++)
   {
-    FlowNode *flo=flowList.at(j);
+    FlowChart *flo=flowList.at(j);
     if (flo->type==type && flo->stamp==stamp)
     {
       return j;
     }
   }
-  return flowList.count()-1;
+  return 0;
 }// findNode
 
-int FlowNode::getNoLink(const FlowNode* fl,uint index)
+int FlowChart::getNextNode(int index,int stamp)
 {
-
   for (uint j=index+1;j<flowList.count();j++)
   {
-    FlowNode *flo=FlowNode::flowList.at(j);
-    if (flo->type==IF_NO && flo->stamp==fl->stamp)
+    FlowChart *flo=flowList.at(j);
+    int kind=flo->type;
+    int s=flo->stamp;
+    if (s>stamp)
     {
-      return j; 
+      continue;
     }
-
-    if (flo->type==ELSE_NO && flo->stamp==fl->stamp) 
+    if (kind & ENDIF_NO)
     {
-      return j+1;   
+      if (s<stamp && stamp>0)
+      {
+        stamp--;
+        continue;
+      }
     }
-
-    if (flo->type==ELSIF_NO && flo->stamp==fl->stamp)
+    if (kind & (ELSE_NO | ELSIF_NO))
     {
-      return j;
+      if (s<stamp && stamp>0)
+      {
+        stamp--;
+      }
+      j=findNode(j,stamp,ENDIF_NO);
+      continue;
     }
-
-    if ((flo->type & ENDIF_NO) && flo->stamp==fl->stamp)
+    if (kind & WHEN_NO)
     {
-      return getNextNode(j);
+      if (s<stamp && stamp>0)
+      {
+        stamp--;
+      }
+      return findNode(j,stamp-1,END_CASE);
     }
-
+    return j;
   }
-  return flowList.count()-1;// end process 
+  return FLOWLEN;
 }
 
-int FlowNode::getTextLink(const FlowNode* /*fl*/,uint index)
+int FlowChart::getNextIfLink(const FlowChart* fl,uint index)
 {
-  assert(FlowNode::flowList.count()>index);
+  int stamp=fl->stamp;
+  uint start = index+1;
+  int endifNode  = findNode(start,stamp,ENDIF_NO);
+  int elseifNode = findNode(start,stamp,ELSIF_NO);
+  int elseNode   = findNode(start,stamp,ELSE_NO);
 
-  uint i=index+1;
+  assert(endifNode>-1);
 
-  FlowNode *flo=flowList.at(i);
-  if (flo->type==IF_NO) 
+  if (elseifNode>0 && elseifNode<endifNode)
   {
-    return i;
+    return elseifNode;
   }
 
-  if (FlowNode::caseCounter)
+  if (elseNode>0 && elseNode<endifNode)
   {
-    return FlowNode::findNode(index,END_CASE);
+    return elseNode+1;
   }
-  else
-  {
-    i = FlowNode::getNextNode(index);
-  }
-
-  if (i>0) return i;
 
-  return flowList.count()-1;// end process 
-}
-
-int FlowNode::findNextLoop(int index,int stamp)
-{
-  for (uint j=index+1;j<FlowNode::flowList.count();j++)
-  {
-    FlowNode *flo=FlowNode::flowList.at(j);
-    if (flo->type==END_LOOP && flo->stamp==stamp)
-    {
-      return j; 
-    }
-  }    
-  return flowList.count()-1;
-}
-
-int FlowNode::findPrevLoop(int index,int stamp)
-{
-  for (uint j=index;j>0;j--)
-  {
-    FlowNode *flo=flowList.at(j);
-    if (flo->type & LOOP)
-    {
-      if ( flo->stamp==stamp)
-      {
-        return j; 
-      }
-    }
-  }    
-  err("end loop without loop");
-  assert(FALSE);
-  return flowList.count()-1;
-}
-
-
-int FlowNode::findLabel(int index,QCString & label)
-{
-  for (uint j=index;j>0;j--)
-  {
-    FlowNode *flo=flowList.at(j);
-    if ((flo->type & LOOP) && !flo->label.isEmpty() && stricmp(flo->label.data(),label.data())==0)
-    {
-      return findNode(j,flo->stamp,END_LOOP); 
-    }
-  }    
-  return 0;
+  stamp=flowList.at(endifNode)->stamp;
+  return getNextNode(endifNode,stamp);
 }
 
-
-void FlowNode::writeFlowLinks(FTextStream &t)
+void FlowChart::writeFlowLinks(FTextStream &t)
 {
-
   uint size=flowList.count();
   if (size<2) return;
 
-  // start link
+  // write start link
   writeEdge(t,flowList.at(0),flowList.at(1),2);
 
   for (uint j=0;j<size;j++)
   {
-    FlowNode *fll=flowList.at(j);
+    FlowChart *fll=flowList.at(j);
     int kind=fll->type;
-    if (kind==ELSE_NO || kind==ENDIF_NO)
+    int stamp=fll->stamp;
+    if (kind & EEND)
     {
       continue;
     }
 
-    if (kind==IF_NO)
+    if (kind & IFF)
     {
       writeEdge(t,fll,flowList.at(j+1),0);
-      int z=getNoLink(fll,j);
+      int z=getNextIfLink(fll,j);
+      // assert(z>-1);
       writeEdge(t,fll,flowList.at(z),1);
     }
-
-    if (kind==ELSIF_NO)
+    else if (kind & LOOP_NO)
     {
-      writeEdge(t,fll,flowList.at(j+1),0);
-      int z=getNoLink(fll,j);
-      writeEdge(t,fll,flowList.at(z),1);
+      writeEdge(t,fll,flowList.at(j+1),2);
+      continue;
     }
-
-    if ((kind & LOOP)  && kind!=LOOP_NO) 
+    else if (kind & (CASE_NO | FOR_NO | WHILE_NO))
     {
-      writeEdge(t,fll,flowList.at(j+1),0);
-      int z=findNode(j,fll->stamp,END_LOOP);
-      z = getNextNode(z);
-      writeEdge(t,fll,flowList.at(z),1);
-    }
+      if (kind & CASE_NO)
+      {
+        writeEdge(t,fll,flowList.at(j+1),2);
+        continue;
+      }
+      else
+      {
+        writeEdge(t,fll,flowList.at(j+1),0);
+      }
 
-    if (kind==LOOP_NO) 
-    {
-      writeEdge(t,fll,flowList.at(j+1),0);
-    }
+      kind=END_LOOP;
+      int z=findNode(j+1,fll->stamp,kind);
+      z=getNextNode(z,flowList.at(z)->stamp);
 
-    if (kind==TEXT_NO || kind==VARIABLE_NO)
+      // assert(z>-1);
+      writeEdge(t,fll,flowList.at(z),1);
+      continue;
+    }   
+    else if (kind & (TEXT_NO | VARIABLE_NO))
     {
-      int z=getTextLink(fll,j);
+      int z=getNextNode(j,stamp);
       writeEdge(t,fll,flowList.at(z),2);
     }
-
-    if (kind==WHEN_NO)
+    else if (kind & WHEN_NO)
     {
-      writeEdge(t,fll,flowList.at(j+1),0);
-      int z=flowList.count()-1;
-      int u=findNode(j,fll->stamp,WHEN_NO);
-      if (u<z)
-        writeEdge(t,fll,FlowNode::flowList.at(u),1);
-      else {
-        z=findNode(j,fll->stamp,END_CASE);
-        writeEdge(t,fll,FlowNode::flowList.at(z),1);
-      } 
-    }
+      // default value
+      if (qstricmp(fll->text.simplifyWhiteSpace().data(),"others")==0)
+      { 
+        writeEdge(t,fll,flowList.at(j+1),2);
+        continue;
+      }  
 
-    if (kind==CASE_NO)
-    {
-      writeEdge(t,fll,flowList.at(j+1),2);
-      caseCounter++;
-    }
-
-    if (kind==RETURN_NO)
-    {
-      writeEdge(t,fll,FlowNode::flowList.at(size-1),2);
-    }
+     
+      writeEdge(t,fll,flowList.at(j+1),0);
+      int u=findNode(j,stamp,WHEN_NO);
+      int v=findNode(j,stamp-1,END_CASE);
 
-    if (kind==EXIT_NO)
-    {
-      int  z;
-      if (!fll->label.isEmpty())
+      if (u>0 && u<v)
       {
-        z=findLabel(j,fll->label);
-        z=getNextNode(z);
-        //assert(z!=0);
+        writeEdge(t,fll,flowList.at(u),1);
       }
       else 
       {
-        z =findNextLoop(j,fll->stamp);
-        z=getNextNode(z);
+        writeEdge(t,fll,flowList.at(v),1);
       }
-      writeEdge(t,fll,flowList.at(z),2);
     }
-
-    if (kind==END_CASE)
+    else if (kind & END_CASE)
     {
-      int z=FlowNode::getNextNode(j);
+      int z=FlowChart::getNextNode(j,fll->stamp);
       writeEdge(t,fll,flowList.at(z),2);
-      caseCounter--;
     }
-
-    if (kind==END_LOOP)
+    else if (kind & END_LOOP)
     {
-      int   z=findPrevLoop(j,fll->stamp);
+      int z=findPrevLoop(j,fll->stamp,true);
       writeEdge(t,fll,flowList.at(z),2);
     }
-
-    if (kind & EWHEN)
+    else if (kind & RETURN_NO)
     {
-      writeEdge(t,fll,flowList.at(j+1),0);
-      int z=getNextNode(j+1);
-      writeEdge(t,fll,flowList.at(z),1);
+      writeEdge(t,fll,FlowChart::flowList.at(size-1),2);
     }
-
-    if (kind & NEXT_NO)
+    else if (kind & (EXIT_NO | NEXT_NO))
     {
-      int z=findNode(j,fll->stamp,END_LOOP); 
-      writeEdge(t,fll,flowList.at(z),1);
+      int z;
+      bool b = kind==NEXT_NO;
+      if (fll->exp)
+      {
+        writeEdge(t,fll,flowList.at(j+1),1);
+      }
+      if (!fll->label.isEmpty())
+      {
+        z=findLabel(j,fll->label);
+        if (b)
+        {
+          writeEdge(t,fll,flowList.at(z),0);
+        }
+        else
+        {
+          z=findNode(z,flowList.at(z)->stamp,END_LOOP);
+          z=getNextNode(z,flowList.at(z)->stamp);
+          writeEdge(t,fll,flowList.at(z),0);
+        }
+        continue;
+      }
+      else
+      {
+        if (b)
+        {
+          z=findPrevLoop(j,fll->stamp);
+          writeEdge(t,fll,flowList.at(z),0); 
+          continue;
+        }
+        else
+        {
+          z =findNextLoop(j,fll->stamp-1);
+        }
+        z=getNextNode(z,flowList.at(z)->stamp);
+      }
+      writeEdge(t,fll,flowList.at(z),0);
     }
   } //for
 } //writeFlowLinks
 
-void FlowNode::alignFuncProc( QCString & q,const ArgumentList* al,bool isFunc)
-{
-  if (al==0) return;
-
-  ArgumentListIterator ali(*al);
-  int index=ali.count();
-  if (index==0) return;
-
-  int len=q.length()+VhdlDocGen::getFlowMember()->name().length();
-  QCString prev,temp;
-  prev.fill(' ',len+1);
-
-  Argument *arg;
-  q+="\n";
-  for (;(arg=ali.current());++ali)
-  {
-    QCString attl=arg->defval+" ";
-    attl+=arg->name+" ";
-
-    if (!isFunc)
-    {
-      attl+=arg->attrib+" ";
-    }
-    else 
-    {
-      attl+=" in ";
-    }
-
-    attl+=arg->type;
-
-    if (--index) attl+=",\n"; else attl+="\n";
-
-    attl.prepend(prev.data());
-    temp+=attl;
-  }
-  q+=temp;
-} 
-
index b26cd63..7c78373 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -25,6 +25,7 @@
 #include <qcstring.h>
 #include "layout.h"
 #include "arguments.h"
+#include "entry.h"
 
 class Entry;
 class ClassDef;
@@ -116,8 +117,6 @@ class VhdlDocGen
     static MemberDef* findFunction(const QList<Argument> &ql,
                                    const QCString& name,
                                    const QCString& package, bool type);
-    static bool compareString(const QCString& s1,
-                              const QCString& s2);
     static QCString getClassTitle(const ClassDef*);
     static void writeInlineClassLink(const ClassDef*,
                                      OutputList &ol);
@@ -153,8 +152,8 @@ class VhdlDocGen
     //-----------------------------------------------------
     // translatable items
     
-    static QCString trTypeString(int type);
-    static QCString trVhdlType(int type,bool sing=true);
+    static QCString trTypeString(uint64 type);
+    static QCString trVhdlType(uint64 type,bool sing=true);
 
     // trClassHierarchy.
     static QCString trDesignUnitHierarchy();
@@ -205,33 +204,22 @@ class VhdlDocGen
         const char *title,const char *subtitle,bool showEnumValues,int type);
 
     static bool writeClassType(ClassDef *&,OutputList &ol ,QCString & cname);
-   
 
     static QCString convertArgumentListToString(const ArgumentList* al,bool f);
     static QCString getProcessNumber();
     static QCString getRecordNumber();
    
     static QCString getClassName(const ClassDef*);
-    // obsolete
-    // static void adjustRecordMember(MemberDef *mdef);
-
-    static void writeLink(const MemberDef* mdef,OutputList &ol);
-    static void adjustMemberName(QCString& nn);
-    static bool membersHaveSpecificType(MemberList *ml,int type);
-    static void startFonts(const QCString& q, const char *keyword,OutputList& ol);
     static bool isNumber(const QCString& s);
     static QCString getProtectionName(int prot);
-    static QCString splitString(QCString & str,  char c);
+
     static void parseUCF(const char*  input,Entry* entity,QCString f,bool vendor);
-       
     static bool findConstraintFile( LayoutNavEntry *lne);
 
     static ClassDef*  findArchitecture(const ClassDef *cd);
     static ClassDef*  findArchitecture(QCString identifier, QCString entity_name);
 
-    static void writeCodeFragment( MemberDef *mdef,OutputList& ol);
-    static void writeCodeFragment (OutputList& ol,int start, QCString & codeFragment,const MemberDef* mdef);
-
+    
     static void writeSource(MemberDef *mdef,OutputList& ol,QCString & cname);
     static void writeAlphbeticalClass(OutputList& ol,const ClassDef* cd,const QCString &);
 
@@ -250,6 +238,16 @@ class VhdlDocGen
     static void setFlowMember( const MemberDef *flowMember);
     static const MemberDef *getFlowMember();
 
+    static  bool isVhdlClass (const Entry *cu) 
+    {
+      return cu->spec==VhdlDocGen::ENTITY       ||
+             cu->spec==VhdlDocGen::PACKAGE      ||
+             cu->spec==VhdlDocGen::ARCHITECTURE ||
+             cu->spec==VhdlDocGen::PACKAGE_BODY;
+    }
+
+
+
   private:
     static void findAllArchitectures(QList<QCString>& ql,const ClassDef *cd);
     static bool compareArgList(ArgumentList*,ArgumentList*);
@@ -259,11 +257,17 @@ class VhdlDocGen
     static void  writeRecorUnit(QCString & largs,OutputList& ol ,const MemberDef *mdef);
 };
 
+//-------------------------------------------------------------------------------------------------------------------
+//-------------- VHDL Flowcharts -------------------------------------------------------------------------------
+//-------------------------------------------------------------------------------------------------------------------
 
-class FlowNode
+
+//#define DEBUGFLOW
+
+class FlowChart
 {
   public:
-    enum nodeType {
+    enum nodeTypes {
       IF_NO        = 1<<1,
       ELSIF_NO     = 1<<2,
       ELSE_NO      = 1<<3,
@@ -282,9 +286,9 @@ class FlowNode
       RETURN_NO    = 1<<16,
       LOOP_NO      = 1<<17,
       NEXT_NO      = 1<<18,
-      EXIT_WHEN_NO = 1<<19,
-      NEXT_WHEN_NO = 1<<20,
-      EMPTY_NO     = 1<<21
+      EMPTY_NO     = 1<<19,
+      COMMENT_NO   = 1<<20,
+      BEGIN_NO     = 1<<21
     };
 
     //---------- create svg ------------------------------------------------------------- 
@@ -292,53 +296,48 @@ class FlowNode
     static void startDot(FTextStream &t);
     static void endDot(FTextStream &t);
     static void codify(FTextStream &t,const char *str);
-    static void writeShape(FTextStream &t,const FlowNode* fl);
-    static void writeEdge(FTextStream &t,int fl_from,int fl_to,int i);
-    static void writeEdge(FTextStream &t,const FlowNode* fl_from,const FlowNode* fl_to,int i);
-    //static void writeEndNode(FTextStream &t,const FlowNode* fl);
+    static void writeShape(FTextStream &t,const FlowChart* fl);
+    static void writeEdge(FTextStream &t,int fl_from,int fl_to,int i,bool bFrom=FALSE,bool bTo=FALSE);
+    static void writeEdge(FTextStream &t,const FlowChart* fl_from,const FlowChart* fl_to,int i);
     static void writeFlowLinks(FTextStream &t);
-    //static void writeStartNode(FTextStream &t,const FlowNode* fl);
-    static void checkNode(int);
-    static void checkNode(const FlowNode*);
 
     static QCString getNodeName(int n);
     static void colTextNodes();
 
-    static int getTextLink(const FlowNode* fl,uint index);
-    static int getNoLink(const FlowNode*,uint);
-    static int getNextNode(int);
+    static int getNextTextLink(const FlowChart* fl,uint index);
+    static int getNextIfLink(const FlowChart*,uint);
+    static int getNextNode(int,int);
     static int findNode(int index,int stamp,int type);
     static int findNode(int index,int type);
     static int findNextLoop(int j,int stamp);
-    static int findPrevLoop(int j,int stamp);
+    static int findPrevLoop(int j,int stamp,bool endif=FALSE);
     static int findLabel(int j,QCString &);
     static void delFlowList();
     static const char* getNodeType(int c);
 
-    static void addFlowNode(int type,const char* text,const char* exp,const char * label=NULL);
+    static void addFlowChart(int type,const char* text,const char* exp,const char * label=NULL);
     static void moveToPrevLevel();
-    static void printFlowList();
-    static void setLabel(const char* text);
     static int getTimeStamp();
-    static void printNodeList();
-    static void writeFlowNode();
+    static void writeFlowChart();
     static void alignFuncProc(QCString & q,const ArgumentList*  al,bool isFunc);
     static QCString convertNameToFileName();
+    static void printNode(const FlowChart* n);
+    static void printFlowTree();
+    static void buildCommentNodes(FTextStream &t);
+    static void alignCommentNode(FTextStream &t,QCString com);
 
-    static QList<FlowNode>  flowList;
-    static int ifcounter;
-    static int nodeCounter;
-    static int imageCounter;
-    static int caseCounter;
+    static QList<FlowChart> flowList;
 
-    FlowNode(int typ,const char*  t,const char* ex,const char* label=NULL);
-    ~FlowNode();
+    FlowChart(int typ,const char*  t,const char* ex,const char* label=0);
+    ~FlowChart();
 
 private:
     int id;
     int stamp;
     int type;
 
+    int line;
+
     QCString label;
     QCString text;
     QCString exp;
index a525666..3d3cc64 100644 (file)
@@ -1,3 +1,17 @@
+/******************************************************************************
+ *
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby 
+ * granted. No representations are made about the suitability of this software 
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
 
 /*********************************************************************************************
  * The original was a VHDL parser description to be used with GMD Compiler
@@ -39,6 +53,7 @@
 #include <stdio.h>
 #include <qcstring.h>
 #include <qstringlist.h>
+#include "config.h"
 
 #ifndef YYSTYPE
 typedef int YYSTYPE;
@@ -50,6 +65,9 @@ struct  YYMM
   QCString qstr;
 };
 
+
+
 // define struct instead of union
 #define YYSTYPE YYMM
 
@@ -62,13 +80,20 @@ struct  YYMM
 #include "entry.h"
 #include "arguments.h"
 #include "memberdef.h"
+#include "vhdldocgen.h"
 
 //-----------------------------variables ---------------------------------------------------------------------------
-//static MyParserVhdl* myconv=0;
+
+
+    
+
 
 static VhdlContainer s_str;
 
 static QList<Entry>instFiles;
+static QList<Entry>libUse;
+
+
 static int yyLineNr;
 static Entry* lastCompound;
 static Entry* currentCompound;
@@ -100,7 +125,7 @@ int vhdlScanYYlex ();
 void vhdlScanYYerror (char const *);
 
 static void addVhdlType(const QCString &name,int startLine,
-                        int section,int spec,
+                        int section,uint64 spec,
                        const char* args,const char* type,
                        Protection prot=Public);
 static void addCompInst(char *n, char* instName,char* comp,int line);
@@ -118,10 +143,10 @@ static bool isFuncProcProced();
 static void initEntry(Entry *e);
 static void addProto(const char *s1,const char *s2,const char *s3,
                      const char *s4,const char *s5,const char *s6);
-static void createFunction(const QCString &impure,int spec,
+static void createFunction(const QCString &impure,uint64 spec,
                            const QCString &fname);
 
-static void createFlow(QCString s);    
+static void createFlow();    
 
 void newVhdlEntry()
 {
@@ -142,6 +167,7 @@ void initVhdlParser()
   current_root=s_str.root;
   current=new Entry();
   initEntry(current);
+  libUse.clear();
 }
 
 QList<Entry> & getVhdlInstList()
@@ -149,6 +175,10 @@ QList<Entry> & getVhdlInstList()
   return instFiles;
 }
 
+QList<Entry> & getLibUse()
+{
+  return libUse;
+}
 
 %}
 
@@ -367,12 +397,13 @@ t_ToolDir
 
 
 %%
-start: design_file
-      | procs_stat
-      | subprog_body
-
+start: design_file 
+    
 
 design_file     : design_unit_list
+                    /* parse function/process/procedure for vhdlflow */
+                     | procs_stat
+                     | subprog_body
 
 design_unit_list: design_unit
                 | design_unit_list design_unit
@@ -400,7 +431,7 @@ physical_literal_1   : /* empty */        { $$=""; }
 physical_literal_no_default : t_AbstractLit t_Identifier   { $$=$1+" "+$2; }
 
 idf_list : t_Identifier { $$=$1; }
-         | idf_list t_Comma t_Identifier { $$=$1+","+$3}
+         | idf_list t_Comma t_Identifier { $$=$1+","+$3}
          ;
 
 /*------------------------------------------
@@ -427,9 +458,9 @@ context_item     : lib_clause
 
 lib_clause       : t_LIBRARY idf_list t_Semicolon
                  {
-                   if ( parse_sec == 0)
+                   if ( parse_sec==0 && Config_getBool("SHOW_INCLUDE_FILES") )
                    {
-                    addVhdlType($2,getParsedLine(t_LIBRARY),Entry::VARIABLE_SEC,VhdlDocGen::LIBRARY,$2.data(),"_library_");
+                     addVhdlType($2,getParsedLine(t_LIBRARY),Entry::VARIABLE_SEC,VhdlDocGen::LIBRARY,$2.data(),"_library_");
                    }
                    $$="library "+$2;
                  }
@@ -439,9 +470,9 @@ use_clause : t_USE sel_list t_Semicolon
                    QStringList ql1=QStringList::split(",",$2,FALSE);
                    for (uint j=0;j<ql1.count();j++)
                    {
-                     QStringList ql=QStringList::split(".",ql1[j],FALSE);
-                     QCString it=ql[1].utf8();
-                     if ( parse_sec == 0 )
+                     //QStringList ql=QStringList::split(".",ql1[j],FALSE);
+                     QCString it=ql1[j].utf8();
+                     if ( parse_sec==0 && Config_getBool("SHOW_INCLUDE_FILES") )
                      {
                        addVhdlType(it,getParsedLine(t_USE),Entry::VARIABLE_SEC,VhdlDocGen::USE,it.data(),"_use_");
                      }
@@ -487,13 +518,13 @@ entity_decl_2 : /* empty */  { $$=""; }
               | t_PORT { currP=VhdlDocGen::PORT; }  interf_list t_Semicolon  { currP=0; }
               ;
 entity_decl_1 :  /* empty */  { $$=""; }
-              | t_GENERIC { currP=VhdlDocGen::GENERIC;parse_sec=GEN_SEC} interf_list t_Semicolon{ currP=0;parse_sec=0; }
+              | t_GENERIC { currP=VhdlDocGen::GENERIC;parse_sec=GEN_SEC} interf_list t_Semicolon{ currP=0;parse_sec=0; }
               | t_GENERIC error t_Semicolon{ currP=0; }
               ;
 
 
-arch_body     : arch_start arch_body_1 t_BEGIN concurrent_stats t_END arch_body_2 t_Semicolon
-arch_body     : arch_start error t_END arch_body_2 t_Semicolon
+arch_body     : arch_start arch_body_1 t_BEGIN concurrent_stats t_END arch_body_2 t_Semicolon {lastCompound=0;}
+arch_body     : arch_start error t_END arch_body_2 t_Semicolon {lastCompound=0;}
 
 arch_start    : t_ARCHITECTURE t_Identifier t_OF t_Identifier t_IS
                 {
@@ -572,8 +603,8 @@ package_decl_22: gen_interface_list
 package_decl_22: gen_interface_list gen_assoc_list
 package_decl_22: gen_interface_list gen_assoc_list t_Semicolon
 
-package_body    : pack_body_start error t_END package_body_2 t_Semicolon
-package_body    : pack_body_start package_body_1 t_END package_body_2 t_Semicolon
+package_body    : pack_body_start error t_END package_body_2 t_Semicolon                   {lastCompound=0;}
+package_body    : pack_body_start package_body_1 t_END package_body_2 t_Semicolon {lastCompound=0;}
 pack_body_start : t_PACKAGE t_BODY t_Identifier t_IS
                       {
                         $$=$3;
@@ -601,24 +632,24 @@ common_decltve_item_1: package_body
 common_decltve_item_1: subprogram_instantiation_decl
 
 
-common_decltve_item: type_decl{$$=$1;}
-common_decltve_item: subtype_decl{$$=$1;}
-common_decltve_item: constant_decl{  $$=$1;}
-common_decltve_item: file_decl{$$=$1;}
-common_decltve_item: alias_decl{$$=$1;}
-common_decltve_item: subprog_decl{$$=$1;}
-common_decltve_item: use_clause {$$=$1;}
+common_decltve_item: type_decl{ $$=$1; }
+common_decltve_item: subtype_decl{ $$=$1; }
+common_decltve_item: constant_decl{  $$=$1; }
+common_decltve_item: file_decl{ $$=$1; }
+common_decltve_item: alias_decl{ $$=$1; }
+common_decltve_item: subprog_decl{ $$=$1; }
+common_decltve_item: use_clause { $$=$1; }
 
-entity_decltve_item: common_decltve_item  {$$=$1;}
-entity_decltve_item: subprog_body {$$=$1;}
-entity_decltve_item: attribute_decl {$$=$1;}
-entity_decltve_item: attribute_spec {$$=$1;}
-entity_decltve_item: disconnection_spec {$$=$1;}
-entity_decltve_item: signal_decl {$$=$1;}
-entity_decltve_item: variable_decl {$$=$1;}
-entity_decltve_item: group_template_declaration {$$=$1;}
-entity_decltve_item: group_declaration {$$=$1;}
-entity_decltve_item: common_decltve_item_1 {$$="";}
+entity_decltve_item: common_decltve_item  { $$=$1; }
+entity_decltve_item: subprog_body { $$=$1; }
+entity_decltve_item: attribute_decl { $$=$1; }
+entity_decltve_item: attribute_spec { $$=$1; }
+entity_decltve_item: disconnection_spec { $$=$1; }
+entity_decltve_item: signal_decl { $$=$1; }
+entity_decltve_item: variable_decl { $$=$1; }
+entity_decltve_item: group_template_declaration { $$=$1; }
+entity_decltve_item: group_declaration { $$=$1; }
+entity_decltve_item: common_decltve_item_1 { $$=""; }
 
 
 block_decltve_item: common_decltve_item 
@@ -632,8 +663,8 @@ block_decltve_item: signal_decl
 block_decltve_item: variable_decl
 block_decltve_item: group_template_declaration
 block_decltve_item: group_declaration
-block_decltve_item: common_decltve_item_1 {$$="";}
-block_decltve_item: tool_directive {$$="";}
+block_decltve_item: common_decltve_item_1 { $$=""; }
+block_decltve_item: tool_directive { $$=""; }
 
 block_declarative_part: block_decltve_item
                       | block_declarative_part  block_decltve_item
@@ -661,16 +692,16 @@ package_body_decltve_item: attribute_decl
 package_body_decltve_item: attribute_spec
 package_body_decltve_item: common_decltve_item_1
 
-subprog_decltve_item: common_decltve_item {$$=$1;}
-subprog_decltve_item: subprog_body  {$$="";}
-subprog_decltve_item: attribute_decl {$$=$1;}
-subprog_decltve_item: attribute_spec {$$=$1;}
-subprog_decltve_item: variable_decl {$$=$1;}
+subprog_decltve_item: common_decltve_item { $$=$1; }
+subprog_decltve_item: subprog_body  { $$=""; }
+subprog_decltve_item: attribute_decl { $$=$1; }
+subprog_decltve_item: attribute_spec { $$=$1; }
+subprog_decltve_item: variable_decl { $$=$1; }
 subprog_decltve_item: group_template_declaration
-subprog_decltve_item: group_declaration {$$="";}
-subprog_decltve_item: common_decltve_item_1 {$$="";}
+subprog_decltve_item: group_declaration { $$=""; }
+subprog_decltve_item: common_decltve_item_1 { $$=""; }
 
-procs_decltve_item: subprog_decltve_item {$$=$1;}
+procs_decltve_item: subprog_decltve_item { $$=$1; }
 
 config_decltve_item: attribute_spec    { $$=$1; }
 config_decltve_item: use_clause        { $$=$1; }
@@ -712,7 +743,6 @@ subprog_spec  :  t_FUNCTION designator
               subprog_spec_2 t_RETURN mark
               {
                 tempEntry=current;
-                current->bodyLine=getParsedLine(t_FUNCTION);
                 current->type=$6;
                 newEntry();
 
@@ -736,11 +766,19 @@ subprog_spec_2: subprog_spec_22
 
 subprog_spec_1: subprog_spec_2
 
-subprog_body: subprog_spec t_IS  subprog_body_1 t_BEGIN   seq_stats t_END subprog_body_2 t_Semicolon
+subprog_body: subprog_spec t_IS subprog_body_1 
     {
-               tempEntry->endBodyLine=s_str.yyLineNr;
-               createFlow($3);    
-                currP=0;
+      if ($3.data())
+      {
+        FlowChart::addFlowChart(FlowChart::VARIABLE_NO,$3,0);
+      }
+      FlowChart::addFlowChart(FlowChart::BEGIN_NO,"BEGIN",0);
+    } 
+    t_BEGIN seq_stats t_END subprog_body_2 t_Semicolon
+    {
+      tempEntry->endBodyLine=s_str.yyLineNr;
+      createFlow();    
+      currP=0;
     }
 subprog_body: subprog_spec t_IS error  t_END subprog_body_2 t_Semicolon
     {
@@ -754,11 +792,11 @@ subprog_body_2: t_PROCEDURE t_Identifier
 subprog_body_2: t_FUNCTION t_Identifier
 subprog_body_2: t_FUNCTION t_STRING
 
-subprog_body_1:  /* empty */ {$$="";}
+subprog_body_1:  /* empty */ { $$=""; }
 //subprog_body_1    :  subprogram_instantiation_decl
-subprog_body_1: subprog_body_1 subprog_body_3  {$$=$1+$2; }
+subprog_body_1: subprog_body_1 subprog_body_3  { $$=$1+$2; }
 
-subprog_body_3: subprog_decltve_item  {      $$=$1; }
+subprog_body_3: subprog_decltve_item  { $$=$1; }
                                                               
 /*--------------------------------------------------
 --  Interface Lists and Associaton Lists
@@ -881,19 +919,19 @@ shift_op: t_SLL { $$="sll"; }
         | t_ROR    { $$="ror"; }
         | t_ROL   { $$="rol"; }
         ;
-and_relation: relation shift_op relation {$$= $1+$2+$3; }
-and_relation: relation t_AND    relation  {$$= $1+" and "+$3; }
-and_relation: relation t_XOR    relation  {$$= $1+" xor "+$3; }
-and_relation: relation t_OR     relation  {$$= $1+" or "+$3; }
-and_relation: relation t_NOR    relation  {$$= $1+" nor "+$3; }
-and_relation: relation t_XNOR   relation  {$$= $1+"xnor"+$3; }
-and_relation: relation t_NAND   relation {$$= $1+"nand"+$3; }
-and_relation: and_relation t_NAND relation {$$= $1+"nand"+$3; }
-and_relation: and_relation t_NOR  relation{$$= $1+"nor"+$3; }
-and_relation: and_relation t_XNOR relation  {$$= $1+"nand"+$3; }
-and_relation: and_relation t_AND  relation {$$= $1+" and "+$3; }
-and_relation: and_relation t_OR   relation  {$$= $1+" or "+$3; }
-and_relation: and_relation t_XOR  relation  {$$= $1+" xor "+$3; }
+and_relation: relation shift_op relation { $$= $1+$2+$3; }
+and_relation: relation t_AND    relation  { $$= $1+" and "+$3; }
+and_relation: relation t_XOR    relation  { $$= $1+" xor "+$3; }
+and_relation: relation t_OR     relation  { $$= $1+" or "+$3; }
+and_relation: relation t_NOR    relation  { $$= $1+" nor "+$3; }
+and_relation: relation t_XNOR   relation  { $$= $1+"xnor"+$3; }
+and_relation: relation t_NAND   relation { $$= $1+"nand"+$3; }
+and_relation: and_relation t_NAND relation { $$= $1+"nand"+$3; }
+and_relation: and_relation t_NOR  relation{ $$= $1+"nor"+$3; }
+and_relation: and_relation t_XNOR relation  { $$= $1+"nand"+$3; }
+and_relation: and_relation t_AND  relation { $$= $1+" and "+$3; }
+and_relation: and_relation t_OR   relation  { $$= $1+" or "+$3; }
+and_relation: and_relation t_XOR  relation  { $$= $1+" xor "+$3; }
 
 /* ;relation   : unary_operator primary   */
 
@@ -908,25 +946,25 @@ relation: t_Minus primary t_DoubleStar primary { $$=$2+" ** "+$4; }
 
 /*   relation : relation binary_operator primary */
 
-relation: relation t_MOD   relation       { $$=$1+" mod  "+$3; }
-relation: relation t_REM   relation       { $$=$1+" rem "+$3;  }
-relation: relation t_Ampersand relation   { $$=$1+" & "+$3;    }
-relation: relation t_Star  relation       { $$=$1+" * "+$3;    }
-relation: relation t_Plus  relation       { $$=$1+" + "+$3;    }
-relation: relation t_Minus relation       { $$=$1+" -  "+$3;   }
-relation: relation t_LESym relation       { $$=$1+" <= "+$3;   }
-relation: relation t_GESym relation       { $$=$1+" >= "+$3;   }
-relation: relation t_LTSym relation       { $$=$1+" <  "+$3;   }
-relation: relation t_GTSym relation       { $$=$1+" >  "+$3;   }
-relation: relation t_EQSym relation       { $$=$1+" ==  "+$3;  }
-relation: relation t_NESym relation       { $$=$1+" != "+$3;   }
-relation: relation t_Slash relation       { $$=$1+" /"+$3;     }
-relation: relation t_QNEQU relation       { $$=$1+" ?/="+$3;   }
-relation: relation t_QEQU  relation       { $$=$1+" ?="+$3;    }
-relation: relation t_QL    relation       { $$=$1+" ?<"+$3;    }
-relation: relation t_QG    relation       { $$=$1+" ?>"+$3;    }
-relation: relation t_QLT   relation       { $$=$1+" ?<="+$3;   }
-relation: relation t_QGT   relation       { $$=$1+" ?>="+$3;   }
+relation: relation t_MOD   relation       { $$=$1+" mod "+$3; }
+relation: relation t_REM   relation       { $$=$1+" rem "+$3; }
+relation: relation t_Ampersand relation   { $$=$1+" & "+$3; }
+relation: relation t_Star  relation       { $$=$1+" * "+$3; }
+relation: relation t_Plus  relation       { $$=$1+" + "+$3; }
+relation: relation t_Minus relation       { $$=$1+" - "+$3; }
+relation: relation t_LESym relation       { $$=$1+" <= "+$3; }
+relation: relation t_GESym relation       { $$=$1+" >= "+$3; }
+relation: relation t_LTSym relation       { $$=$1+" < "+$3; }
+relation: relation t_GTSym relation       { $$=$1+" > "+$3; }
+relation: relation t_EQSym relation       { $$=$1+" = "+$3; }
+relation: relation t_NESym relation       { $$=$1+" != "+$3; }
+relation: relation t_Slash relation       { $$=$1+" / "+$3; }
+relation: relation t_QNEQU relation       { $$=$1+" ?/= "+$3; }
+relation: relation t_QEQU  relation       { $$=$1+" ?= "+$3; }
+relation: relation t_QL    relation       { $$=$1+" ?< "+$3; }
+relation: relation t_QG    relation       { $$=$1+" ?> "+$3; }
+relation: relation t_QLT   relation       { $$=$1+" ?<= "+$3; }
+relation: relation t_QGT   relation       { $$=$1+" ?>= "+$3; }
 
 simple_exp: t_Minus  term  { $$ = "-"+$2; }
           | t_Plus term    { $$ = "+"+$2; }
@@ -1072,7 +1110,7 @@ physical_type_definition_2: secondary_unit_decl  { $$=$1+"#"; }
 
 base_unit_decl: t_Identifier t_Semicolon { $$=$1; }
 
-secondary_unit_decl: t_Identifier t_EQSym physical_literal t_Semicolon { $$=$1+"="+$3 }
+secondary_unit_decl: t_Identifier t_EQSym physical_literal t_Semicolon { $$=$1+"="+$3; }
 
 unconstrained_array_definition: t_ARRAY t_LeftParen
                                 index_subtype_definition unconstrained_array_definition_1 t_RightParen t_OF
@@ -1084,8 +1122,8 @@ unconstrained_array_definition: t_ARRAY t_LeftParen
     }
 
 unconstrained_array_definition_1: { $$=""; }
-unconstrained_array_definition_1: unconstrained_array_definition_1 unconstrained_array_definition_2 { $$=$1+"  "+$2 }
-unconstrained_array_definition_2: t_Comma index_subtype_definition { $$=", "+$2 }
+unconstrained_array_definition_1: unconstrained_array_definition_1 unconstrained_array_definition_2 { $$=$1+"  "+$2; }
+unconstrained_array_definition_2: t_Comma index_subtype_definition { $$=", "+$2; }
 
 index_subtype_definition: mark t_RANGE t_Box { $$=$1+" range<> "; }
 
@@ -1247,14 +1285,14 @@ file_decl_1:  /* empty */   { $$=""; }
 file_decl_1: mode           { $$=$1; }
 
 disconnection_spec: t_DISCONNECT signal_list t_Colon mark t_AFTER expr t_Semicolon
-                                      { $$="disconnect "+$2+":"+$4+" after "+$6;}
+                                      { $$="disconnect "+$2+":"+$4+" after "+$6; }
                                       
-signal_list:   name signal_list_1 { $$=$1+$2;}
-signal_list:   t_OTHERS   { $$="others";}
-signal_list:   t_ALL             { $$="all";}
-signal_list_1:  /* empty */  { $$="";}
-signal_list_1: signal_list_1 signal_list_2    { $$=$1+$2;}
-signal_list_2: t_Comma name {$$=" , "+$2;}
+signal_list:   name signal_list_1 { $$=$1+$2; }
+signal_list:   t_OTHERS   { $$="others"; }
+signal_list:   t_ALL             { $$="all"; }
+signal_list_1:  /* empty */  { $$=""; }
+signal_list_1: signal_list_1 signal_list_2    { $$=$1+$2; }
+signal_list_2: t_Comma name { $$=" , "+$2; }
 
 /*--------------------------------------------------
 --  Attribute Declarations and Specifications
@@ -1273,7 +1311,7 @@ attribute_spec: t_ATTRIBUTE t_Identifier t_OF entity_spec t_IS expr t_Semicolon
                   $$="attribute "+att+";";
                 }
 
-entity_spec : entity_name_list signature  t_Colon entity_class { $$=$1+$2+":"+$4;    
+entity_spec : entity_name_list signature  t_Colon entity_class { $$=$1+$2+":"+$4; }    
 
 entity_name_list:   designator entity_name_list_1         { $$=$1+" "+$2; }
 entity_name_list:   t_OTHERS                              { $$="others";  }
@@ -1309,8 +1347,8 @@ entity_class: t_PROPERTY      { $$="property";      }
 
 if_generation_scheme: if_scheme { $$=$1; }
 
-if_scheme: t_IF expr t_GENERATE  generate_statement_body  if_scheme_1 if_scheme_2 {$$="";}
-if_scheme: t_IF lable expr t_GENERATE  generate_statement_body  if_scheme_1 if_scheme_2 {$$="";}
+if_scheme: t_IF expr t_GENERATE  generate_statement_body  if_scheme_1 if_scheme_2 { $$=""; }
+if_scheme: t_IF lable expr t_GENERATE  generate_statement_body  if_scheme_1 if_scheme_2 { $$=""; }
 
 if_scheme_2: /* empty */ { $$=""; }
 if_scheme_2: t_ELSE t_GENERATE  generate_statement_body { $$="else generate "+$3; }
@@ -1320,79 +1358,81 @@ if_scheme_1: if_scheme_1 if_scheme_3  { $$=$1+$2; }
 if_scheme_3: t_ELSIF expr t_GENERATE generate_statement_body { $$="elsif "+$2+" generate "+$4; }
 if_scheme_3: t_ELSIF lable expr t_GENERATE generate_statement_body  { $$="elsif "+$2+$3+" generate "+$5; }
 
-generation_scheme: for_scheme {$$=$1;}
+generation_scheme: for_scheme { $$=$1; }
 
-iteration_scheme: for_scheme     {$$=$1;}
-iteration_scheme: while_scheme {$$=$1;}
+iteration_scheme: for_scheme     { $$=$1; }
+iteration_scheme: while_scheme { $$=$1; }
 
 for_scheme: t_FOR t_Identifier t_IN discrete_range 
   {
- if(!lab.isEmpty())
-    $$=lab+" :for "+$2+" in "+$4;
-  else
-    $$=" for "+$2+" in "+$4;
-  FlowNode::addFlowNode(FlowNode::FOR_NO,0,$$,lab.data());
-  lab.resize(0);
+    if (!lab.isEmpty())
+    {
+      $$=lab+" :for "+$2+" in "+$4;
+    }
+    else
+    {
+      $$=" for "+$2+" in "+$4;
+    }
+    FlowChart::addFlowChart(FlowChart::FOR_NO,0,$$,lab.data());
+    lab.resize(0);
   }
 for_scheme: t_FOR lable t_Identifier t_IN discrete_range 
- {
- $$=lab+" for "+$2+$3+" in "+$5;
-   FlowNode::addFlowNode(FlowNode::FOR_NO,0,$$,lab.data());
- lab="";
- }
 {
   $$=lab+" for "+$2+$3+" in "+$5;
+    FlowChart::addFlowChart(FlowChart::FOR_NO,0,$$,lab.data());
   lab="";
 }
 
 while_scheme: t_WHILE expr {
-                                             $$=" while "+$2;
-                                              FlowNode::addFlowNode(FlowNode::WHILE_NO,0,$$,lab.data());
-                                              lab="";
-                                             }
+                             $$=" while "+$2;
+                             FlowChart::addFlowChart(FlowChart::WHILE_NO,0,$$,lab.data());
+                             lab="";
+                           }
 
 /*--------------------------------------------------
 --  Concurrent Statements
 ----------------------------------------------------*/
 
-concurrent_stats:   concurrent_stats_1 {$$=$1;}
-concurrent_stats_1: /* empty */             {$$="";}
-concurrent_stats_1: concurrent_stats_1 concurrent_stats_2 {$$=$1+$2;}
-concurrent_stats_2: concurrent_stat  {$$=$1;}
-
-concurrent_stat : block_stat                 {$$=$1;}
-                | concurrent_assertion_stat {$$=$1;}
-                | concurrent_procedure_call {$$=$1;}
-                | concurrent_signal_assign_stat {$$=$1;}
-                | comp_inst_stat         
-                                          {
-                                          QCString li=$1;
-                                          $$=$1;
-                                          
-                                          }
-                | generate_stat              {$$=$1;}
+concurrent_stats:   concurrent_stats_1      { $$=$1; }
+concurrent_stats_1: /* empty */             { $$=""; }
+concurrent_stats_1: concurrent_stats_1 concurrent_stats_2 { $$=$1+$2; }
+concurrent_stats_2: concurrent_stat         { $$=$1; }
+
+concurrent_stat : block_stat                { $$=$1; }
+                | concurrent_assertion_stat { $$=$1; }
+                | concurrent_procedure_call { $$=$1; }
+                | concurrent_signal_assign_stat { $$=$1; }
+                | comp_inst_stat            {
+                                              QCString li=$1;
+                                              $$=$1;
+                                            }
+                | generate_stat             { $$=$1; }
                 | procs_stat                   
 
-block_stat: t_Identifier t_Colon t_BLOCK  {pushLabel(genLabels,$1); }block_stat_0 block_stat_1 block_stat_2
+block_stat: t_Identifier t_Colon t_BLOCK { pushLabel(genLabels,$1); } block_stat_0 block_stat_1 block_stat_2
             block_stat_3 block_stat_4 t_BEGIN concurrent_stats t_END t_BLOCK block_stat_5
             t_Semicolon 
             {
               $$=$1+":block"; //+$4+$5+$6+$7+$8+"begin "+$10+" block "+$13;
               genLabels=popLabel(genLabels);
             }
-block_stat_5: /* empty */  {$$="";}
-block_stat_5: t_Identifier {$$=$1;}
-block_stat_4: /* empty */  {$$=""; }
-block_stat_4: block_stat_4 block_stat_6 {$$=$1+$2;}
-block_stat_6: block_decltve_item {$$=$1;}
-block_stat_3: /* empty */  {$$="";}
-block_stat_3: t_PORT interf_list t_Semicolon block_stat_7   {$$="port "+$2+";"+$4; }
-//block_sta_7:  /* empty */  {$$="";}
-block_stat_7: t_PORT t_MAP association_list t_Semicolon  {$$="port map "+$3; }
-block_stat_2: /* empty */  {$$="";}
-block_stat_2: t_GENERIC interf_list t_Semicolon block_stat_8  {$$="generic "+$2+";"+$4; }
-block_stat_8: /* empty */  {$$="";}
-block_stat_8: t_GENERIC t_MAP association_list t_Semicolon  {$$="generic map "+$3; }
-block_stat_1: /* empty */  {$$="";}
-block_stat_1: t_LeftParen expr t_RightParen  block_stat_0  {$$="("+$2+")"+$4; }
-block_stat_0: /* empty */  {$$=""; }
-block_stat_0: t_IS  {$$=" is ";}
+block_stat_5: /* empty */  { $$=""; }
+block_stat_5: t_Identifier { $$=$1; }
+block_stat_4: /* empty */  { $$=""; }
+block_stat_4: block_stat_4 block_stat_6 { $$=$1+$2; }
+block_stat_6: block_decltve_item { $$=$1; }
+block_stat_3: /* empty */  { $$=""; }
+block_stat_3: t_PORT interf_list t_Semicolon block_stat_7   { $$="port "+$2+";"+$4; }
+//block_sta_7:  /* empty */ { $$=""; }
+block_stat_7: t_PORT t_MAP association_list t_Semicolon     { $$="port map "+$3; }
+block_stat_2: /* empty */  { $$=""; }
+block_stat_2: t_GENERIC interf_list t_Semicolon block_stat_8 $$="generic "+$2+";"+$4; }
+block_stat_8: /* empty */  { $$=""; }
+block_stat_8: t_GENERIC t_MAP association_list t_Semicolon  { $$="generic map "+$3; }
+block_stat_1: /* empty */  { $$=""; }
+block_stat_1: t_LeftParen expr t_RightParen  block_stat_0  { $$="("+$2+")"+$4; }
+block_stat_0: /* empty */  { $$=""; }
+block_stat_0: t_IS  { $$=" is "; }
 
 dot_name: t_Identifier                 { $$=$1; }
         | dot_name  t_Dot t_Identifier { $$=$1+"."+$3; }
@@ -1407,93 +1447,93 @@ vcomp_stat: t_CONFIGURATION      { $$="configur
 vcomp_stat: t_ENTITY             { $$="entity";yyLineNr=s_str.iLine; }
 vcomp_stat: t_COMPONENT          { $$="component";yyLineNr=s_str.iLine; }
 
-comp_inst_stat:  t_Identifier   t_Colon  name   { yyLineNr=s_str.iLine; }     t_GENERIC t_MAP association_list comp_inst_stat_1 t_Semicolon
-                             {
-                                addCompInst($1.lower().data(),$3.lower().data(),0,yyLineNr);$$="";
+comp_inst_stat: t_Identifier t_Colon name { yyLineNr=s_str.iLine; }     t_GENERIC t_MAP association_list comp_inst_stat_1 t_Semicolon
+                               {
+                                 addCompInst($1.lower().data(),$3.lower().data(),0,yyLineNr);$$="";
+                               }
+comp_inst_stat: t_Identifier t_Colon name { yyLineNr=s_str.iLine; }    t_PORT t_MAP association_list t_Semicolon
+                               {
+                                 addCompInst($1.lower().data(),$3.lower().data(),0,yyLineNr);$$="222";
                                }
-comp_inst_stat:  t_Identifier   t_Colon     name   { yyLineNr=s_str.iLine; }    t_PORT t_MAP association_list t_Semicolon
-                              {
-                               addCompInst($1.lower().data(),$3.lower().data(),0,yyLineNr);$$="222";
-                             }
 
-comp_inst_stat:  t_Identifier  t_Colon   vcomp_stat  mark_comp    t_PORT t_MAP association_list t_Semicolon
-                             {
-                                  addCompInst($1.lower().data(),$4.lower().data(),$3.data(),yyLineNr);$$="";
-                              }
-comp_inst_stat:  t_Identifier  t_Colon  vcomp_stat   mark_comp        t_GENERIC t_MAP association_list comp_inst_stat_1 t_Semicolon
-                              {
-                                addCompInst($1.lower().data(),$4.lower().data(),$3.lower().data(),yyLineNr);$$="";
-                              }
-comp_inst_stat_1:  /* empty                                       {$$="";} */  
-comp_inst_stat_1: t_PORT t_MAP association_list //    {$$="port map"+$3;}
+comp_inst_stat: t_Identifier t_Colon vcomp_stat  mark_comp t_PORT t_MAP association_list t_Semicolon
+                               {
+                                 addCompInst($1.lower().data(),$4.lower().data(),$3.data(),yyLineNr);$$="";
+                               }
+comp_inst_stat: t_Identifier t_Colon vcomp_stat mark_comp t_GENERIC t_MAP association_list comp_inst_stat_1 t_Semicolon
+                               {
+                                 addCompInst($1.lower().data(),$4.lower().data(),$3.lower().data(),yyLineNr);$$="";
+                               }
+comp_inst_stat_1:  /* empty                                       { $$=""; } */  
+comp_inst_stat_1: t_PORT t_MAP association_list //    { $$="port map"+$3; }
 
-concurrent_assertion_stat:  t_Identifier t_Colon  assertion_stat  {$$=$1+":"+$3;}
-concurrent_assertion_stat:  assertion_stat              {$$=$1; }
+concurrent_assertion_stat:  t_Identifier t_Colon  assertion_stat  { $$=$1+":"+$3; }
+concurrent_assertion_stat:  assertion_stat              { $$=$1; }
 
-concurrent_assertion_stat:  t_Identifier t_Colon  t_POSTPONED  assertion_stat {$$=$1+":"+"postponed "+$4; }
-concurrent_assertion_stat:   t_POSTPONED assertion_stat {$$="postponed "+$2; }
+concurrent_assertion_stat:  t_Identifier t_Colon  t_POSTPONED  assertion_stat { $$=$1+":"+"postponed "+$4; }
+concurrent_assertion_stat:   t_POSTPONED assertion_stat { $$="postponed "+$2; }
 
-concurrent_procedure_call: t_Identifier t_Colon procedure_call_stat {$$=$1+":"+$3; }
-concurrent_procedure_call: procedure_call_stat {$$=$1;}
+concurrent_procedure_call: t_Identifier t_Colon procedure_call_stat { $$=$1+":"+$3; }
+concurrent_procedure_call: procedure_call_stat { $$=$1; }
 
-concurrent_procedure_call: t_Identifier t_Colon t_POSTPONED procedure_call_stat {$$=$1+":"+"postponed "+$4; }
-concurrent_procedure_call: t_POSTPONED procedure_call_stat {$$="postponed "+$2; }
+concurrent_procedure_call: t_Identifier t_Colon t_POSTPONED procedure_call_stat { $$=$1+":"+"postponed "+$4; }
+concurrent_procedure_call: t_POSTPONED procedure_call_stat { $$="postponed "+$2; }
 
-concurrent_signal_assign_stat: t_Identifier t_Colon condal_signal_assign {$$=$1+":"+$3; }
-concurrent_signal_assign_stat: condal_signal_assign  {$$=$1;}
+concurrent_signal_assign_stat: t_Identifier t_Colon condal_signal_assign { $$=$1+":"+$3; }
+concurrent_signal_assign_stat: condal_signal_assign  { $$=$1; }
 
-concurrent_signal_assign_stat: t_Identifier t_Colon  t_POSTPONED  condal_signal_assign {$$=$1+":"+"postponed "+$4; }
-concurrent_signal_assign_stat: t_POSTPONED  condal_signal_assign {$$="postponed "+$2; }
+concurrent_signal_assign_stat: t_Identifier t_Colon  t_POSTPONED  condal_signal_assign { $$=$1+":"+"postponed "+$4; }
+concurrent_signal_assign_stat: t_POSTPONED  condal_signal_assign { $$="postponed "+$2; }
 
-concurrent_signal_assign_stat: t_Identifier t_Colon t_POSTPONED sel_signal_assign {$$=$1+":"+"postponed "+$4; }
-concurrent_signal_assign_stat: t_POSTPONED sel_signal_assign {$$="postponed "+$2; }
+concurrent_signal_assign_stat: t_Identifier t_Colon t_POSTPONED sel_signal_assign { $$=$1+":"+"postponed "+$4; }
+concurrent_signal_assign_stat: t_POSTPONED sel_signal_assign { $$="postponed "+$2; }
 
-concurrent_signal_assign_stat: t_Identifier t_Colon sel_signal_assign  {$$=$1+":"+$3; }
-concurrent_signal_assign_stat: sel_signal_assign  {$$=$1; }
+concurrent_signal_assign_stat: t_Identifier t_Colon sel_signal_assign  { $$=$1+":"+$3; }
+concurrent_signal_assign_stat: sel_signal_assign  { $$=$1; }
 
-condal_signal_assign: target t_LESym opts   condal_wavefrms t_Semicolon {$$=$1+"<="+$3+$4; }
+condal_signal_assign: target t_LESym opts   condal_wavefrms t_Semicolon { $$=$1+"<="+$3+$4; }
 
-condal_wavefrms: wavefrm {$$=$1;}
-condal_wavefrms: wavefrm t_WHEN expr  {$$=$1+" when "+$3;}
-condal_wavefrms: wavefrm t_WHEN expr t_ELSE condal_wavefrms {$$=$1+" when "+$3+"else"+$5;}
+condal_wavefrms: wavefrm { $$=$1; }
+condal_wavefrms: wavefrm t_WHEN expr  { $$=$1+" when "+$3; }
+condal_wavefrms: wavefrm t_WHEN expr t_ELSE condal_wavefrms { $$=$1+" when "+$3+"else"+$5; }
 
-wavefrm:   wavefrm_element wavefrm_1 {$$=$1+$2;}
-wavefrm:   t_UNAFFECTED {$$="unaffected";}
-wavefrm_1: /* empty */  {$$="";}
-wavefrm_1: wavefrm_1 wavefrm_2 {$$=$1+$2;}
-wavefrm_2: t_Comma wavefrm_element {$$=","+$2;}
+wavefrm:   wavefrm_element wavefrm_1 { $$=$1+$2; }
+wavefrm:   t_UNAFFECTED { $$="unaffected"; }
+wavefrm_1: /* empty */  { $$=""; }
+wavefrm_1: wavefrm_1 wavefrm_2 { $$=$1+$2; }
+wavefrm_2: t_Comma wavefrm_element { $$=","+$2; }
 
-wavefrm_element:   expr wavefrm_element_1 {$$=$1+$2;}
-wavefrm_element_1: /* empty */ {$$="";}
-wavefrm_element_1: t_AFTER expr {$$="after "+$2;}
-wavefrm_element_1: t_NULL wavefrm_element_2 {$$=" null "+$2;}
-wavefrm_element_1: t_NULL {$$=" null ";}
-wavefrm_element_2: t_AFTER expr {$$="after "+$2;}
+wavefrm_element:   expr wavefrm_element_1 { $$=$1+$2; }
+wavefrm_element_1: /* empty */ { $$=""; }
+wavefrm_element_1: t_AFTER expr { $$="after "+$2; }
+wavefrm_element_1: t_NULL wavefrm_element_2 { $$=" null "+$2; }
+wavefrm_element_1: t_NULL { $$=" null "; }
+wavefrm_element_2: t_AFTER expr { $$="after "+$2; }
 
-target: name {$$=$1;}
-target: aggregate   {$$=$1;}
+target: name { $$=$1; }
+target: aggregate   { $$=$1; }
 
-opts: opts_1 opts_2   {$$=$1+$2;}
+opts: opts_1 opts_2   { $$=$1+$2; }
 
-opts_2: /* empty */  {$$="";}
-opts_2: t_TRANSPORT  {$$="transport ";}
-opts_2: t_REJECT expr t_INERTIAL  {$$="transport"+$2+" intertial ";}
-opts_2: t_INERTIAL  {$$=" intertial ";}
+opts_2: /* empty */  { $$=""; }
+opts_2: t_TRANSPORT  { $$="transport "; }
+opts_2: t_REJECT expr t_INERTIAL  { $$="transport"+$2+" intertial "; }
+opts_2: t_INERTIAL  { $$=" intertial "; }
 
-opts_1: /* empty */ {$$="";}
-opts_1: t_GUARDED {$$=" guarded ";}
+opts_1: /* empty */ { $$=""; }
+opts_1: t_GUARDED { $$=" guarded "; }
 
 sel_signal_assign: t_WITH expr t_SELECT target t_LESym opts sel_wavefrms t_Semicolon 
- {$$="with "+$2+" select "+$4+"<="+$6+$7;}
+ { $$="with "+$2+" select "+$4+"<="+$6+$7; }
  
-sel_wavefrms:   sel_wavefrms_1 wavefrm t_WHEN choices  {$$=$1+$2;}
-sel_wavefrms_1: /* empty */  {$$="";}
-sel_wavefrms_1: sel_wavefrms_1 sel_wavefrms_2 {$$=$1+$2;}
-sel_wavefrms_2: wavefrm t_WHEN choices t_Comma {$$=$1+" when "+$3;}
+sel_wavefrms:   sel_wavefrms_1 wavefrm t_WHEN choices  { $$=$1+$2; }
+sel_wavefrms_1: /* empty */  { $$=""; }
+sel_wavefrms_1: sel_wavefrms_1 sel_wavefrms_2 { $$=$1+$2; }
+sel_wavefrms_2: wavefrm t_WHEN choices t_Comma { $$=$1+" when "+$3; }
 
-gen_stat1: /* empty */  {$$="";}
-        |  block_declarative_part  t_BEGIN {$$=$1+" begin ";}
-        | t_BEGIN {$$="begin ";}
+gen_stat1: /* empty */  { $$=""; }
+        |  block_declarative_part  t_BEGIN { $$=$1+" begin "; }
+        | t_BEGIN { $$="begin "; }
 
  // problem with double end
  // end;
@@ -1512,7 +1552,7 @@ opstat: t_END generate_stat_1 t_Semicolon           {genLabels=popLabel(genLabel
 
 generate_stat: t_Identifier  t_Colon
                { pushLabel(genLabels,$1); }
-               if_generation_scheme opstat //    t_END   generate_stat_1 t_Semicolon { genLabels=popLabel(genLabels);}
+               if_generation_scheme opstat //    t_END   generate_stat_1 t_Semicolon { genLabels=popLabel(genLabels); }
 generate_stat: t_Identifier  t_Colon case_scheme
 
 generate_stat_1: t_GENERATE              { $$=""; }
@@ -1545,14 +1585,21 @@ procs_stat1: procs_stat1_5
                current->startLine=s_str.yyLineNr;
                current->bodyLine=s_str.yyLineNr;
                }
-               t_PROCESS procs_stat1_1 procs_stat1_2 t_BEGIN seq_stats t_END
+               t_PROCESS procs_stat1_1 procs_stat1_2
+               {
+                 if ($5.data())
+                  FlowChart::addFlowChart(FlowChart::VARIABLE_NO,$5.data(),0);
+                FlowChart::addFlowChart(FlowChart::BEGIN_NO,"BEGIN",0);
+               }
+               t_BEGIN seq_stats t_END
+
                procs_stat1_3 t_Semicolon
                { 
                 $5.stripPrefix($4.data());
                 tempEntry=current;
                 currP=0;
                 createFunction(currName,VhdlDocGen::PROCESS,$4.data());
-                createFlow($5);
+                createFlow();
                 currName="";
                }
 procs_stat1: error t_END procs_stat1_3  t_Semicolon { currP=0; }
@@ -1566,8 +1613,8 @@ procs_stat1_5: t_POSTPONED  { $$="postponed"; }
 procs_stat1_6:  /* empty */ { $$=""; }
 procs_stat1_6: t_Identifier { $$=$1; }
 
-procs_stat1_2:  /* empty */  {$$="";}
-procs_stat1_2:  t_IS {$$="";}   
+procs_stat1_2:  /* empty */  { $$=""; }
+procs_stat1_2:  t_IS { $$=""; }   
 procs_stat1_2: procs_stat1_2 procs_stat1_4   { $$+=$2; }
 procs_stat1_4: procs_decltve_item           { $$=$1; }
 procs_stat1_1:  /* empty */                                    { $$=""; }
@@ -1583,202 +1630,188 @@ sensitivity_list_2: t_Comma name                               { $$=","+$2; }
 --  Sequential Statements
 ----------------------------------------------------*/
 
-seq_stats:   seq_stats_1                         {$$=$1;}
-seq_stats_1: /* empty */                           {$$="";}
-seq_stats_1: seq_stats_1 seq_stats_2 {$$=$1+$2;}
-seq_stats_2: seq_stat                              {$$=$1;}
-
-seq_stat: assertion_stat                        {$$=$1; FlowNode::addFlowNode(FlowNode::TEXT_NO,$$.data(),0);}
-seq_stat: lable assertion_stat               {$$=$1+$2; FlowNode::addFlowNode(FlowNode::TEXT_NO,$$.data(),0);}
-seq_stat: case_stat                              {$$=$1;}
-seq_stat: exit_stat                                   {
-                                                                   $$=$1;
-                                                              }
-seq_stat: if_stat                                     {$$="";} 
-seq_stat: loop_stat                               {$$=$1;}
-seq_stat: next_stat                                  {
-                                                                $$=$1;
-                                                                }
-seq_stat: null_stat                                    {$$=$1; FlowNode::addFlowNode(FlowNode::TEXT_NO,$$.data(),0);}
-seq_stat: procedure_call_stat                   {$$=$1; FlowNode::addFlowNode(FlowNode::TEXT_NO,$$.data(),0);} 
-seq_stat: return_stat                                    {$$=$1; FlowNode::addFlowNode(FlowNode::RETURN_NO,$$.data(),0);}
-seq_stat: lable signal_assign_stat                    {$$=$1+$2;}
-seq_stat: signal_assign_stat                              
-                                                 {
-                                                   $$=$1;
-                                                    FlowNode::addFlowNode(FlowNode::TEXT_NO,$$.data(),0);
-                                                   }
-seq_stat: variable_assign_stat                             {   $$=$1;    FlowNode::addFlowNode(FlowNode::TEXT_NO,$$.data(),0);}
-seq_stat: wait_stat                                          {$$=$1; FlowNode::addFlowNode(FlowNode::TEXT_NO,$$.data(),0);}
-seq_stat: lable wait_stat                                     {$$=$1+$2; FlowNode::addFlowNode(FlowNode::TEXT_NO,$$.data(),0);}
-seq_stat: report_statement                              {$$=$1; FlowNode::addFlowNode(FlowNode::TEXT_NO,$$.data(),0);}
-
-report_statement: loop_stat_1 t_REPORT expr assertion_stat_2  t_Semicolon {$$=$1+"report "+$3+$4+";";  }
-
-assertion_stat: t_ASSERT expr assertion_stat_1 assertion_stat_2 t_Semicolon  {$$="assert "+$2+$3+$4+";";}
-assertion_stat_2:  /* empty */                    {$$="";}
-assertion_stat_2     : t_SEVERITY expr  {$$=" serverity "+$2;} 
-assertion_stat_1     :  /* empty */            {$$="";}
-assertion_stat_1     : t_REPORT expr  {$$=" report "+$2;}
-
-choice_stat :  /* empty */ {$$="";}
-choice_stat :  t_Q            {$$="?";}
-
-choice_stat_1:  /* empty */   {$$="";}
-choice_stat_1 :                  t_Q     {$$="?";}
-choice_stat_1 : t_Identifier  {$$=$1;}
+seq_stats: seq_stats_1               { $$=$1; }
+seq_stats_1: /* empty */             { $$=""; }
+seq_stats_1: seq_stats_1 seq_stats_2 { $$=$1+$2; }
+seq_stats_2: seq_stat                { $$=$1; }
+seq_stat: assertion_stat             { $$=$1;    FlowChart::addFlowChart(FlowChart::TEXT_NO,$$.data(),0); }
+seq_stat: lable assertion_stat       { $$=$1+$2; FlowChart::addFlowChart(FlowChart::TEXT_NO,$$.data(),0); }
+seq_stat: case_stat                  { $$=$1; }
+seq_stat: exit_stat                  { $$=$1; }
+seq_stat: if_stat                    { $$=""; } 
+seq_stat: loop_stat                  { $$=$1; }
+seq_stat: next_stat                  { $$=$1; }
+seq_stat: null_stat                  { $$=$1; FlowChart::addFlowChart(FlowChart::TEXT_NO,$$.data(),0); }
+seq_stat: procedure_call_stat        { $$=$1; FlowChart::addFlowChart(FlowChart::TEXT_NO,$$.data(),0); } 
+seq_stat: return_stat                { $$=$1; FlowChart::addFlowChart(FlowChart::RETURN_NO,$$.data(),0); }
+seq_stat: lable signal_assign_stat   { $$=$1+$2; }
+seq_stat: signal_assign_stat         { $$=$1; FlowChart::addFlowChart(FlowChart::TEXT_NO,$$.data(),0); }
+seq_stat: variable_assign_stat       { $$=$1; FlowChart::addFlowChart(FlowChart::TEXT_NO,$$.data(),0); }
+seq_stat: wait_stat                  { $$=$1; FlowChart::addFlowChart(FlowChart::TEXT_NO,$$.data(),0); }
+seq_stat: lable wait_stat            { $$=$1+$2; FlowChart::addFlowChart(FlowChart::TEXT_NO,$$.data(),0); }
+seq_stat: report_statement           { $$=$1; FlowChart::addFlowChart(FlowChart::TEXT_NO,$$.data(),0); }
+
+report_statement: loop_stat_1 t_REPORT expr assertion_stat_2  t_Semicolon { $$=$1+"report "+$3+$4+";";  }
+
+assertion_stat: t_ASSERT expr assertion_stat_1 assertion_stat_2 t_Semicolon  { $$="assert "+$2+$3+$4+";"; }
+assertion_stat_2:  /* empty */                    { $$=""; }
+assertion_stat_2     : t_SEVERITY expr  { $$=" serverity "+$2; } 
+assertion_stat_1     :  /* empty */            { $$=""; }
+assertion_stat_1     : t_REPORT expr  { $$=" report "+$2; }
+
+choice_stat :  /* empty */ { $$=""; }
+choice_stat :  t_Q            { $$="?"; }
+
+choice_stat_1:  /* empty */   { $$=""; }
+choice_stat_1 :                  t_Q     { $$="?"; }
+choice_stat_1 : t_Identifier  { $$=$1; }
 
 
 case_stat  : t_CASE choice_stat expr 
                    {
                      QCString ca="case "+$2+$3;
-                    FlowNode::addFlowNode(FlowNode::CASE_NO,0,ca);
+                     FlowChart::addFlowChart(FlowChart::CASE_NO,0,ca);
                    }                 
-                     t_IS case_stat_alternative case_stat_1 t_END t_CASE choice_stat_1  t_Semicolon
-                    
-                     FlowNode::addFlowNode(FlowNode::END_CASE,"end case",0);
-                     FlowNode::moveToPrevLevel();
-                    }
+                   t_IS case_stat_alternative case_stat_1 t_END t_CASE choice_stat_1  t_Semicolon
+                   { 
+                     FlowChart::moveToPrevLevel();
+                     FlowChart::addFlowChart(FlowChart::END_CASE,"end case",0);
+                   }
           
 
 case_stat  : lable t_CASE choice_stat expr
                    {
-                   QCString ca="case "+$3+$4;
-                   FlowNode::addFlowNode(FlowNode::CASE_NO,0,ca);
+                     QCString ca="case "+$3+$4;
+                     FlowChart::addFlowChart(FlowChart::CASE_NO,0,ca);
                    } 
-                    t_IS case_stat_alternative case_stat_1 t_END t_CASE choice_stat_1  t_Semicolon
-                    {
-                     FlowNode::addFlowNode(FlowNode::END_CASE,0,0);
-                    FlowNode::moveToPrevLevel();
-                    }
+                   t_IS case_stat_alternative case_stat_1 t_END t_CASE choice_stat_1  t_Semicolon
+                   {
+                     FlowChart::moveToPrevLevel();
+             
+                     FlowChart::addFlowChart(FlowChart::END_CASE,0,0);
+                   }
 
-case_stat  : t_CASE error t_END t_CASE choice_stat_1  t_Semicolon  {$$="";}
-case_stat_1     :  /* empty */                          {$$="";}
-case_stat_1     : case_stat_1 case_stat_2  {$$=$1+$2;}
-case_stat_2     : case_stat_alternative         {$$=$1;}
+case_stat       : t_CASE error t_END t_CASE choice_stat_1  t_Semicolon  { $$=""; }
+case_stat_1     :  /* empty */             { $$=""; }
+case_stat_1     : case_stat_1 case_stat_2  { $$=$1+$2; }
+case_stat_2     : case_stat_alternative    { $$=$1; }
 case_stat_alternative     : t_WHEN choices t_Arrow
- { 
-  QCString t="when ";
-  t+=$2+"=> ";
-   FlowNode::addFlowNode(FlowNode::WHEN_NO,0,t);
 
+    QCString t="when ";
+    t+=$2+"=> ";
+    FlowChart::addFlowChart(FlowChart::WHEN_NO,$2.data(),t);
   }
-seq_stats  {$$="";}
-
+  seq_stats { $$=""; FlowChart::moveToPrevLevel(); }
 
-
-if_stat    : t_IF expr  t_THEN
+if_stat: t_IF expr t_THEN
   {
-     $2.prepend("if ");
-    FlowNode::addFlowNode(FlowNode::IF_NO,0,$2);
+    $2.prepend("if ");
+    FlowChart::addFlowChart(FlowChart::IF_NO,0,$2);
   }  
   seq_stats   
  
   if_stat_1 if_stat_2 t_END t_IF t_Semicolon 
   {
-  FlowNode::addFlowNode(FlowNode::ENDIF_NO,0,0);
-   FlowNode::moveToPrevLevel();
+    FlowChart::moveToPrevLevel();
+    FlowChart::addFlowChart(FlowChart::ENDIF_NO,0,0);
   } 
      
-if_stat_2  :  /* empty */                 {$$=""; }
+if_stat_2  :  /* empty */             $$=""; }
 if_stat_2  : t_ELSE    
-   {
-      FlowNode::addFlowNode(FlowNode::ELSE_NO,0,0);
-    } seq_stats  {$$=""; }
+  {
+    FlowChart::addFlowChart(FlowChart::ELSE_NO,0,0);
+  } 
+  seq_stats   { $$=""; }
+
  
 
-if_stat_1  :  /* empty */                  {$$=""; }
-if_stat_1  : if_stat_1 if_stat_3      {$$=$1+$2; }
+if_stat_1  :  /* empty */             $$=""; }
+if_stat_1  : if_stat_1 if_stat_3      { $$=$1+$2; }
 if_stat_3  : t_ELSIF expr t_THEN 
   { 
-   $2.prepend("elsif ");
-   FlowNode::addFlowNode(FlowNode::ELSIF_NO,0,$2.data());
-  } seq_stats {$$="";}
+    $2.prepend("elsif ");
+    FlowChart::addFlowChart(FlowChart::ELSIF_NO,0,$2.data());
+  } seq_stats { $$=""; }
   
 loop_stat:   loop_stat_1 loop_stat_2 t_LOOP seq_stats t_END t_LOOP loop_stat_3 t_Semicolon
-                    {
-                      
-                       $$=$1+$2+" loop "+$4+" end loop" +$7;
-                       QCString endLoop="end loop" + $7;
-                        FlowNode::addFlowNode(FlowNode::END_LOOP,endLoop.data(),0);
-                        FlowNode::moveToPrevLevel();
-                     }
+  {
+    $$=$1+$2+" loop "+$4+" end loop" +$7;
+    QCString endLoop="end loop" + $7;
+    FlowChart::moveToPrevLevel();
+    FlowChart::addFlowChart(FlowChart::END_LOOP,endLoop.data(),0);
+  }
 
-loop_stat_3: /* empty */ {$$=""; }
-loop_stat_3: t_Identifier {$$=$1; }
-loop_stat_2: /* empty */ {
-                                     $$=""; 
-                                      FlowNode::addFlowNode(FlowNode::LOOP_NO,0,"infinite loop");
-                                     }
+loop_stat_3: /* empty */ { $$=""; }
+loop_stat_3: t_Identifier { $$=$1; }
+loop_stat_2: /* empty */ { $$=""; 
+                           FlowChart::addFlowChart(FlowChart::LOOP_NO,0,"infinite loop");
+                         }
 loop_stat_2: iteration_scheme
-loop_stat_1: /* empty */ {$$=""; }
-loop_stat_1: t_Identifier t_Colon {$$=$1+":";lab=$1;}
+loop_stat_1: /* empty */ { $$=""; }
+loop_stat_1: t_Identifier t_Colon { $$=$1+":";lab=$1; }
 
 exit_stat  : loop_stat_1 t_EXIT exit_stat_1 exit_stat_2 t_Semicolon   
                        {
-                         $$=$1+"exit "+$3+";";
-                        if($4.data())
-                             FlowNode::addFlowNode(FlowNode::EXIT_WHEN_NO,0,$4.data(),0);                                                                      
-                    
-                              FlowNode::addFlowNode(FlowNode::EXIT_NO,$$.data(),0,$3.data());                                                       
-                        }
-exit_stat_2     :  /* empty */        {$$="";}
-exit_stat_2     : t_WHEN expr  {$$="when "+$2;}
-exit_stat_1     :  /* empty */    {$$="";}
-exit_stat_1     : t_Identifier    {$$=$1;lab=$$;}
+                         FlowChart::addFlowChart(FlowChart::EXIT_NO,"exit",$4.data(),$3.data()); 
+                         lab.resize(0);
+                       }
+exit_stat_2     :  /* empty */    { $$=""; }
+exit_stat_2     : t_WHEN expr     { $$="when "+$2; }
+exit_stat_1     :  /* empty */    { $$=""; }
+exit_stat_1     : t_Identifier    { $$=$1;lab=$$; }
 
 
 next_stat: loop_stat_1  t_NEXT next_stat_1 next_stat_2 t_Semicolon
-                   {
-                     $$=$1+"next "+$3+";" ;
-                         if($4.data())
-                             FlowNode::addFlowNode(FlowNode::EXIT_WHEN_NO,0,$4.data(),0); 
-                       FlowNode::addFlowNode(FlowNode::NEXT_NO,$$.data(),0,$3.data());   
-                    }
+                       {
+                         FlowChart::addFlowChart(FlowChart::NEXT_NO,"next ",$4.data(),$3.data()); 
+                         lab.resize(0);
+                       }
                     
-next_stat_2:  /* empty */      {$$=""; }
-next_stat_2: t_WHEN expr {$$="when "+$2; }
-next_stat_1:  /* empty */      {$$=""; }
-next_stat_1: t_Identifier      {$$=$1;lab=$$; }
+next_stat_2:  /* empty */      { $$=""; }
+next_stat_2: t_WHEN expr { $$="when "+$2; }
+next_stat_1:  /* empty */      { $$=""; }
+next_stat_1: t_Identifier      { $$=$1;lab=$$; }
 
-null_stat: t_NULL t_Semicolon {$$="null"; $$+=";";}
+null_stat: t_NULL t_Semicolon { $$="null"; $$+=";"; }
 
 procedure_call_stat: name t_Semicolon 
  {
- $$=$1+";"; 
  $$=$1+";"; 
  }
 
-return_stat:   t_RETURN return_stat_1 t_Semicolon {$$="return "+$2+";"  ;}
-return_stat_1: /* empty */  {$$=""; }
-return_stat_1:   expr {$$=$1; }
+return_stat:   t_RETURN return_stat_1 t_Semicolon { $$="return "+$2+";"  ; }
+return_stat_1: /* empty */  { $$=""; }
+return_stat_1:   expr { $$=$1; }
 
-signal_assign_stat: target t_LESym wavefrm t_Semicolon                     {$$=$1+" <="+$3+";"  ;}
-                  | target t_LESym delay_mechanism wavefrm t_Semicolon   {$$=$1+ "<= "+$3+$4 +";";}
-                  | target t_LESym t_FORCE inout_stat  expr t_Semicolon     {$$=$1+ "<= "+ " force  "+$4+";" ;}
-                  | target t_LESym t_RELEASE inout_stat t_Semicolon          {$$=$1+ "<= "+" release "+$4 +";";}
-                  | selected_signal_assignment                                                  {$$=$1; }
-                  | conditional_signal_assignment                                               {$$=$1; }
+signal_assign_stat: target t_LESym wavefrm t_Semicolon                   { $$=$1+" <="+$3+";"  ; }
+                  | target t_LESym delay_mechanism wavefrm t_Semicolon   { $$=$1+ "<= "+$3+$4 +";"; }
+                  | target t_LESym t_FORCE inout_stat  expr t_Semicolon  { $$=$1+ "<= "+ " force  "+$4+";" ; }
+                  | target t_LESym t_RELEASE inout_stat t_Semicolon      { $$=$1+ "<= "+" release "+$4 +";"; }
+                  | selected_signal_assignment                           $$=$1; }
+                  | conditional_signal_assignment                        $$=$1; }
                   ;
 
-variable_assign_stat: variable_assign_stat_1 t_Semicolon   {$$=$1+";"; }
-                    | conditional_variable_assignment                       {$$=$1; }
-                    | lable selected_variable_assignment                  {$$=$1; }
-                    | selected_variable_assignment                           {$$=$1; }
+variable_assign_stat: variable_assign_stat_1 t_Semicolon                 { $$=$1+";"; }
+                    | conditional_variable_assignment                    $$=$1; }
+                    | lable selected_variable_assignment                 $$=$1; }
+                    | selected_variable_assignment                       $$=$1; }
 
 lable: t_Identifier t_Colon                                              { $$=$1+":"; }
-variable_assign_stat_1: target t_VarAsgn expr           {$$=$1+":="+$3; }
-variable_assign_stat_1: lable target t_VarAsgn expr  {$$=$1+$2+":="+$4; }
+variable_assign_stat_1: target t_VarAsgn expr                            { $$=$1+":="+$3; }
+variable_assign_stat_1: lable target t_VarAsgn expr                      { $$=$1+$2+":="+$4; }
 
 wait_stat:   t_WAIT wait_stat_1 wait_stat_2 wait_stat_3 t_Semicolon
                   {
                      $$="wait "+$2+$3+$4+";";
                   }
 
-wait_stat_3: /* empty */          {$$=""; }
-wait_stat_3: t_FOR expr       {$$="for "+$2; } 
-wait_stat_2: /* empty */          {$$=""; }
-wait_stat_2: t_UNTIL expr     {$$=" until "+$2; }
-wait_stat_1: /* empty */          {$$=""; }
-wait_stat_1: t_ON sensitivity_list  {$$=" on "+$2; }
+wait_stat_3: /* empty */            { $$=""; }
+wait_stat_3: t_FOR expr             { $$="for "+$2; } 
+wait_stat_2: /* empty */            { $$=""; }
+wait_stat_2: t_UNTIL expr           { $$=" until "+$2; }
+wait_stat_1: /* empty */            { $$=""; }
+wait_stat_1: t_ON sensitivity_list  { $$=" on "+$2; }
 
 
 /*--------------------------------------------------
@@ -1787,7 +1820,7 @@ wait_stat_1: t_ON sensitivity_list  {$$=" on "+$2; }
 comp_end_dec : t_END                              { lastEntity=0; lastCompound=0; genLabels.resize(0); }
              | t_END t_COMPONENT entity_decl_5
              | t_END t_ARCHITECTURE entity_decl_5 { lastCompound=0; genLabels.resize(0); }
-             | t_END t_ENTITY entity_decl_5       { lastEntity=0; genLabels.resize(0); }
+             | t_END t_ENTITY entity_decl_5       { lastEntity=0;lastCompound=0; genLabels.resize(0); }
              | t_END t_Identifier                 { lastEntity=0; lastCompound=0; genLabels.resize(0); }
 
 iss :/*empty*/ { currP=VhdlDocGen::COMPONENT; }
@@ -1803,7 +1836,7 @@ comp_decl_2: t_PORT interf_list t_Semicolon    { $$=$2; }
 comp_decl_1:  /* empty */                      { $$=""; }
 comp_decl_1: t_GENERIC interf_list t_Semicolon { $$=$2; }
 
-block_config: t_FOR block_spec block_config_1 block_config_2 { levelCounter--;}  t_END t_FOR t_Semicolon
+block_config: t_FOR block_spec block_config_1 block_config_2 { levelCounter--; }  t_END t_FOR t_Semicolon
           {
           }
 
@@ -1879,11 +1912,11 @@ inst_list: t_OTHERS  { $$="others"; }
 
 binding_indic   : entity_aspect binding_indic_1 binding_indic_2 { $$=$1; }
 
-binding_indic_2: {$$="";}
-binding_indic_2: t_PORT t_MAP association_list  {$$="port map "+$3;}
+binding_indic_2: { $$=""; }
+binding_indic_2: t_PORT t_MAP association_list  { $$="port map "+$3; }
 
-binding_indic_1: {$$="";}
-binding_indic_1: t_GENERIC t_MAP association_list {$$="generic map "+$3;}
+binding_indic_1: { $$=""; }
+binding_indic_1: t_GENERIC t_MAP association_list { $$="generic map "+$3; }
 
 
 entity_aspect: t_ENTITY name { $$="entity "+$2; }
@@ -1915,7 +1948,7 @@ group_template_declaration :  t_GROUP  t_Identifier t_IS  t_LeftParen  entity_cl
 group_template_declaration: t_GROUP  t_Identifier t_IS  t_LeftParen error t_Semicolon  t_RightParen{ $$=""; }
  
 
-entity_class_entry : entity_class tbox {$$=$1+$2;}
+entity_class_entry : entity_class tbox { $$=$1+$2; }
 
 tbox :  /* empty */ { $$="";   }
 tbox :  t_Box       { $$="<>"; }
@@ -2063,8 +2096,8 @@ when_stats:   when_stats_1
 ttend: t_END t_Semicolon
 ttend: t_END t_Identifier t_Semicolon
 
-conditional_signal_assignment: conditional_waveform_assignment {$$="";}
-conditional_signal_assignment: conditional_force_assignment {$$="";}
+conditional_signal_assignment: conditional_waveform_assignment { $$=""; }
+conditional_signal_assignment: conditional_force_assignment { $$=""; }
 
 conditional_waveform_assignment: target t_LESym wavefrm_element t_WHEN expr else_wave_list t_Semicolon
 conditional_waveform_assignment: target t_LESym delay_mechanism wavefrm_element t_WHEN expr else_wave_list t_Semicolon
@@ -2078,8 +2111,8 @@ else_wave_list: t_ELSE expr
 conditional_force_assignment:  target t_LESym t_FORCE  inout_stat expr t_WHEN expr else_stat t_Semicolon
 conditional_force_assignment:  target t_LESym t_FORCE  inout_stat expr t_WHEN expr t_Semicolon
 
-selected_signal_assignment : selected_waveform_assignment {$$="";}
-selected_signal_assignment : selected_force_assignment {$$="";}
+selected_signal_assignment : selected_waveform_assignment { $$=""; }
+selected_signal_assignment : selected_force_assignment { $$=""; }
 
 selected_waveform_assignment: t_WITH expr t_SELECT choice_stat
                               target t_LESym delay_stat sel_wave_list
@@ -2095,13 +2128,13 @@ sel_wave_list_1: wavefrm_element  t_WHEN choices t_Semicolon
 selected_force_assignment: t_WITH expr t_SELECT choice_stat target t_LESym t_FORCE
                                                   inout_stat sel_var_list
 
-inout_stat: /* empty */ {$$="";}
-inout_stat: t_IN   {$$=" in ";}
-inout_stat: t_OUT {$$="out";}
+inout_stat: /* empty */ { $$=""; }
+inout_stat: t_IN   { $$=" in "; }
+inout_stat: t_OUT { $$="out"; }
 
-delay_mechanism : t_TRANSPORT { $$=" transport ";}
-                | t_REJECT expr t_INERTIAL { $$=" reject "+$2+"inertial ";}
-                |  t_INERTIAL { $$=" inertial ";}
+delay_mechanism : t_TRANSPORT { $$=" transport "; }
+                | t_REJECT expr t_INERTIAL { $$=" reject "+$2+"inertial "; }
+                |  t_INERTIAL { $$=" inertial "; }
 
 conditional_variable_assignment : variable_assign_stat_1 t_WHEN expr else_stat t_Semicolon
 conditional_variable_assignment : variable_assign_stat_1 t_WHEN expr t_Semicolon
@@ -2110,7 +2143,7 @@ else_stat: t_ELSE expr t_WHEN expr
 else_stat: else_stat t_ELSE expr t_WHEN expr
 else_stat: t_ELSE expr
 
-selected_variable_assignment: t_WITH expr t_SELECT choice_stat select_name t_VarAsgn sel_var_list {$$="";}
+selected_variable_assignment: t_WITH expr t_SELECT choice_stat select_name t_VarAsgn sel_var_list { $$=""; }
 
 sel_var_list: expr t_WHEN choices t_Comma  sel_var_list
 sel_var_list: sel_var_list_1
@@ -2232,8 +2265,8 @@ extern YYSTYPE vhdlScanYYlval;
 
 void vhdlScanYYerror(const char* /*str*/)
 {
-  //  fprintf(stderr,"\n<---error at line %d  : [ %s]   in file : %s ---->",s_str.yyLineNr,s_str.qstr.data(),s_str.fileName);
-  //   exit(0);
+  // fprintf(stderr,"\n<---error at line %d  : [ %s]   in file : %s ---->",s_str.yyLineNr,s_str.qstr.data(),s_str.fileName);
+  //  exit(0);
 }
 
 void vhdlParse()
@@ -2311,7 +2344,7 @@ static QCString  popLabel(QCString & q)
 
 static void addConfigureNode(const char* a,const char*b, bool,bool isLeaf,bool inlineConf)
 {
-  VhdlConfNode* co;
+  VhdlConfNode* co=0;
   QCString ent,arch,lab;
   QCString l=genLabels;
   ent=a;
@@ -2328,7 +2361,9 @@ static void addConfigureNode(const char* a,const char*b, bool,bool isLeaf,bool i
   {
     VhdlConfNode* vc=configL.last();
     level=vc->level;
-    if (level<levelCounter)
+    if (levelCounter==0)
+      pushLabel(forL,ent);
+    else if (level<levelCounter)
     {
       if (!isLeaf)
       {
@@ -2426,10 +2461,10 @@ static void addProto(const char *s1,const char *s2,const char *s3,
   }
 }
 
-static void createFunction(const QCString &impure,int spec,
+static void createFunction(const QCString &impure,uint64 spec,
     const QCString &fname)
 {
-  int it=0;
+
   current->spec=spec;
   current->section=Entry::FUNCTION_SEC;
 
@@ -2448,17 +2483,15 @@ static void createFunction(const QCString &impure,int spec,
   {
     current->name=impure;
     current->exception="";
-    it=t_PROCEDURE;
   }
   else
   {
     current->name=fname;
-    it=t_FUNCTION;
   }
 
   if (spec==VhdlDocGen::PROCESS)
   {
-    it=t_PROCESS;
+
     current->args=fname;
     current->name=impure;
     VhdlDocGen::deleteAllChars(current->args,' ');
@@ -2475,20 +2508,18 @@ static void createFunction(const QCString &impure,int spec,
     return;
   }
 
-  current->startLine=getParsedLine(it);
-  current->bodyLine=getParsedLine(it);
+  current->startLine=s_str.iLine;
+  current->bodyLine=s_str.iLine;
+
 }
 
-static void addVhdlType(const QCString &name,int startLine,int section,int spec,
-    const char* args,const char* type,Protection prot)
+static void addVhdlType(const QCString &name,int startLine,int section,
+    uint64 spec,const char* args,const char* type,Protection prot)
 {
   static QRegExp reg("[\\s]");
 
-  if (isFuncProcProced() || VhdlDocGen::getFlowMember())
-  {
-    return;
-  }
-
+  if (isFuncProcProced() || VhdlDocGen::getFlowMember())   return;
+    
   if (parse_sec==GEN_SEC)
   {
     spec= VhdlDocGen::GENERIC;
@@ -2500,10 +2531,7 @@ static void addVhdlType(const QCString &name,int startLine,int section,int spec,
   for (uint u=0;u<ql.count();u++)
   {
     current->name=ql[u].utf8();
-    //   if (section==Entry::VARIABLE_SEC &&  !(spec == VhdlDocGen::USE || spec == VhdlDocGen::LIBRARY) )
-    //   {
-    //     current->name.prepend(VhdlDocGen::getRecordNumber());
-    //   }
+  
 
     current->startLine=startLine;
     current->bodyLine=startLine;
@@ -2518,17 +2546,20 @@ static void addVhdlType(const QCString &name,int startLine,int section,int spec,
     current->type=type;
     current->type.replace(reg,"%"); // insert dummy chars because white spaces are removed
     current->protection=prot;
+       if (!lastCompound && (section==Entry::VARIABLE_SEC) &&  (spec == VhdlDocGen::USE || spec == VhdlDocGen::LIBRARY) )
+       {
+         libUse.append(new Entry(*current));
+         current->reset();
+       }
     newEntry();
   }
 }
 
 static void newEntry()
 {
-  if (current->spec==VhdlDocGen::ENTITY       ||
-      current->spec==VhdlDocGen::PACKAGE      ||
-      current->spec==VhdlDocGen::ARCHITECTURE ||
-      current->spec==VhdlDocGen::PACKAGE_BODY
-     )
+
+  if (VhdlDocGen::isVhdlClass(current))
   {
     current_root->addSubEntry(current);
   }
@@ -2554,7 +2585,7 @@ static void newEntry()
   initEntry(current);
 }
 
-void createFlow(QCString val)
+void createFlow()
 {
   if (!VhdlDocGen::getFlowMember()) 
   {
@@ -2565,13 +2596,13 @@ void createFlow(QCString val)
   if (currP==VhdlDocGen::FUNCTION)
   {
     q=":function( ";
-    FlowNode::alignFuncProc(q,tempEntry->argList,true);
+    FlowChart::alignFuncProc(q,tempEntry->argList,true);
     q+=")";
   }
   else if (currP==VhdlDocGen::PROCEDURE)
   {
     q=":procedure (";    
-    FlowNode::alignFuncProc(q,tempEntry->argList,false);
+    FlowChart::alignFuncProc(q,tempEntry->argList,false);
     q+=")";
   }
   else  
@@ -2582,12 +2613,7 @@ void createFlow(QCString val)
 
   q.prepend(VhdlDocGen::getFlowMember()->name().data());
 
-  FlowNode::addFlowNode(FlowNode::START_NO,q,0);
-
-  if (!val.isEmpty())
-  {
-    FlowNode::addFlowNode(FlowNode::VARIABLE_NO,val,0);
-  }
+  FlowChart::addFlowChart(FlowChart::START_NO,q,0);
 
   if (currP==VhdlDocGen::FUNCTION)
   {
@@ -2602,9 +2628,9 @@ void createFlow(QCString val)
     ret="end process ";
   }
 
-  FlowNode::addFlowNode(FlowNode::END_NO,ret,0);
-  //  FlowNode::printFlowList();
-  FlowNode::writeFlowNode();  
+  FlowChart::addFlowChart(FlowChart::END_NO,ret,0);
+  //  FlowChart::printFlowList();
+  FlowChart::writeFlowChart();  
   currP=0;
 }
 
index c1192cf..12c2d13 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -28,7 +28,7 @@
 #include <unistd.h>
 #include <qfile.h>
 #include <qdict.h>
-
+#include "vhdldocgen.h"
 #include "entry.h"
 
 class Entry;
@@ -48,9 +48,13 @@ class VHDLLanguageScanner : public ParserInterface
 {
   public:
     virtual ~VHDLLanguageScanner() {}
+    void startTranslationUnit(const char *) {}
+    void finishTranslationUnit() {}
     void parseInput(const char * fileName, 
                     const char *fileBuf, 
-                    Entry *root);
+                    Entry *root,
+                    bool sameTranslationUnit,
+                    QStrList &filesInSameTranslationUnit);
     bool needsPreprocessing(const QCString &extension);
     void parseCode(CodeOutputInterface &codeOutIntf,
                    const char *scopeName,
@@ -129,8 +133,13 @@ void vhdlParse();
 // return the list of component instantiations e.g. foo: component bar 
 QList<Entry> &  getVhdlInstList();
 
-// returns the list of found configurations
+// returns   configuration list
 QList<VhdlConfNode>& getVhdlConfiguration();
 
+// returns library/used list
+QList<Entry> &  getLibUse();
+
 void isVhdlDocPending();
+
+
 #endif
index 898713e..934a985 100644 (file)
@@ -96,7 +96,7 @@ static QMap<QCString, int> keyMap;
 static QList<Entry>  lineEntry;
 static bool  checkMultiComment(QCString& qcs,int line);
 static void handleCommentBlock(const QCString &doc,bool brief);
-static void mapLibPackage(const Entry* ce);
+static void mapLibPackage(Entry* ce);
 static QList<Entry>* getEntryAtLine(const Entry* ce,int line);
 static bool addLibUseClause(const QCString &type);
 static Entry* oldEntry;
@@ -532,11 +532,18 @@ BR                         [ \t\n\r]
          {
            REJECT;
          }
+          else if (qcs.stripPrefix("--#"))
+          {
+            if (VhdlDocGen::getFlowMember())
+            {
+              FlowChart::addFlowChart(FlowChart::COMMENT_NO,0,0,qcs.data());
+            }
+          }
         }               
 .      { /* unknown characters */ }
                                                                        
 
-<*>{BR}*"--!"[^{}\n][^\n]*\n/{B}*"--!" { // multi line comment
+<*>{BR}*"--!"[^{}\n]*[^\n]*\n/{B}*"--!" { // multi line comment
   if (iDocLine==-1) iDocLine=yyLineNr;
   QCString qc(vhdlScanYYtext);
   int len=qc.contains('\n')+yyLineNr-1;
@@ -733,7 +740,11 @@ void VHDLLanguageScanner::parsePrototype(const char *text)
 //  return token;
 //}
 
-void VHDLLanguageScanner::parseInput(const char *fileName,const char *fileBuf,Entry *root)
+void VHDLLanguageScanner::parseInput(const char *fileName,
+                                     const char *fileBuf,
+                                     Entry *root,
+                                     bool /*sameTranslationUnit*/,
+                                     QStrList & /*filesInSameTranslationUnit*/)
 {
   yyFileName=QCString(fileName);
 
@@ -812,73 +823,43 @@ void VHDLLanguageScanner::parseCode(CodeOutputInterface &codeOutIntf,
  * .....
  * and so on..
  */
-static void mapLibPackage(const Entry* ce)
+static void mapLibPackage( Entry* root)
 {
-  Entry *lastComp=0;
-  while (TRUE)
+  QList<Entry> epp=getLibUse();
+  EntryListIterator eli(epp);
+  Entry *rt;
+  for (;(rt=eli.current());++eli)
   {
-    bool found = FALSE;
-    Entry *rt=0;
-    //const QList<Entry> *epp=ce->children();
-    EntryListIterator eli(*ce->children());
-    EntryListIterator eli1=eli;
-    for (;(rt=eli.current()),eli1=eli;++eli)
+    if (addLibUseClause(rt->name))
     {
-      if (rt->spec==VhdlDocGen::LIBRARY || rt->spec==VhdlDocGen::USE)
-        // top level library or use statement
+      Entry *current;
+      EntryListIterator eLib(*root->children());
+      bool bFound=FALSE;
+      for (eLib.toFirst();(current=eLib.current());++eLib)
       {
-        Entry *temp=0;
-        if(!addLibUseClause(rt->name))
-        {
-          rt->spec=-1;
-          rt->section=0;
-          //  continue;
-        }
-
-        for (;(temp=eli1.current());++eli1) // find next entity
-        {
-          if (temp->spec==VhdlDocGen::ENTITY || 
-              temp->spec==VhdlDocGen::PACKAGE || 
-              temp->spec==VhdlDocGen::ARCHITECTURE || 
-              temp->spec==VhdlDocGen::PACKAGE_BODY)
+        if (VhdlDocGen::isVhdlClass(current))
+          if (current->startLine > rt->startLine)
           {
-            Entry *ee=new Entry(*rt); //append a copy to entries sublist
-            temp->addSubEntry(ee);
-            found=TRUE;
-            rt->spec=-1; //nullify entry
-            rt->section=0;
-            lastComp=temp;
-            break;
+            bFound=TRUE;
+            current->addSubEntry(rt);
+            break;     
           }
-        }//for
-        if (lastComp && rt->spec!=-1)
-        {
-          Entry *ee=new Entry(*rt); //append a copy to entries sublist
-          lastComp->addSubEntry(ee);
-          found=TRUE;
-          rt->spec=-1; //nullify entry
-          rt->section=0;
-        }
-      }//if
-    }//for
-    if (!found) // nothing left to do
-    {
-      return; 
-    }
-  }//while
+      }//for
+      if (!bFound)
+      {
+        root->addSubEntry(rt);
+      }
+    } //if
+  }// for
+
+  epp.clear();
 }//MapLib
 
 static bool addLibUseClause(const QCString &type)
 {
-  static bool show=Config_getBool("SHOW_INCLUDE_FILES");
   static bool showIEEESTD=Config_getBool("FORCE_LOCAL_INCLUDES");
 
-  if (!show)  // all libraries and included packages will not  be shown
-  {
-    return FALSE;
-  }
-
-  if (!showIEEESTD) // all standard packages and libraries will not be shown
+  if (showIEEESTD) // all standard packages and libraries will not be shown
   {  
     if (type.lower().stripPrefix("ieee")) return FALSE;
     if (type.lower().stripPrefix("std")) return FALSE;
@@ -983,7 +964,9 @@ int getParsedLine(int object)
 void isVhdlDocPending()
 {
   if (!str_doc.pending)
+  {
     return;
+  }
   str_doc.pending=FALSE;
   oldEntry=0; // prevents endless recursion
   iDocLine=str_doc.iDocLine;
index 05da2a0..5bae376 100644 (file)
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -173,7 +173,7 @@ void XmlDocVisitor::visit(DocSymbol *s)
     case DocSymbol::LeftFloor:     m_t << "<lfloor>"; break;
     case DocSymbol::RightFloor:    m_t << "<rfloor>"; break;
     default:
-                             err("error: unknown symbol found\n");
+                             err("unknown symbol found\n");
   }
 }
 
@@ -283,6 +283,11 @@ void XmlDocVisitor::visit(DocVerbatim *s)
     case DocVerbatim::XmlOnly: 
       m_t << s->text();
       break;
+    case DocVerbatim::DocbookOnly:
+      m_t << "<docbookonly>";
+      filter(s->text());
+      m_t << "</docbookonly>";
+      break;
     case DocVerbatim::Dot: 
       m_t << "<dot>";
       filter(s->text());
@@ -835,7 +840,10 @@ void XmlDocVisitor::visitPost(DocLink *)
 void XmlDocVisitor::visitPre(DocRef *ref)
 {
   if (m_hide) return;
-   if (!ref->file().isEmpty()) startLink(ref->ref(),ref->file(),ref->anchor());
+  if (!ref->file().isEmpty()) 
+  {
+    startLink(ref->ref(),ref->file(),ref->isSubPage() ? QCString() : ref->anchor());
+  }
   if (!ref->hasLinkText()) filter(ref->targetTitle());
 }
 
@@ -1056,6 +1064,7 @@ void XmlDocVisitor::filter(const char *str)
 
 void XmlDocVisitor::startLink(const QCString &ref,const QCString &file,const QCString &anchor)
 {
+  //printf("XmlDocVisitor: file=%s anchor=%s\n",file.data(),anchor.data());
   m_t << "<ref refid=\"" << file;
   if (!anchor.isEmpty()) m_t << "_1" << anchor;
   m_t << "\" kindref=\"";
index 77242a1..42290cc 100644 (file)
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 07ea086..b1bfc9c 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -81,6 +81,8 @@ class XmlSectionMapper : public QIntDict<char>
       insert(MemberListType_dcopMethods,"dcop-func");
       insert(MemberListType_properties,"property");
       insert(MemberListType_events,"event");
+      insert(MemberListType_interfaces,"interfaces");
+      insert(MemberListType_services,"services");
       insert(MemberListType_pubStaticMethods,"public-static-func");
       insert(MemberListType_pubStaticAttribs,"public-static-attrib");
       insert(MemberListType_proTypes,"protected-type");
@@ -140,7 +142,7 @@ inline void writeXMLCodeString(FTextStream &t,const char *s, int &col)
       case '&':  t << "&amp;"; col++;  break;
       case '\'': t << "&apos;"; col++; break; 
       case '"':  t << "&quot;"; col++; break;
-      default:   t << c; col++;        break;         
+      default:   s=writeUtf8Char(t,s-1); col++; break;         
     }
   } 
 }
@@ -221,59 +223,6 @@ class TextGeneratorXMLImpl : public TextGeneratorIntf
     FTextStream &m_t;
 };
 
-/** Helper class representing a stack of objects stored by value */
-template<class T> class ValStack
-{
-  public:
-    ValStack() : m_values(10), m_sp(0), m_size(10) {}
-    virtual ~ValStack() {}
-    ValStack(const ValStack<T> &s)
-    {
-      m_values=s.m_values.copy();
-      m_sp=s.m_sp;
-      m_size=s.m_size;
-    }
-    ValStack &operator=(const ValStack<T> &s)
-    {
-      m_values=s.m_values.copy();
-      m_sp=s.m_sp;
-      m_size=s.m_size;
-      return *this;
-    }
-    void push(T v)
-    {
-      m_sp++;
-      if (m_sp>=m_size)
-      {
-        m_size+=10;
-        m_values.resize(m_size);
-      }
-      m_values[m_sp]=v;
-    }
-    T pop()
-    {
-      ASSERT(m_sp!=0);
-      return m_values[m_sp--];
-    }
-    T& top()
-    {
-      ASSERT(m_sp!=0);
-      return m_values[m_sp];
-    }
-    bool isEmpty()
-    {
-      return m_sp==0;
-    }
-    uint count() const
-    {
-      return m_sp;
-    }
-    
-  private:
-    QArray<T> m_values;
-    int m_sp;
-    int m_size;
-};
 
 /** Generator for producing XML formatted source code. */
 class XMLCodeGenerator : public CodeOutputInterface
@@ -306,7 +255,7 @@ class XMLCodeGenerator : public CodeOutputInterface
         m_normalHLNeedStartTag=FALSE;
       }
       writeXMLLink(m_t,ref,file,anchor,name,tooltip);
-      col+=strlen(name);
+      col+=qstrlen(name);
     }
     void startCodeLine(bool) 
     {
@@ -401,9 +350,6 @@ class XMLCodeGenerator : public CodeOutputInterface
         if (extRef) m_external=extRef;
       }
     }
-    void linkableSymbol(int, const char *,Definition *,Definition *) 
-    {
-    }
     void setCurrentDoc(Definition *,const char *,bool)
     {
     }
@@ -471,10 +417,10 @@ static void writeTemplateArgumentList(ArgumentList *al,
 
 static void writeMemberTemplateLists(MemberDef *md,FTextStream &t)
 {
-  LockingPtr<ArgumentList> templMd = md->templateArguments();
-  if (templMd!=0) // function template prefix
+  ArgumentList *templMd = md->templateArguments();
+  if (templMd) // function template prefix
   {
-    writeTemplateArgumentList(templMd.pointer(),t,md->getClassDef(),md->getFileDef(),8);
+    writeTemplateArgumentList(templMd,t,md->getClassDef(),md->getFileDef(),8);
   }
 }
 
@@ -493,7 +439,7 @@ static void writeXMLDocBlock(FTextStream &t,
   QCString stext = text.stripWhiteSpace();
   if (stext.isEmpty()) return;
   // convert the documentation string into an abstract syntax tree
-  DocNode *root = validatingParseDoc(fileName,lineNr,scope,md,text+"\n",FALSE,FALSE);
+  DocNode *root = validatingParseDoc(fileName,lineNr,scope,md,text,FALSE,FALSE);
   // create a code generator
   XMLCodeGenerator *xmlCodeGen = new XMLCodeGenerator(t);
   // create a parse tree visitor for XML
@@ -614,17 +560,19 @@ static void generateXMLForMember(MemberDef *md,FTextStream &ti,FTextStream &t,De
   switch (md->memberType())
   {
     case MemberType_Define:      memType="define";    break;
-    case MemberType_EnumValue:   ASSERT(0);           break;
-    case MemberType_Property:    memType="property";  break;
-    case MemberType_Event:       memType="event";     break;
+    case MemberType_Function:    memType="function";  isFunc=TRUE; break;
     case MemberType_Variable:    memType="variable";  break;
     case MemberType_Typedef:     memType="typedef";   break;
     case MemberType_Enumeration: memType="enum";      break;
-    case MemberType_Function:    memType="function";  isFunc=TRUE; break;
+    case MemberType_EnumValue:   ASSERT(0);           break;
     case MemberType_Signal:      memType="signal";    isFunc=TRUE; break;
+    case MemberType_Slot:        memType="slot";      isFunc=TRUE; break;
     case MemberType_Friend:      memType="friend";    isFunc=TRUE; break;
     case MemberType_DCOP:        memType="dcop";      isFunc=TRUE; break;
-    case MemberType_Slot:        memType="slot";      isFunc=TRUE; break;
+    case MemberType_Property:    memType="property";  break;
+    case MemberType_Event:       memType="event";     break;
+    case MemberType_Interface:   memType="interface"; break;
+    case MemberType_Service:     memType="service";   break;
   }
 
   ti << "    <member refid=\"" << memberOutputFileBase(md) 
@@ -666,7 +614,7 @@ static void generateXMLForMember(MemberDef *md,FTextStream &ti,FTextStream &t,De
 
   if (isFunc)
   {
-    LockingPtr<ArgumentList> al = md->argumentList();
+    ArgumentList *al = md->argumentList();
     t << " const=\"";
     if (al!=0 && al->constSpecifier)    t << "yes"; else t << "no"; 
     t << "\"";
@@ -729,7 +677,47 @@ static void generateXMLForMember(MemberDef *md,FTextStream &ti,FTextStream &t,De
     {
       t << " initonly=\"yes\"";
     }
-    
+
+    if (md->isAttribute())
+    {
+      t << " attribute=\"yes\"";
+    }
+    if (md->isUNOProperty())
+    {
+      t << " property=\"yes\"";
+    }
+    if (md->isReadonly())
+    {
+      t << " readonly=\"yes\"";
+    }
+    if (md->isBound())
+    {
+      t << " bound=\"yes\"";
+    }
+    if (md->isRemovable())
+    {
+      t << " removable=\"yes\"";
+    }
+    if (md->isConstrained())
+    {
+      t << " constrained=\"yes\"";
+    }
+    if (md->isTransient())
+    {
+      t << " transient=\"yes\"";
+    }
+    if (md->isMaybeVoid())
+    {
+      t << " maybevoid=\"yes\"";
+    }
+    if (md->isMaybeDefault())
+    {
+      t << " maybedefault=\"yes\"";
+    }
+    if (md->isMaybeAmbiguous())
+    {
+      t << " maybeambiguous=\"yes\"";
+    }
   }
   else if (md->memberType() == MemberType_Property)
   {
@@ -817,8 +805,8 @@ static void generateXMLForMember(MemberDef *md,FTextStream &ti,FTextStream &t,De
       << memberOutputFileBase(rmd) << "_1" << rmd->anchor() << "\">"
       << convertToXML(rmd->name()) << "</reimplements>" << endl;
   }
-  LockingPtr<MemberList> rbml = md->reimplementedBy();
-  if (rbml!=0)
+  MemberList *rbml = md->reimplementedBy();
+  if (rbml)
   {
     MemberListIterator mli(*rbml);
     for (mli.toFirst();(rmd=mli.current());++mli)
@@ -831,9 +819,9 @@ static void generateXMLForMember(MemberDef *md,FTextStream &ti,FTextStream &t,De
 
   if (isFunc) //function
   {
-    LockingPtr<ArgumentList> declAl = md->declArgumentList();
-    LockingPtr<ArgumentList> defAl = md->argumentList();
-    if (declAl!=0 && declAl->count()>0)
+    ArgumentList *declAl = md->declArgumentList();
+    ArgumentList *defAl = md->argumentList();
+    if (declAl && declAl->count()>0)
     {
       ArgumentListIterator declAli(*declAl);
       ArgumentListIterator defAli(*defAl);
@@ -926,8 +914,8 @@ static void generateXMLForMember(MemberDef *md,FTextStream &ti,FTextStream &t,De
   
   if (md->memberType()==MemberType_Enumeration) // enum
   {
-    LockingPtr<MemberList> enumFields = md->enumFieldList();
-    if (enumFields!=0)
+    MemberList *enumFields = md->enumFieldList();
+    if (enumFields)
     {
       MemberListIterator emli(*enumFields);
       MemberDef *emd;
@@ -979,7 +967,8 @@ static void generateXMLForMember(MemberDef *md,FTextStream &ti,FTextStream &t,De
   {
     t << "        <location file=\"" 
       << md->getDefFileName() << "\" line=\"" 
-      << md->getDefLine() << "\"";
+      << md->getDefLine() << "\"" << " column=\"" 
+      << md->getDefColumn() << "\"" ;
     if (md->getStartBodyLine()!=-1)
     {
       FileDef *bodyDef = md->getBodyDef();
@@ -994,8 +983,8 @@ static void generateXMLForMember(MemberDef *md,FTextStream &ti,FTextStream &t,De
   }
 
   //printf("md->getReferencesMembers()=%p\n",md->getReferencesMembers());
-  LockingPtr<MemberSDict> mdict = md->getReferencesMembers();
-  if (mdict!=0)
+  MemberSDict *mdict = md->getReferencesMembers();
+  if (mdict)
   {
     MemberSDict::Iterator mdi(*mdict);
     MemberDef *rmd;
@@ -1005,7 +994,7 @@ static void generateXMLForMember(MemberDef *md,FTextStream &ti,FTextStream &t,De
     }
   }
   mdict = md->getReferencedByMembers();
-  if (mdict!=0)
+  if (mdict)
   {
     MemberSDict::Iterator mdi(*mdict);
     MemberDef *rmd;
@@ -1434,7 +1423,8 @@ static void generateXMLForClass(ClassDef *cd,FTextStream &ti)
   }
   t << "    <location file=\"" 
     << cd->getDefFileName() << "\" line=\"" 
-    << cd->getDefLine() << "\"";
+    << cd->getDefLine() << "\"" << " column=\"" 
+    << cd->getDefColumn() << "\"" ;
     if (cd->getStartBodyLine()!=-1)
     {
       FileDef *bodyDef = cd->getBodyDef();
@@ -1526,9 +1516,10 @@ static void generateXMLForNamespace(NamespaceDef *nd,FTextStream &ti)
   t << "    <detaileddescription>" << endl;
   writeXMLDocBlock(t,nd->docFile(),nd->docLine(),nd,0,nd->documentation());
   t << "    </detaileddescription>" << endl;
-  t << "    <location file=\"" 
-    << nd->getDefFileName() << "\" line=\"" 
-    << nd->getDefLine() << "\"/>" << endl;
+  t << "    <location file=\""
+    << nd->getDefFileName() << "\" line=\""
+    << nd->getDefLine() << "\"" << " column=\""
+    << nd->getDefColumn() << "\"/>" << endl ;
   t << "  </compounddef>" << endl;
   t << "</doxygen>" << endl;
 
@@ -1842,10 +1833,26 @@ static void generateXMLForPage(PageDef *pd,FTextStream &ti,bool isExample)
   t << "    <compoundname>" << convertToXML(pd->name()) 
     << "</compoundname>" << endl;
 
-  SectionInfo *si = Doxygen::sectionDict->find(pd->name());
-  if (si)
+  if (pd==Doxygen::mainPage) // main page is special
   {
-    t << "    <title>" << convertToXML(si->title) << "</title>" << endl;
+    QCString title;
+    if (!pd->title().isEmpty() && pd->title().lower()!="notitle")
+    {
+      title = filterTitle(Doxygen::mainPage->title());
+    }
+    else 
+    {
+      title = Config_getString("PROJECT_NAME");
+    }
+    t << "    <title>" << convertToXML(title) << "</title>" << endl;
+  }
+  else
+  {
+    SectionInfo *si = Doxygen::sectionDict->find(pd->name());
+    if (si)
+    {
+      t << "    <title>" << convertToXML(si->title) << "</title>" << endl;
+    }
   }
   writeInnerPages(pd->getSubPages(),t);
   t << "    <detaileddescription>" << endl;
@@ -1869,7 +1876,6 @@ static void generateXMLForPage(PageDef *pd,FTextStream &ti,bool isExample)
 
 void generateXML()
 {
-
   // + classes
   // + namespaces
   // + files
@@ -1878,42 +1884,6 @@ void generateXML()
   // - examples
   
   QCString outputDirectory = Config_getString("XML_OUTPUT");
-  if (outputDirectory.isEmpty())
-  {
-    outputDirectory=QDir::currentDirPath().utf8();
-  }
-  else
-  {
-    QDir dir(outputDirectory);
-    if (!dir.exists())
-    {
-      dir.setPath(QDir::currentDirPath());
-      if (!dir.mkdir(outputDirectory))
-      {
-        err("error: tag XML_OUTPUT: Output directory `%s' does not "
-            "exist and cannot be created\n",outputDirectory.data());
-        exit(1);
-      }
-      else if (!Config_getBool("QUIET"))
-      {
-        err("notice: Output directory `%s' does not exist. "
-            "I have created it for you.\n", outputDirectory.data());
-      }
-      dir.cd(outputDirectory);
-    }
-    outputDirectory=dir.absPath().utf8();
-  }
-
-  QDir dir(outputDirectory);
-  if (!dir.exists())
-  {
-    dir.setPath(QDir::currentDirPath());
-    if (!dir.mkdir(outputDirectory))
-    {
-      err("Cannot create directory %s\n",outputDirectory.data());
-      return;
-    }
-  }
   QDir xmlDir(outputDirectory);
   createSubDirs(xmlDir);
   QCString fileName=outputDirectory+"/index.xsd";
@@ -1923,7 +1893,7 @@ void generateXML()
     err("Cannot open file %s for writing!\n",fileName.data());
     return;
   }
-  f.writeBlock(index_xsd,strlen(index_xsd));
+  f.writeBlock(index_xsd,qstrlen(index_xsd));
   f.close();
 
   fileName=outputDirectory+"/compound.xsd";
@@ -1933,7 +1903,7 @@ void generateXML()
     err("Cannot open file %s for writing!\n",fileName.data());
     return;
   }
-  f.writeBlock(compound_xsd,strlen(compound_xsd));
+  f.writeBlock(compound_xsd,qstrlen(compound_xsd));
   f.close();
 
   fileName=outputDirectory+"/index.xml";
index 9193956..b89b10f 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 7a0e734..fb4ae8d 100644 (file)
@@ -50,7 +50,7 @@
                        />
                        <Tool
                                Name="VCMIDLTool"
-                               TypeLibraryName=".\Debug/Doxygen.tlb"
+                               TypeLibraryName=".\Debug\Doxygen.tlb"
                                HeaderFileName=""
                        />
                        <Tool
                        <Tool
                                Name="VCMIDLTool"
                                TargetEnvironment="3"
-                               TypeLibraryName=".\Debug64/Doxygen.tlb"
+                               TypeLibraryName=".\Debug64\Doxygen.tlb"
                                HeaderFileName=""
                        />
                        <Tool
                        />
                        <Tool
                                Name="VCMIDLTool"
-                               TypeLibraryName=".\Release/Doxygen.tlb"
+                               TypeLibraryName=".\Release\Doxygen.tlb"
                                HeaderFileName=""
                        />
                        <Tool
                        <Tool
                                Name="VCMIDLTool"
                                TargetEnvironment="3"
-                               TypeLibraryName=".\Release64/Doxygen.tlb"
+                               TypeLibraryName=".\Release64\Doxygen.tlb"
                                HeaderFileName=""
                        />
                        <Tool
                                >
                        </File>
                        <File
+                               RelativePath="..\src\clangparser.cpp"
+                               >
+                       </File>
+                       <File
                                RelativePath="..\src\classdef.cpp"
                                >
                                <FileConfiguration
                                </FileConfiguration>
                        </File>
                        <File
+                               RelativePath="..\src\docbookgen.cpp"
+                               >
+                       </File>
+                       <File
+                               RelativePath="..\src\docbookvisitor.cpp"
+                               >
+                       </File>
+                       <File
                                RelativePath="..\src\docparser.cpp"
                                >
                                <FileConfiguration
                                >
                        </File>
                        <File
+                               RelativePath="..\src\sqlite3gen.cpp"
+                               >
+                       </File>
+                       <File
                                RelativePath="..\src\tagreader.cpp"
                                >
                                <FileConfiguration
                                >
                        </File>
                        <File
+                               RelativePath="..\src\clangparser.h"
+                               >
+                       </File>
+                       <File
                                RelativePath="..\src\classdef.h"
                                >
                        </File>
                                >
                        </File>
                        <File
+                               RelativePath="..\src\docbookgen.h"
+                               >
+                       </File>
+                       <File
+                               RelativePath="..\src\docbookvisitor.h"
+                               >
+                       </File>
+                       <File
                                RelativePath="..\src\docparser.h"
                                >
                        </File>