From 745526b6e9683de926af27c4313574a514a3d7c3 Mon Sep 17 00:00:00 2001
From: Dimitri van Heesch <dimitri@stack.nl>
Date: Mon, 22 May 2000 18:35:23 +0000
Subject: Release-1.1.3-20000522

---
 INSTALL                               |   8 +-
 README                                |   4 +-
 VERSION                               |   2 +-
 addon/configgen/config_templ.l        |  47 +++-
 addon/configgen/configgen.cpp         |  51 +++-
 addon/doxywizard/doxywizard_templ.cpp |   1 +
 doc/commands.doc                      |   9 +
 doc/faq.doc                           |  10 +
 doc/starting.doc                      |  17 +-
 packages/rpm/doxygen.spec             |   2 +-
 src/classdef.cpp                      | 161 +++--------
 src/classdef.h                        |  12 +-
 src/code.l                            |  38 ++-
 src/config.h                          |   6 +-
 src/config.l                          | 142 +++++++---
 src/definition.cpp                    |  12 +-
 src/definition.h                      |  16 +-
 src/doxygen.cpp                       | 344 ++++++++++++++---------
 src/doxygen.h                         |  10 +-
 src/entry.cpp                         |   2 +
 src/entry.h                           |   1 +
 src/filedef.cpp                       |  18 +-
 src/filedef.h                         |   2 +
 src/filename.cpp                      |   9 +-
 src/filename.h                        |   3 +-
 src/groupdef.cpp                      |  27 +-
 src/groupdef.h                        |   3 +-
 src/htmlgen.cpp                       |   2 +-
 src/index.cpp                         |  45 ++-
 src/latexgen.cpp                      |   2 +-
 src/logos.cpp                         | 496 ++++++++++++++--------------------
 src/memberdef.cpp                     |  28 +-
 src/memberdef.h                       |  17 +-
 src/membergroup.cpp                   |  22 +-
 src/membergroup.h                     |   1 +
 src/memberlist.cpp                    |  68 +++--
 src/memberlist.h                      |   7 +-
 src/message.cpp                       | 101 ++++++-
 src/message.h                         |   5 +-
 src/namespacedef.cpp                  |  19 +-
 src/namespacedef.h                    |   4 +-
 src/pre.l                             |  12 +-
 src/rtfgen.cpp                        |   4 +-
 src/scanner.h                         |   6 +-
 src/scanner.l                         | 266 +++++++++---------
 src/tag.l                             |   7 +-
 src/translator.h                      |   2 +-
 src/util.cpp                          |  26 +-
 src/util.h                            |   2 +-
 49 files changed, 1230 insertions(+), 869 deletions(-)

diff --git a/INSTALL b/INSTALL
index 7a7d9d7..ae4f4c2 100644
--- a/INSTALL
+++ b/INSTALL
@@ -1,4 +1,4 @@
-DOXYGEN Version 1.1.3-20000514
+DOXYGEN Version 1.1.3-20000522
 
 CONTENTS
 --------
@@ -15,8 +15,8 @@ INSTALLATION INSTRUCTIONS FOR UNIX:
 
 1.  Unpack the archive, unless you already have:
    
-     gunzip doxygen-1.1.3-20000514.src.tar.gz    # uncompress the archive
-     tar xf doxygen-1.1.3-20000514.src.tar       # unpack it
+     gunzip doxygen-1.1.3-20000522.src.tar.gz    # uncompress the archive
+     tar xf doxygen-1.1.3-20000522.src.tar       # unpack it
 
 2.  Run the configure script:
  
@@ -252,4 +252,4 @@ The latest version of doxygen can be obtained at
 
 Enjoy,
 
-Dimitri van Heesch (14 May 2000)
+Dimitri van Heesch (22 May 2000)
diff --git a/README b/README
index 9edb9be..3f8b02f 100644
--- a/README
+++ b/README
@@ -1,4 +1,4 @@
-DOXYGEN Version 1.1.3-20000514
+DOXYGEN Version 1.1.3-20000522
 
 Please read INSTALL for compilation instructions.
 
@@ -7,4 +7,4 @@ The latest version of doxygen can be obtained at
 
 Enjoy,
 
-Dimitri van Heesch (14 May 2000)
+Dimitri van Heesch (22 May 2000)
diff --git a/VERSION b/VERSION
index e537034..77d7b83 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-1.1.3-20000514
+1.1.3-20000522
diff --git a/addon/configgen/config_templ.l b/addon/configgen/config_templ.l
index 3588a42..a7b1289 100644
--- a/addon/configgen/config_templ.l
+++ b/addon/configgen/config_templ.l
@@ -40,13 +40,16 @@ void err(const char *fmt, ...)
   vfprintf(stderr, fmt, args);
   va_end(args); 
 }
-void warn(const char *fmt, ...)
+void warn_cont(const char *fmt, ...)
 {
   va_list args;
   va_start(args, fmt);
   vfprintf(stderr, fmt, args);
   va_end(args);
 }
+void initWarningFormat()
+{
+}
 #else
 #include "doxygen.h"
 #include "message.h"
@@ -183,7 +186,7 @@ static int yyread(char *buf,int max_size)
 					  else 
 					  {
 					    *b=FALSE; 
-					    warn("Warning: Invalid value `%s' for "
+					    warn_cont("Warning: Invalid value `%s' for "
 						 "boolean tag in line %d; use YES or NO\n",
 						 bs.data(),yyLineNr);
 					  }
@@ -248,7 +251,7 @@ static void writeStringList(QTextStream &t,QStrList &l)
     const char *s=p;
     bool hasBlanks=FALSE;
     while ((c=*p++)!=0 && !hasBlanks) hasBlanks = (c==' ' || c=='\n' || c=='\t');
-    if (!first) t << "                       ";
+    if (!first) t << "                        ";
     first=FALSE;
     if (hasBlanks) t << "\"" << s << "\""; else t << s;
     p = l.next();
@@ -288,7 +291,7 @@ void configStrToVal()
     int ts = tabSizeString.toInt(&ok);
     if (!ok || ts<1 || ts>16)
     {
-      warn("Warning: argument of TAB_SIZE is not a valid number, using tab size of 8 spaces!\n");
+      warn_cont("Warning: argument of TAB_SIZE is not a valid number, using tab size of 8 spaces!\n");
       ts=8;
     }
     Config::tabSize = ts;
@@ -304,7 +307,7 @@ void configStrToVal()
     int cols = colsInAlphaIndexString.toInt(&ok);
     if (!ok || cols<1 || cols>20)
     {
-      warn("Warning: argument of COLS_IN_ALPHA_INDEX is not a valid number in the range [1..20]!\n"
+      warn_cont("Warning: argument of COLS_IN_ALPHA_INDEX is not a valid number in the range [1..20]!\n"
 	   "Using the default of 5 columns!\n");
       cols = 5;
     }
@@ -341,7 +344,8 @@ static void substEnvVarsInStrList(QStrList &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 
-		       contained multiple elements no splitting is done! */
+		       contained multiple elements no further 
+		       splitting is done to allow quoted items with spaces! */
     {
 
 
@@ -354,10 +358,10 @@ static void substEnvVarsInStrList(QStrList &sl)
       {
 	char c;
 	// skip until start of new word
-	for (;i<l && ((c=result.at(i))==' ' || c=='\t');i++) 
-	  p=i; // p marks the start index of the word
+	while (i<l && ((c=result.at(i))==' ' || c=='\t')) i++; 
+	p=i; // p marks the start index of the word
 	// skip until end of a word
-	for (;i<l && ((c=result.at(i))!=' ' && c!='\t' && c!='"');i++);
+	while (i<l && ((c=result.at(i))!=' ' && c!='\t' && c!='"')) i++;
 	if (i<l) // not at the end of the string
 	{
 	  if (c=='"') // word within quotes
@@ -424,6 +428,29 @@ void checkConfig()
   //  projectName[0]=toupper(projectName[0]);
   //}
 
+  if (Config::warnFormat.isEmpty())
+  {
+    Config::warnFormat="$file:$line $text";
+  }
+  else
+  {
+    if (Config::warnFormat.find("$file")==-1)
+    {
+      err("Error: warning format does not contain a $file tag!\n");
+      exit(1);
+    }
+    if (Config::warnFormat.find("$line")==-1)
+    {
+      err("Error: warning format does not contain a $line tag!\n");
+      exit(1);
+    }
+    if (Config::warnFormat.find("$text")==-1)
+    {
+      err("Error: wanring format foes not contain a $text tag!\n");
+      exit(1);
+    }
+  }
+  initWarningFormat();
 
   // set default man page extension if non is given by the user
   if (Config::manExtension.isEmpty())
@@ -715,7 +742,7 @@ void checkConfig()
       QFileInfo fi(Config::perlPath);
       if (!fi.exists())
       {
-        warn("Warning: tag PERL_PATH: perl interpreter not found at default or"
+        warn_cont("Warning: tag PERL_PATH: perl interpreter not found at default or"
             "user specified (%s) location\n",
         Config::perlPath.data());
       }
diff --git a/addon/configgen/configgen.cpp b/addon/configgen/configgen.cpp
index dd45913..cc51c4c 100644
--- a/addon/configgen/configgen.cpp
+++ b/addon/configgen/configgen.cpp
@@ -775,21 +775,7 @@ void init()
   ConfigString::addFixedValue("outputLanguage","Japanese");
   ConfigString::addFixedValue("outputLanguage","Finnish");
   ConfigString::addFixedValue("outputLanguage","Spanish");
-  ConfigBool::add(  "quietFlag",
-                    "QUIET",
-                    "FALSE",
-                    "generate progress messages flag",
-                    "The QUIET tag can be used to turn on/off the messages that are generated \n"
-                    "by doxygen. Possible values are YES and NO. If left blank NO is used. \n"
-                 );
-  ConfigBool::add(  "warningFlag",
-                    "WARNINGS",
-                    "TRUE",
-                    "generate warnings flag",
-                    "The WARNINGS tag can be used to turn on/off the warning messages that are \n"
-                    "generated by doxygen. Possible values are YES and NO. If left blank \n"
-                    "NO is used. \n"
-                 );
+  ConfigString::addFixedValue("outputLanguage","Croatian");
   ConfigBool::add(  "noIndexFlag",
                     "DISABLE_INDEX",
                     "FALSE",
@@ -984,6 +970,41 @@ void init()
                     "documentation sections, marked by \\if sectionname ... \\endif. \n"
                  );
   //-----------------------------------------------------------------------------------------------
+  ConfigInfo::add(  "Messages","configuration options related to warning and progress messages");
+  //-----------------------------------------------------------------------------------------------
+  ConfigBool::add(  "quietFlag",
+                    "QUIET",
+                    "FALSE",
+                    "generate progress messages flag",
+                    "The QUIET tag can be used to turn on/off the messages that are generated \n"
+                    "by doxygen. Possible values are YES and NO. If left blank NO is used. \n"
+                 );
+  ConfigBool::add(  "warningFlag",
+                    "WARNINGS",
+                    "TRUE",
+                    "generate warnings flag",
+                    "The WARNINGS tag can be used to turn on/off the warning messages that are \n"
+                    "generated by doxygen. Possible values are YES and NO. If left blank \n"
+                    "NO is used. \n"
+                 );
+  ConfigBool::add(  "warningUndocFlag",
+                    "WARN_IF_UNDOCUMENTED",
+                    "TRUE",
+                    "generate undocumented warnings",
+                    "If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings \n"
+                    "for undocumented members. If EXTRACT_ALL is set to YES then this flag will \n"
+                    "automatically be disabled. \n"
+                 );
+  ConfigString::add("warnFormat",
+                    "WARN_FORMAT",
+                    "$file:$line: $text",
+                    "format of the warning messages",
+                    "The WARN_FORMAT tag determines the format of the warning messages that \n"
+                    "doxygen can produce. The string should contain the $file, $line, and $text \n"
+                    "tags, which will be replaced by the file and line number from which the \n"
+                    "warning originated and the warning text. \n"
+                   ); 
+  //-----------------------------------------------------------------------------------------------
   ConfigInfo::add(  "Input","configuration options related to the input files");
   //-----------------------------------------------------------------------------------------------
   ConfigList::add(  "inputSources",
diff --git a/addon/doxywizard/doxywizard_templ.cpp b/addon/doxywizard/doxywizard_templ.cpp
index 4ec430d..cdc1145 100644
--- a/addon/doxywizard/doxywizard_templ.cpp
+++ b/addon/doxywizard/doxywizard_templ.cpp
@@ -13,6 +13,7 @@
  */
 
 #include <stdio.h>
+#include <stdlib.h>
 #include <qmainwindow.h>
 #include <qpopupmenu.h>
 #include <qfileinfo.h>
diff --git a/doc/commands.doc b/doc/commands.doc
index b0fdee8..c715160 100644
--- a/doc/commands.doc
+++ b/doc/commands.doc
@@ -87,6 +87,7 @@ documentation:
 <li> \refitem cmdmainpage \mainpage
 <li> \refitem cmdname \name
 <li> \refitem cmdnamespace \namespace
+<li> \refitem cmdnosubgrouping \nosubgrouping
 <li> \refitem cmdoverload \overload
 <li> \refitem cmdpage \page
 <li> \refitem cmdpar \par
@@ -367,6 +368,14 @@ See section \ref memgroup for an example.
   namespace with name \<name\>. 
   
 <hr>
+\subsection cmdnosubgrouping \nosubgrouping
+
+This command can be put in the documentation
+of a class. It can be used in combination with member grouping
+to avoid that doxygen puts a member group as a subgroup of a
+Public/Protected/Private/... section.
+
+<hr>
 \subsection cmdoverload \overload [(function declaration)]
 
   \addindex \overload
diff --git a/doc/faq.doc b/doc/faq.doc
index ecc8ef4..8e3bc1b 100644
--- a/doc/faq.doc
+++ b/doc/faq.doc
@@ -147,11 +147,21 @@ QTime and QIODevice classes.
 Another reason is for the nice and bug free utility classes, like QList, 
 QDict, QString, QArray, QTextStream, QRegExp etc. 
 
+The GUI front-end doxywizard uses Qt for... well... the GUI!
+
 <li><b>Can use doxygen on my Java code?</b>
 
 No, at the moment there is no support for Java. I suggest to
 use Sun's JavaDoc instead.
 
+<li><b>How can I exclude all test directories from my directory tree?</b>
+
+Simply put an exclude pattern like this in the configuration file:
+
+\verbatim
+EXCLUDE_PATTERNS = */test/*
+\endverbatim
+
 </ol>
 
 \htmlonly
diff --git a/doc/starting.doc b/doc/starting.doc
index cd52250..e3e67e1 100644
--- a/doc/starting.doc
+++ b/doc/starting.doc
@@ -493,13 +493,16 @@ detailed information about the group.
 
 Nesting of member groups is not allowed. 
 
-If all members of a member group have the same type and protection level
-(for instance all are static public members), then the whole member 
-group is displayed as a subgroup of the type/protection level group 
-(the group is displayed as a subsection of the "Static Public Members" 
-section for instance). If two or more members have different types, 
-then the group is put at the same level as the automatically 
-generated groups. 
+If all members of a member group inside a class have the same type 
+and protection level (for instance all are static public members), 
+then the whole member group is displayed as a subgroup of 
+the type/protection level group (the group is displayed as a 
+subsection of the "Static Public Members" section for instance). 
+If two or more members have different types, then the group is put 
+at the same level as the automatically generated groups.
+If you want to force all member-groups of a class to be at the top level, 
+you should put a \ref cmdnosubgrouping "\\nosubgrouping" command inside the
+documentation of the class. 
 
 \par Example:
 \verbinclude memgrp.cpp
diff --git a/packages/rpm/doxygen.spec b/packages/rpm/doxygen.spec
index 06ac192..c15f207 100644
--- a/packages/rpm/doxygen.spec
+++ b/packages/rpm/doxygen.spec
@@ -1,5 +1,5 @@
 Name: doxygen
-Version: 1.1.3-20000514
+Version: 1.1.3-20000522
 Summary: documentation system for C, C++ and IDL
 Release: 1
 Source0: doxygen-%{version}.src.tar.gz
diff --git a/src/classdef.cpp b/src/classdef.cpp
index b488214..eeae69e 100644
--- a/src/classdef.cpp
+++ b/src/classdef.cpp
@@ -42,8 +42,11 @@ static QCString stripExtension(const char *fName)
 }
 
 // constructs a new class definition
-ClassDef::ClassDef(const char *nm,CompoundType ct,const char *ref,const char *fName) 
- : Definition(removeRedundantWhiteSpace(nm)) 
+ClassDef::ClassDef(
+    const char *defFileName,int defLine,
+    const char *nm,CompoundType ct,
+    const char *ref,const char *fName) 
+ : Definition(defFileName,defLine,removeRedundantWhiteSpace(nm)) 
 {
   //name=n;
   if (fName)
@@ -83,6 +86,16 @@ ClassDef::ClassDef(const char *nm,CompoundType ct,const char *ref,const char *fN
   memberGroupList = new MemberGroupList;
   memberGroupList->setAutoDelete(TRUE);
   memberGroupDict = new MemberGroupDict(257);
+  int i=name().findRev("::");
+  if (i==-1)
+  {
+    scopelessName=name();
+  }
+  else
+  {
+    scopelessName=name().right(name().length()-i-2);
+  }
+  subGrouping=TRUE;
 }
 
 // destroy the class definition
@@ -354,12 +367,14 @@ void ClassDef::insertMember(MemberDef *md,int groupId)
                   enumValMembers.append(md);
                 break;
               case MemberDef::Function:
-                if (md->name()==name() ||         // constructor
+                if (md->name()==scopelessName ||         // constructor
                     (md->name().find('~')!=-1 &&  // hack to detect destructor
                      md->name().find("operator")==-1
                     )
                    )
+                {
                   constructors.append(md);
+                }
                 else
                 {
                   if (Config::sortMembersFlag)
@@ -454,6 +469,17 @@ void ClassDef::computeAnchors()
   setAnchors('u',&priTypes);
 }
 
+void ClassDef::distributeMemberGroupDocumentation()
+{
+  MemberGroupListIterator mgli(*memberGroupList);
+  MemberGroup *mg;
+  for (;(mg=mgli.current());++mgli)
+  {
+    mg->distributeMemberGroupDocumentation();
+  }
+}
+
+
 // add a file name to the used files set
 void ClassDef::insertUsedFile(const char *f)
 {
@@ -524,7 +550,7 @@ void ClassDef::writeDocumentation(OutputList &ol)
   OutputList briefOutput(&ol); 
   if (!briefDescription().isEmpty())
   {
-    parseDoc(briefOutput,name(),0,briefDescription());
+    parseDoc(briefOutput,defFileName,defLine,name(),0,briefDescription());
     ol+=briefOutput;
     ol.writeString(" \n");
     ol.pushGeneratorState();
@@ -738,7 +764,7 @@ void ClassDef::writeDocumentation(OutputList &ol)
   MemberGroup *mg;
   for (;(mg=mgli.current());++mgli)
   {
-    if (!mg->allMembersInSameSection()) // group is in its own section
+    if (!mg->allMembersInSameSection() || !subGrouping) // group is in its own section
     {
       mg->writeDeclarations(ol,this,0,0,0);
     }
@@ -856,7 +882,7 @@ void ClassDef::writeDocumentation(OutputList &ol)
         ol.disableAllBut(OutputGenerator::RTF);
         ol.newParagraph();
       ol.popGeneratorState();
-      parseDoc(ol,name(),0,documentation()+"\n");
+      parseDoc(ol,defFileName,defLine,name(),0,documentation()+"\n");
     }
     // write examples
     if (exampleFlag)
@@ -1149,33 +1175,6 @@ void ClassDef::writeMemberList(OutputList &ol)
   ol.popGeneratorState();
 }
 
-//void ClassDef::writeIncludeFile(OutputList &ol)
-//{
-//  initParseCodeContext();
-//  if (!incFile) return;
-//  //printf("incFile=%s\n",incFile->absFilePath().data());
-//  ol.disableAllBut(OutputGenerator::Html);
-//  startFile(ol,fileName+"-include",name()+" Include File");
-//  startTitle(ol,0);
-//  QCString n=incName.copy();
-//  if (incName.isEmpty()) 
-//  {
-//    n=incFile->name();
-//    if (Config::fullPathNameFlag)
-//    {
-//      n.prepend(stripFromPath(incFile->getPath().copy()));
-//    }
-//  }
-//  parseText(ol,n);
-//  endTitle(ol,0,0);
-//  parseText(ol,theTranslator->trVerbatimText(incFile->name()));
-//  //ol.writeRuler();
-//  ol.startCodeFragment();
-//  parseCode(ol,n,fileToString(incFile->absFilePath()),FALSE,0);
-//  ol.endCodeFragment();
-//  endFile(ol);
-//  ol.enableAll();
-//}
 
 // add a reference to an example
 bool ClassDef::addExample(const char *anchor,const char *nameStr,
@@ -1203,48 +1202,6 @@ bool ClassDef::hasExamples()
     return exampleList->count()>0;
 }
 
-#if 0
-// write the list of all examples that are used in this class.
-void ClassDef::writeExample(OutputList &ol)
-{
-  QCString exampleLine=theTranslator->trWriteList(exampleList->count());
- 
-  QRegExp marker("@[0-9]+");
-  int index=0,newIndex,matchLen;
-  // now replace all markers in inheritLine with links to the classes
-  while ((newIndex=marker.match(exampleLine,index,&matchLen))!=-1)
-  {
-    bool ok;
-    parseText(ol,exampleLine.mid(index,newIndex-index));
-    uint entryIndex = exampleLine.mid(newIndex+1,matchLen-1).toUInt(&ok);
-    Example *e=exampleList->at(entryIndex);
-    if (ok && e)
-    {
-      ol.writeObjectLink(0,e->file,e->anchor,e->name);
-    }
-    index=newIndex+matchLen;
-  } 
-  parseText(ol,exampleLine.right(exampleLine.length()-index));
-  ol.writeString(".");
-  
-#if 0
-  Example *e=exampleList->first();
-  while (e)
-  {
-    ol.writeObjectLink(0,e->file,e->anchor,e->name);
-    e=exampleList->next();
-    if (e)
-    {
-      if (exampleList->at()==(int)exampleList->count()-1)
-        parseText(ol," "+theTranslator->trAnd()+" ");
-      else
-        ol.writeString(", ");
-    }
-  }
-  ol.writeString(".");
-#endif
-}
-#endif
 
 void ClassDef::setTemplateArguments(ArgumentList *al)
 {
@@ -1260,33 +1217,6 @@ void ClassDef::setTemplateArguments(ArgumentList *al)
   }
 }
 
-//QCString ClassDef::getTemplateNameString()
-//{
-//  QCString result;
-//  if (!tempArgs || tempArgs->count()==0) return result;
-//  result="<";
-//  Argument *a=tempArgs->first();
-//  while (a)
-//  {
-//    if (!a->name.isEmpty()) // add template argument name
-//    {
-//      result+=a->name;
-//    }
-//    else // extract name from type
-//    {
-//      int i=a->type.length()-1;
-//      while (i>=0 && isId(a->type.at(i))) i--;
-//      if (i>0)
-//      {
-//        result+=a->type.right(a->type.length()-i-1);
-//      }
-//    }
-//    a=tempArgs->next();
-//    if (a) result+=", ";
-//  }
-//  result+=">";
-//  return result;
-//}
 
 bool ClassDef::hasNonReferenceSuperClass()
 {
@@ -1297,33 +1227,6 @@ bool ClassDef::hasNonReferenceSuperClass()
   return found;
 }
 
-//void ClassDef::writeMembersToContents()
-//{
-//  HtmlHelp *htmlHelp = HtmlHelp::getInstance();
-//
-//  htmlHelp->incContentsDepth();
-//  
-//  MemberNameInfoListIterator mnili(*allMemberNameInfoList);
-//  MemberNameInfo *mni;
-//  for (;(mni=mnili.current());++mnili)
-//  {
-//    MemberNameInfoIterator mnii(*mni);
-//    MemberInfo *mi;
-//    for (mnii.toLast();(mi=mnii.current());--mnii)
-//    {
-//      MemberDef *md=mi->memberDef;
-//      ClassDef  *cd=md->memberClass();
-//      if (md->isLinkable() && cd==this) // member is not inherited
-//      {
-//        htmlHelp->addContentsItem(md->name()+md->argsString(),
-//                                  cd->getOutputFileBase(),
-//                                  md->anchor());
-//      }
-//    }
-//  }
-//  htmlHelp->decContentsDepth();
-//}
-
 void ClassDef::writeDeclaration(OutputList &ol,MemberDef *md,bool inGroup)
 {
   //ol.insertMemberAlign();
diff --git a/src/classdef.h b/src/classdef.h
index deeaddc..96e6c7f 100644
--- a/src/classdef.h
+++ b/src/classdef.h
@@ -53,7 +53,9 @@ class ClassDef : public Definition
                         Interface=Entry::INTERFACE_SEC,
                         Exception=Entry::EXCEPTION_SEC
                       };
-    ClassDef(const char *name,CompoundType ct,const char *ref=0,const char *fName=0);
+    ClassDef(const char *fileName,int startLine,
+             const char *name,CompoundType ct,
+             const char *ref=0,const char *fName=0);
    ~ClassDef();
     QCString getOutputFileBase() const { return fileName; }
     CompoundType compoundType() const { return compType; } 
@@ -115,8 +117,11 @@ class ClassDef : public Definition
     {
       return usesIntfClassDict;
     }
+    void setSubGrouping(bool enabled) { subGrouping = enabled; }
     
     bool visited;
+
+    void distributeMemberGroupDocumentation();
    
   protected:
     void addUsedInterfaceClasses(MemberDef *md,const char *typeStr);
@@ -126,6 +131,7 @@ class ClassDef : public Definition
     IncludeInfo *incInfo;                // header file to refer to
     QCString incName;                    // alternative include file name
     QCString memListFileName;            
+    QCString scopelessName;              // name without any scopes
     BaseClassList *inherits;
     BaseClassList *inheritedBy;
     NamespaceDef  *nspace;              // the namespace this class is in
@@ -177,6 +183,10 @@ class ClassDef : public Definition
     FileDef            *fileDef;
     UsesClassDict      *usesImplClassDict;
     UsesClassDict      *usesIntfClassDict;
+
+    bool subGrouping; // does this class group its user-grouped members
+                      // as a sub-section of the normal (public/protected/..) 
+                      // groups?
 };
 
 struct UsesClassDef
diff --git a/src/code.l b/src/code.l
index 1fd0a91..5e0e724 100644
--- a/src/code.l
+++ b/src/code.l
@@ -1002,10 +1002,10 @@ TYPEKW  ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned"
 <SkipCxxComment>.			{
   					  g_code->codify(yytext);
   					}
-<RemoveSpecialCComment>"*/"{B}*\n({B}*\n)*{B}*"/*"[*!]/[^/*] {
+<RemoveSpecialCComment>"*/"{B}*\n({B}*\n)*({B}*"//@"[{}]{B}*\n)?{B}*"/*"[*!]/[^/*] {
   					  g_yyLineNr+=QCString(yytext).contains('\n');
 					}
-<RemoveSpecialCComment>"*/"{B}*\n({B}*\n)* {
+<RemoveSpecialCComment>"*/"{B}*\n({B}*\n)*({B}*"//@"[{}]{B}*\n)? {
   					  g_yyLineNr+=QCString(yytext).contains('\n');
                                           g_code->endCodeLine();
                                           if (g_yyLineNr<g_inputLines) 
@@ -1046,6 +1046,40 @@ TYPEKW  ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned"
 					    endFontClass();
 					  }
   					}
+<*>\n({B}*"//@"[{}]{B}*\n)		{ // remove one-line group marker
+  					  if (Config::stripCommentsFlag)
+					  {
+					    g_yyLineNr+=((QCString)yytext).contains('\n');
+					    g_code->endCodeLine();
+					    if (g_yyLineNr<g_inputLines) 
+					    {
+					      startCodeLine(*g_code);
+					    }
+					  }
+					  else
+					  {
+					    startFontClass("comment");
+					    codifyLines(yytext);
+					    endFontClass();
+					  }
+  					}
+<*>^{B}*"//@"[{}]{B}*\n			{ // remove one-line group marker
+  					  if (Config::stripCommentsFlag)
+					  {
+					    g_yyLineNr++;
+					    g_code->endCodeLine();
+					    if (g_yyLineNr<g_inputLines) 
+					    {
+					      startCodeLine(*g_code);
+					    }
+					  }
+					  else
+					  {
+					    startFontClass("comment");
+					    codifyLines(yytext);
+					    endFontClass();
+					  }
+  					}
 <*>^{B}*"//"[!/][^\n]*\n		{ // remove special one-line comment
   					  if (Config::stripCommentsFlag)
 					  {
diff --git a/src/config.h b/src/config.h
index 71ac028..3ac0bed 100644
--- a/src/config.h
+++ b/src/config.h
@@ -35,8 +35,6 @@ struct Config
   static QCString projectNumber; // the number of the project
   static QCString outputDir; // the global output directory
   static QCString outputLanguage; // the output language
-  static bool     quietFlag; // generate progress messages flag
-  static bool     warningFlag; // generate warnings flag
   static bool     noIndexFlag; // generate condensed index flag
   static bool     extractAllFlag; // gererate docs for all classes flag
   static bool     extractPrivateFlag; // generate docs for private members flag
@@ -61,6 +59,10 @@ struct Config
   static bool     sortMembersFlag; // sort members alphabetically?
   static int      tabSize; // number of spaces in a tab
   static QStrList sectionFilterList; // list of section filters that are enabled
+  static bool     quietFlag; // generate progress messages flag
+  static bool     warningFlag; // generate warnings flag
+  static bool     warningUndocFlag; // generate undocumented warnings
+  static QCString warnFormat; // format of the warning messages
   static QStrList inputSources; // list of input files
   static QStrList filePatternList; // list of file patterns
   static bool     recursiveFlag; // scan directories recursively
diff --git a/src/config.l b/src/config.l
index 1f75428..4e13bf0 100644
--- a/src/config.l
+++ b/src/config.l
@@ -40,7 +40,7 @@ void err(const char *fmt, ...)
   vfprintf(stderr, fmt, args);
   va_end(args); 
 }
-void warn(const char *fmt, ...)
+void warn_cont(const char *fmt, ...)
 {
   va_list args;
   va_start(args, fmt);
@@ -67,8 +67,6 @@ QCString Config::projectName;
 QCString Config::projectNumber;
 QCString Config::outputDir;
 QCString Config::outputLanguage = "English";
-bool     Config::quietFlag = FALSE;
-bool     Config::warningFlag = TRUE;
 bool     Config::noIndexFlag = FALSE;
 bool     Config::extractAllFlag = FALSE;
 bool     Config::extractPrivateFlag = FALSE;
@@ -93,6 +91,10 @@ bool     Config::inlineInfoFlag = TRUE;
 bool     Config::sortMembersFlag = TRUE;
 int      Config::tabSize = 8;
 QStrList Config::sectionFilterList;
+bool     Config::quietFlag = FALSE;
+bool     Config::warningFlag = TRUE;
+bool     Config::warningUndocFlag = TRUE;
+QCString Config::warnFormat = "$file:$line: $text";
 QStrList Config::inputSources;
 QStrList Config::filePatternList;
 bool     Config::recursiveFlag = FALSE;
@@ -205,8 +207,6 @@ static int yyread(char *buf,int max_size)
 <Start>"PROJECT_NUMBER"[ \t]*"="        { BEGIN(GetString); s=&Config::projectNumber; s->resize(0); }
 <Start>"OUTPUT_DIRECTORY"[ \t]*"="      { BEGIN(GetString); s=&Config::outputDir; s->resize(0); }
 <Start>"OUTPUT_LANGUAGE"[ \t]*"="       { BEGIN(GetString); s=&Config::outputLanguage; s->resize(0); }
-<Start>"QUIET"[ \t]*"="                 { BEGIN(GetBool); b=&Config::quietFlag; }
-<Start>"WARNINGS"[ \t]*"="              { BEGIN(GetBool); b=&Config::warningFlag; }
 <Start>"DISABLE_INDEX"[ \t]*"="         { BEGIN(GetBool); b=&Config::noIndexFlag; }
 <Start>"EXTRACT_ALL"[ \t]*"="           { BEGIN(GetBool); b=&Config::extractAllFlag; }
 <Start>"EXTRACT_PRIVATE"[ \t]*"="       { BEGIN(GetBool); b=&Config::extractPrivateFlag; }
@@ -231,6 +231,10 @@ static int yyread(char *buf,int max_size)
 <Start>"SORT_MEMBER_DOCS"[ \t]*"="      { BEGIN(GetBool); b=&Config::sortMembersFlag; }
 <Start>"TAB_SIZE"[ \t]*"="              { BEGIN(GetString); s=&tabSizeString; s->resize(0); }
 <Start>"ENABLED_SECTIONS"[ \t]*"="      { BEGIN(GetStrList); l=&Config::sectionFilterList; l->clear(); elemStr=""; }
+<Start>"QUIET"[ \t]*"="                 { BEGIN(GetBool); b=&Config::quietFlag; }
+<Start>"WARNINGS"[ \t]*"="              { BEGIN(GetBool); b=&Config::warningFlag; }
+<Start>"WARN_IF_UNDOCUMENTED"[ \t]*"="  { BEGIN(GetBool); b=&Config::warningUndocFlag; }
+<Start>"WARN_FORMAT"[ \t]*"="           { BEGIN(GetString); s=&Config::warnFormat; s->resize(0); }
 <Start>"INPUT"[ \t]*"="                 { BEGIN(GetStrList); l=&Config::inputSources; l->clear(); elemStr=""; }
 <Start>"FILE_PATTERNS"[ \t]*"="         { BEGIN(GetStrList); l=&Config::filePatternList; l->clear(); elemStr=""; }
 <Start>"RECURSIVE"[ \t]*"="             { BEGIN(GetBool); b=&Config::recursiveFlag; }
@@ -354,7 +358,7 @@ static int yyread(char *buf,int max_size)
 					  else 
 					  {
 					    *b=FALSE; 
-					    warn("Warning: Invalid value `%s' for "
+					    warn_cont("Warning: Invalid value `%s' for "
 						 "boolean tag in line %d; use YES or NO\n",
 						 bs.data(),yyLineNr);
 					  }
@@ -381,8 +385,6 @@ void dumpConfig()
   printf("projectNumber=`%s'\n",Config::projectNumber.data());
   printf("outputDir=`%s'\n",Config::outputDir.data());
   printf("outputLanguage=`%s'\n",Config::outputLanguage.data());
-  printf("quietFlag=`%d'\n",Config::quietFlag);
-  printf("warningFlag=`%d'\n",Config::warningFlag);
   printf("noIndexFlag=`%d'\n",Config::noIndexFlag);
   printf("extractAllFlag=`%d'\n",Config::extractAllFlag);
   printf("extractPrivateFlag=`%d'\n",Config::extractPrivateFlag);
@@ -421,6 +423,11 @@ void dumpConfig()
       is=Config::sectionFilterList.next();
     }
   }
+  printf("# configuration options related to warning and progress messages\n");
+  printf("quietFlag=`%d'\n",Config::quietFlag);
+  printf("warningFlag=`%d'\n",Config::warningFlag);
+  printf("warningUndocFlag=`%d'\n",Config::warningUndocFlag);
+  printf("warnFormat=`%s'\n",Config::warnFormat.data());
   printf("# configuration options related to the input files\n");
   {
     char *is=Config::inputSources.first();
@@ -586,8 +593,6 @@ void Config::init()
   Config::projectNumber.resize(0);
   Config::outputDir.resize(0);
   Config::outputLanguage = "English";
-  Config::quietFlag = FALSE;
-  Config::warningFlag = TRUE;
   Config::noIndexFlag = FALSE;
   Config::extractAllFlag = FALSE;
   Config::extractPrivateFlag = FALSE;
@@ -612,6 +617,10 @@ void Config::init()
   Config::sortMembersFlag = TRUE;
   Config::tabSize = 8;
   Config::sectionFilterList.clear();
+  Config::quietFlag = FALSE;
+  Config::warningFlag = TRUE;
+  Config::warningUndocFlag = TRUE;
+  Config::warnFormat = "$file:$line: $text";
   Config::inputSources.clear();
   Config::filePatternList.clear();
   Config::recursiveFlag = FALSE;
@@ -705,7 +714,7 @@ static void writeStringList(QTextStream &t,QStrList &l)
     const char *s=p;
     bool hasBlanks=FALSE;
     while ((c=*p++)!=0 && !hasBlanks) hasBlanks = (c==' ' || c=='\n' || c=='\t');
-    if (!first) t << "                       ";
+    if (!first) t << "                        ";
     first=FALSE;
     if (hasBlanks) t << "\"" << s << "\""; else t << s;
     p = l.next();
@@ -787,27 +796,6 @@ void writeTemplateConfig(QFile *f,bool sl)
   if (!sl)
   {
     t << "\n";
-    t << "# The QUIET tag can be used to turn on/off the messages that are generated \n";
-    t << "# by doxygen. Possible values are YES and NO. If left blank NO is used. \n";
-    t << "\n";
-  }
-  t << "QUIET                 = ";
-  writeBoolValue(t,Config::quietFlag);
-  t << "\n";
-  if (!sl)
-  {
-    t << "\n";
-    t << "# The WARNINGS tag can be used to turn on/off the warning messages that are \n";
-    t << "# generated by doxygen. Possible values are YES and NO. If left blank \n";
-    t << "# NO is used. \n";
-    t << "\n";
-  }
-  t << "WARNINGS              = ";
-  writeBoolValue(t,Config::warningFlag);
-  t << "\n";
-  if (!sl)
-  {
-    t << "\n";
     t << "# The DISABLE_INDEX tag can be used to turn on/off the condensed index at \n";
     t << "# top of each HTML page. The value NO (the default) enables the index and \n";
     t << "# the value YES disables it. \n";
@@ -1073,6 +1061,57 @@ void writeTemplateConfig(QFile *f,bool sl)
     t << "\n";
   }
   t << "#---------------------------------------------------------------------------\n";
+  t << "# configuration options related to warning and progress messages\n";
+  t << "#---------------------------------------------------------------------------\n";
+  if (!sl)
+  {
+    t << "\n";
+    t << "# The QUIET tag can be used to turn on/off the messages that are generated \n";
+    t << "# by doxygen. Possible values are YES and NO. If left blank NO is used. \n";
+    t << "\n";
+  }
+  t << "QUIET                 = ";
+  writeBoolValue(t,Config::quietFlag);
+  t << "\n";
+  if (!sl)
+  {
+    t << "\n";
+    t << "# The WARNINGS tag can be used to turn on/off the warning messages that are \n";
+    t << "# generated by doxygen. Possible values are YES and NO. If left blank \n";
+    t << "# NO is used. \n";
+    t << "\n";
+  }
+  t << "WARNINGS              = ";
+  writeBoolValue(t,Config::warningFlag);
+  t << "\n";
+  if (!sl)
+  {
+    t << "\n";
+    t << "# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings \n";
+    t << "# for undocumented members. If EXTRACT_ALL is set to YES then this flag will \n";
+    t << "# automatically be disabled. \n";
+    t << "\n";
+  }
+  t << "WARN_IF_UNDOCUMENTED  = ";
+  writeBoolValue(t,Config::warningUndocFlag);
+  t << "\n";
+  if (!sl)
+  {
+    t << "\n";
+    t << "# The WARN_FORMAT tag determines the format of the warning messages that \n";
+    t << "# doxygen can produce. The string should contain the $file, $line, and $text \n";
+    t << "# tags, which will be replaced by the file and line number from which the \n";
+    t << "# warning originated and the warning text. \n";
+    t << "\n";
+  }
+  t << "WARN_FORMAT           = ";
+  writeStringValue(t,Config::warnFormat);
+  t << "\n";
+  if (!sl)
+  {
+    t << "\n";
+  }
+  t << "#---------------------------------------------------------------------------\n";
   t << "# configuration options related to the input files\n";
   t << "#---------------------------------------------------------------------------\n";
   if (!sl)
@@ -1777,7 +1816,7 @@ void configStrToVal()
     int ts = tabSizeString.toInt(&ok);
     if (!ok || ts<1 || ts>16)
     {
-      warn("Warning: argument of TAB_SIZE is not a valid number, using tab size of 8 spaces!\n");
+      warn_cont("Warning: argument of TAB_SIZE is not a valid number, using tab size of 8 spaces!\n");
       ts=8;
     }
     Config::tabSize = ts;
@@ -1793,7 +1832,7 @@ void configStrToVal()
     int cols = colsInAlphaIndexString.toInt(&ok);
     if (!ok || cols<1 || cols>20)
     {
-      warn("Warning: argument of COLS_IN_ALPHA_INDEX is not a valid number in the range [1..20]!\n"
+      warn_cont("Warning: argument of COLS_IN_ALPHA_INDEX is not a valid number in the range [1..20]!\n"
 	   "Using the default of 5 columns!\n");
       cols = 5;
     }
@@ -1830,7 +1869,8 @@ static void substEnvVarsInStrList(QStrList &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 
-		       contained multiple elements no splitting is done! */
+		       contained multiple elements no further 
+		       splitting is done to allow quoted items with spaces! */
     {
 
 
@@ -1843,10 +1883,10 @@ static void substEnvVarsInStrList(QStrList &sl)
       {
 	char c;
 	// skip until start of new word
-	for (;i<l && ((c=result.at(i))==' ' || c=='\t');i++) 
-	  p=i; // p marks the start index of the word
+	while (i<l && ((c=result.at(i))==' ' || c=='\t')) i++; 
+	p=i; // p marks the start index of the word
 	// skip until end of a word
-	for (;i<l && ((c=result.at(i))!=' ' && c!='\t' && c!='"');i++);
+	while (i<l && ((c=result.at(i))!=' ' && c!='\t' && c!='"')) i++;
 	if (i<l) // not at the end of the string
 	{
 	  if (c=='"') // word within quotes
@@ -1909,6 +1949,7 @@ void substituteEnvironmentVars()
   substEnvVarsInString( Config::outputLanguage );
   substEnvVarsInStrList( Config::stripFromPath );
   substEnvVarsInStrList( Config::sectionFilterList );
+  substEnvVarsInString( Config::warnFormat );
   substEnvVarsInStrList( Config::inputSources );
   substEnvVarsInStrList( Config::filePatternList );
   substEnvVarsInStrList( Config::excludeSources );
@@ -1949,6 +1990,29 @@ void checkConfig()
   //  projectName[0]=toupper(projectName[0]);
   //}
 
+  if (Config::warnFormat.isEmpty())
+  {
+    Config::warnFormat="$file:$line $text";
+  }
+  else
+  {
+    if (Config::warnFormat.find("$file")==-1)
+    {
+      err("Error: warning format does not contain a $file tag!\n");
+      exit(1);
+    }
+    if (Config::warnFormat.find("$line")==-1)
+    {
+      err("Error: warning format does not contain a $line tag!\n");
+      exit(1);
+    }
+    if (Config::warnFormat.find("$text")==-1)
+    {
+      err("Error: wanring format foes not contain a $text tag!\n");
+      exit(1);
+    }
+  }
+  initWarningFormat();
 
   // set default man page extension if non is given by the user
   if (Config::manExtension.isEmpty())
@@ -2240,7 +2304,7 @@ void checkConfig()
       QFileInfo fi(Config::perlPath);
       if (!fi.exists())
       {
-        warn("Warning: tag PERL_PATH: perl interpreter not found at default or"
+        warn_cont("Warning: tag PERL_PATH: perl interpreter not found at default or"
             "user specified (%s) location\n",
         Config::perlPath.data());
       }
diff --git a/src/definition.cpp b/src/definition.cpp
index b6c3bd4..9bc88b2 100644
--- a/src/definition.cpp
+++ b/src/definition.cpp
@@ -25,9 +25,17 @@
 #include "outputlist.h"
 #include "scanner.h"
 
-Definition::Definition(const char *name,const char *b,const char *d)
+Definition::Definition(const char *df,int dl,
+                       const char *name,const char *b,const char *d)
 {
-  n=name; brief=b; doc=d; sectionList=0, startBodyLine=endBodyLine=-1, bodyDef=0;
+  defFileName = df;
+  defLine = dl;
+  n=name; 
+  brief=b; 
+  doc=d; 
+  sectionList=0, 
+  startBodyLine=endBodyLine=-1, 
+  bodyDef=0;
 }
 
 Definition::~Definition()
diff --git a/src/definition.h b/src/definition.h
index e5f125d..e9c6d15 100644
--- a/src/definition.h
+++ b/src/definition.h
@@ -25,12 +25,14 @@ class FileDef;
 class OutputList;
 class SectionList;
 
-/*! The common base class of all definitions. */
+/*! The common base class of all entity definitions found in the sources. */
 class Definition
 {
   public:
     /*! create a new definition */
-    Definition(const char *name,const char *b=0,const char *d=0);
+    Definition(
+        const char *defFileName,int defLine,
+        const char *name,const char *b=0,const char *d=0);
     /*! destroys the definition */
     virtual ~Definition();
     /*! returns the name of the definition */
@@ -92,17 +94,27 @@ class Definition
     FileDef *getBodyDef()                { return bodyDef; }
     void writeSourceRef(OutputList &ol,const char *scopeName);
 
+    /*! returns the file in which this definition was found */
+    QCString getDefFileName() const { return defFileName; }
+    /*! returns the line number at which the definition was found */
+    int getDefLine() const { return defLine; }
+
   protected:
     int      startBodyLine;   // line number of the start of the definition
     int      endBodyLine;     // line number of the end of the definition
     FileDef *bodyDef;         // file definition containing the function body
 
+    // where the item was found
+    QCString defFileName;
+    int      defLine;
+
   private: 
     QCString n;     // name of the definition
     QCString brief; // brief description
     QCString doc;   // detailed description
     QCString ref;   // reference to external documentation
     SectionList *sectionList; // list of all sections
+
 };
 
 #endif
diff --git a/src/doxygen.cpp b/src/doxygen.cpp
index 40a21f8..13fdbbe 100644
--- a/src/doxygen.cpp
+++ b/src/doxygen.cpp
@@ -183,13 +183,14 @@ void buildGroupList(Entry *root)
     
     if ((gd=groupDict[root->name]))
     {
-      warn("Warning: group %s already documented\n"
-           "         skipping documentation in file %s at line %d\n",
-           root->name.data(),root->fileName.data(),root->startLine);
+      warn(root->fileName,root->startLine,
+           "Warning: group %s already documented. "
+           "Skipping documentation.",
+           root->name.data());
     }
     else
     {
-      gd = new GroupDef(root->name,root->type);
+      gd = new GroupDef(root->fileName,root->startLine,root->name,root->type);
       gd->setBriefDescription(root->brief);
       gd->setDocumentation(root->doc);
       gd->addSectionsToDefinition(root->anchors);
@@ -253,9 +254,12 @@ void buildFileList(Entry *root)
       if ((!root->doc.isEmpty() && !fd->documentation().isEmpty()) ||
           (!root->brief.isEmpty() && !fd->briefDescription().isEmpty()))
       {
-        warn("Warning: file %s already documented\n"
-            "         skipping documentation in file %s at line %d\n",
-            root->name.data(),root->fileName.data(),root->startLine);
+        warn(
+             root->fileName,root->startLine,
+             "Warning: file %s already documented. "
+             "Skipping documentation.",
+             root->name.data()
+            );
       }
       else
       {
@@ -281,21 +285,23 @@ void buildFileList(Entry *root)
     else
     {
       const char *fn = root->fileName.data();
-      warn("Warning: the name `%s' supplied as "
-           "the second argument in the \\file statement in file "
-           "%s at line %d ",
-           root->name.data(),
-           fn ? fn : "???",
-           root->startLine);
+      QCString text;
+      text.sprintf("Warning: the name `%s' supplied as "
+                   "the second argument in the \\file statement.",
+                    root->name.data()
+                  );
       if (ambig) // name is ambigious
       {
-        warn("matches the following input files:\n");
-        showFileDefMatches(&inputNameDict,root->name);
-        warn("Please use a more specific name by "
-             "including a (larger) part of the path!\n");
+        text+="matches the following input files:\n";
+        text+=showFileDefMatches(&inputNameDict,root->name);
+        text+="Please use a more specific name by "
+              "including a (larger) part of the path!";
       }
       else // name is not an input file
-        warn("is not an input file\n");
+      {
+        text+="is not an input file";
+      }
+      warn(fn,root->startLine,text);
     }
   }
   EntryListIterator eli(*root->sublist);
@@ -325,21 +331,23 @@ static void addIncludeFile(ClassDef *cd,FileDef *ifd,Entry *root)
         (fd=findFileDef(&inputNameDict,root->includeFile,ambig))==0
        )
     { // explicit request
-      warn("Warning: the name `%s' supplied as "
-          "the second argument in the \\class statement in file "
-          "%s at line %d ",
-          root->includeFile.data(),
-          root->fileName.data(),
-          root->startLine);
+      QCString text;
+      text.sprintf("Warning: the name `%s' supplied as "
+                  "the second argument in the \\class statement.",
+                  root->includeFile.data()
+                 );
       if (ambig) // name is ambigious
       {
-        warn("matches the following input files:\n");
-        showFileDefMatches(&inputNameDict,root->includeFile);
-        warn("Please use a more specific name by "
-            "including a (larger) part of the path!\n");
+        text+="matches the following input files:\n";
+        text+=showFileDefMatches(&inputNameDict,root->includeFile);
+        text+="Please use a more specific name by "
+            "including a (larger) part of the path!";
       }
       else // name is not an input file
-        warn("is not an input file\n");
+      {
+        text+="is not an input file";
+      }
+      warn(root->fileName,root->startLine,text);
     }
     else if (root->includeFile.isEmpty() && ifd &&
         // see if the file extension makes sense
@@ -424,8 +432,9 @@ void buildClassList(Entry *root)
     if (fullName.isEmpty())
     {
       // this should not be called
-      warn("Warning: invalid class found in file %s at %d\n",
-                  root->fileName.data(),root->startLine);
+      warn(root->fileName,root->startLine,
+           "Warning: invalid class name found!"
+          );
     }
     else 
     {
@@ -452,9 +461,12 @@ void buildClassList(Entry *root)
         { 
           if (!root->doc.isEmpty() && !cd->documentation().isEmpty())
           {
-            warn("Warning: class %s already has a detailed description\n"
-                 "         skipping the one in file %s at line %d\n",
-                 fullName.data(),root->fileName.data(),root->startLine);
+            warn(
+                 root->fileName,root->startLine,
+                 "Warning: class %s already has a detailed description. "
+                 "Skipping the one found here.",
+                 fullName.data()
+                );
           }
           else if (!root->doc.isEmpty())
           {
@@ -462,9 +474,12 @@ void buildClassList(Entry *root)
           }
           if (!root->brief.isEmpty() && !cd->briefDescription().isEmpty())
           {
-            warn("Warning: class %s already has a brief description\n"
-                 "         skipping the one in file %s at line %d\n",
-                 fullName.data(),root->fileName.data(),root->startLine);
+            warn(
+                 root->fileName,root->startLine,
+                 "Warning: class %s already has a brief description\n"
+                 "         skipping the one found here.",
+                 fullName.data()
+                );
           }
           else if (!root->brief.isEmpty())
           {
@@ -494,6 +509,7 @@ void buildClassList(Entry *root)
           fd->insertClass(cd);
         }
         addClassToGroups(root,cd);
+        if (!root->subGrouping) cd->setSubGrouping(FALSE);
       }
       else // new class
       {
@@ -520,7 +536,7 @@ void buildClassList(Entry *root)
 
         //printf("New class: namespace `%s' name=`%s'\n",className.data(),namespaceName.data());
         
-        ClassDef *cd=new ClassDef(fullName,sec);
+        ClassDef *cd=new ClassDef(root->fileName,root->startLine,fullName,sec);
         cd->setDocumentation(root->doc); // copy docs to definition
         cd->setBriefDescription(root->brief);
         //printf("new ClassDef tempArgList=%p specScope=%s\n",root->tArgList,root->scopeSpec.data());
@@ -530,6 +546,7 @@ void buildClassList(Entry *root)
         // file definition containing the class cd
         cd->setBodySegment(root->bodyLine,root->endBodyLine);
         cd->setBodyDef(fd);
+        if (!root->subGrouping) cd->setSubGrouping(FALSE);
 
         addClassToGroups(root,cd);
 
@@ -614,9 +631,11 @@ void buildNamespaceList(Entry *root)
           }
           else if (!nd->documentation().isEmpty() && !root->doc.isEmpty())
           {
-            warn("Warning: namespace %s already has a detailed description,\n"
-                 "         skipping documentation in file %s at line %d\n",
-                 fullName.data(),root->fileName.data(),root->startLine);
+            warn(
+                 root->fileName,root->startLine,
+                 "Warning: namespace %s already has a detailed description. "
+                 "Skipping the documentation found here.",
+                 fullName.data());
           }
           if (nd->briefDescription().isEmpty() && !root->brief.isEmpty())
           {
@@ -625,9 +644,11 @@ void buildNamespaceList(Entry *root)
           }
           else if (!nd->briefDescription().isEmpty() && !root->brief.isEmpty())
           {
-            warn("Warning: namespace %s already has a brief description,\n"
-                 "         skipping documentation in file %s at line %d\n",
-                 fullName.data(),root->fileName.data(),root->startLine);
+            warn(root->fileName,root->startLine,
+                 "Warning: namespace %s already has a brief description. "
+                 "Skipping the documentation found here.",
+                 fullName.data()
+                );
           }
         }
 
@@ -643,7 +664,7 @@ void buildNamespaceList(Entry *root)
               )
            */ 
       {
-        NamespaceDef *nd=new NamespaceDef(fullName);
+        NamespaceDef *nd=new NamespaceDef(root->fileName,root->startLine,fullName);
         nd->setDocumentation(root->doc); // copy docs to definition
         nd->setBriefDescription(root->brief);
         nd->addSectionsToDefinition(root->anchors);
@@ -739,7 +760,8 @@ void findUsingDirectives(Entry *root)
       }
       else // unknown namespace, but add it anyway.
       {
-        NamespaceDef *nd=new NamespaceDef(root->name);
+        NamespaceDef *nd=new NamespaceDef(
+            root->fileName,root->startLine,root->name);
         nd->setDocumentation(root->doc); // copy docs to definition
         nd->setBriefDescription(root->brief);
         nd->addSectionsToDefinition(root->anchors);
@@ -846,12 +868,14 @@ static MemberDef *addVariableToClass(
     } 
   }
   // new member variable, typedef or enum value
-  MemberDef *md=new MemberDef(root->type,name,root->args,0,
+  MemberDef *md=new MemberDef(
+      root->fileName,root->startLine,
+      root->type,name,root->args,0,
       prot,Normal,root->stat,FALSE,
       mtype,0,0);
   md->setMemberClass(cd);
-  md->setDefFile(root->fileName);
-  md->setDefLine(root->startLine);
+  //md->setDefFile(root->fileName);
+  //md->setDefLine(root->startLine);
   md->setDocumentation(root->doc);
   md->setBriefDescription(root->brief);
   md->setDefinition(def);
@@ -912,11 +936,13 @@ static MemberDef *addVariableToFile(
               );
 
   // new global variable, enum value or typedef
-  MemberDef *md=new MemberDef(root->type,name,root->args,0,
+  MemberDef *md=new MemberDef(
+      root->fileName,root->startLine,
+      root->type,name,root->args,0,
       Public, Normal,root->stat,FALSE,
       mtype,0,0);
-  md->setDefFile(root->fileName);
-  md->setDefLine(root->startLine);
+  //md->setDefFile(root->fileName);
+  //md->setDefLine(root->startLine);
   md->setDocumentation(root->doc);
   md->setBriefDescription(root->brief);
   md->addSectionsToDefinition(root->anchors);
@@ -1260,12 +1286,14 @@ void buildMemberList(Entry *root)
         // new member function, signal or slot.
         //printf("new member: %s class template args=`%s'\n",
         //          root->args.data(),argListToString(cd->templateArguments()).data());
-        MemberDef *md=new MemberDef(root->type,name,root->args,root->exception,
-                             root->protection,root->virt,root->stat,!root->relates.isEmpty(),
-                             mtype,root->mtArgList,root->argList);
+        MemberDef *md=new MemberDef(
+            root->fileName,root->startLine,
+            root->type,name,root->args,root->exception,
+            root->protection,root->virt,root->stat,!root->relates.isEmpty(),
+            mtype,root->mtArgList,root->argList);
         md->setMemberClass(cd);
-        md->setDefFile(root->fileName);
-        md->setDefLine(root->startLine);
+        //md->setDefFile(root->fileName);
+        //md->setDefLine(root->startLine);
         md->setDocumentation(root->doc);
         md->setBriefDescription(root->brief);
         md->setBodySegment(root->bodyLine,root->endBodyLine);
@@ -1425,11 +1453,13 @@ void buildMemberList(Entry *root)
           
           // new global function
           QCString name=removeRedundantWhiteSpace(root->name);
-          MemberDef *md=new MemberDef(root->type,name,root->args,root->exception,
+          MemberDef *md=new MemberDef(
+              root->fileName,root->startLine,
+              root->type,name,root->args,root->exception,
               root->protection,root->virt,root->stat,FALSE,
               MemberDef::Function,root->tArgList,root->argList);
-          md->setDefFile(root->fileName);
-          md->setDefLine(root->startLine);
+          //md->setDefFile(root->fileName);
+          //md->setDefLine(root->startLine);
           md->setDocumentation(root->doc);
           md->setBriefDescription(root->brief);
           md->setPrototype(root->proto);
@@ -1538,8 +1568,9 @@ void buildMemberList(Entry *root)
     }
     else if (root->name.isEmpty())
     {
-        warn("Warning: Illegal member name found in file %s at line %d\n",
-               root->fileName.data(),root->startLine);
+        warn(root->fileName,root->startLine,
+             "Warning: Illegal member name found."
+            );
     }
   }
   EntryListIterator eli(*root->sublist);
@@ -1819,7 +1850,7 @@ static bool findBaseClassRelation(Entry *root,ClassDef *cd,
         else if (insertUndocumented)
         {
           Debug::print(Debug::Classes,0,"    Undocumented base class `%s' baseClassName=%s\n",bi->name.data(),baseClassName.data());
-          baseClass=new ClassDef(baseClassName,ClassDef::Class);
+          baseClass=new ClassDef(root->fileName,root->startLine,baseClassName,ClassDef::Class);
           // add base class to this class
           cd->insertBaseClass(baseClass,bi->prot,bi->virt,templSpec);
           // add this class as super class to the base class
@@ -1912,10 +1943,11 @@ void computeClassRelations(Entry *root)
     else if (bName.right(2)!="::")
     {
       if (!root->name.isEmpty() && root->name[0]!='@')
-        warn("Warning: Compound %s\n"
-             "         defined in file %s at line %d\n"
-             "         is not documented\n",
-              root->name.data(),root->fileName.data(),root->startLine);
+        warn_undoc(
+                   root->fileName,root->startLine,
+                   "Warning: Compound %s is not documented.",
+                   root->name.data()
+             );
     }
   }
   EntryListIterator eli(*root->sublist);
@@ -2055,8 +2087,8 @@ void addMemberDocs(Entry *root,
       md->setBodyDef(fd);
     }
   }
-  md->setDefFile(root->fileName);
-  md->setDefLine(root->startLine);
+  //md->setDefFile(root->fileName);
+  //md->setDefLine(root->startLine);
   if (root->inLine && !md->isInline()) md->setInline(TRUE);
   md->addSectionsToDefinition(root->anchors);
   addMemberToGroups(root,md);
@@ -2067,9 +2099,12 @@ void addMemberDocs(Entry *root,
     {
       if (md->getMemberGroup()->groupId()!=root->mGrpId)
       {
-        warn("Warning: member %s belongs to two different group. The second "
-            "one is found at line %d of %s and will be ignored\n",
-            md->name().data(),root->startLine,root->fileName.data());
+        warn(
+             root->fileName,root->startLine,
+             "Warning: member %s belongs to two different groups. The second "
+             "one found here will be ignored.",
+             md->name().data()
+            );
       }
     }
     else // set group id
@@ -2184,16 +2219,15 @@ static bool findUnrelatedFunction(Entry *root,
     } 
     if (!found) // no match
     {
-      warn("Warning: no matching member found for \n%s\n"
-           "in file %s at line %d\n",
-           decl,root->fileName.data(),root->startLine);   
+      warn(root->fileName,root->startLine,
+           "Warning: no matching member found for \n%s",decl);   
     }
   }
   else // got docs for an undefined member!
   {
-    warn("Warning: documented function `%s'\nin file %s at line %d "
-         "was not defined \n",decl,
-         root->fileName.data(),root->startLine);
+    warn(root->fileName,root->startLine,
+         "Warning: documented function `%s' was not defined.",decl
+        );
   }
   return TRUE;
 }
@@ -2771,9 +2805,10 @@ void findMember(Entry *root,QCString funcDecl,QCString related,bool overloaded,
           } 
         } 
         if (count==0 && !(isFriend && funcType=="class"))
-          warn("Warning: no matching member found for \n%s\n"
-                 "in file %s at line %d\n",
-                 fullFuncDecl.data(),root->fileName.data(),root->startLine);   
+          warn(root->fileName,root->startLine,
+               "Warning: no matching member found for \n%s",
+               fullFuncDecl.data()
+              );   
 #if 0
         else if (count>1)
         {
@@ -2828,9 +2863,11 @@ void findMember(Entry *root,QCString funcDecl,QCString related,bool overloaded,
           else                 mtype=MemberDef::Function;
           
           // new overloaded member function
-          MemberDef *md=new MemberDef(funcType,funcName,funcArgs,exceptions,
-                            root->protection,root->virt,root->stat,TRUE,
-                            mtype,root->tArgList,root->argList);
+          MemberDef *md=new MemberDef(
+              root->fileName,root->startLine,
+              funcType,funcName,funcArgs,exceptions,
+              root->protection,root->virt,root->stat,TRUE,
+              mtype,root->tArgList,root->argList);
           md->setMemberClass(cd);
           md->setDefinition(funcDecl);
           QCString doc=getOverloadDocs();
@@ -2839,8 +2876,8 @@ void findMember(Entry *root,QCString funcDecl,QCString related,bool overloaded,
           md->setDocumentation(doc);
           //md->setDecFile(root->fileName);
           //md->setDecLine(root->startLine);
-          md->setDefFile(root->fileName);
-          md->setDefLine(root->startLine);
+          //md->setDefFile(root->fileName);
+          //md->setDefLine(root->startLine);
           md->setPrototype(root->proto);
           md->addSectionsToDefinition(root->anchors);
           //if (root->mGrpId!=-1) 
@@ -2862,9 +2899,10 @@ void findMember(Entry *root,QCString funcDecl,QCString related,bool overloaded,
       {
         if (!findUnrelatedFunction(root,namespaceName,funcName,funcTempList,funcArgs,funcDecl))
         {
-          warn("Warning: Cannot determine class for function\n%s\n"
-               "in file %s at line %d\n",fullFuncDecl.data(),
-               root->fileName.data(),root->startLine);   
+          warn(root->fileName,root->startLine,
+               "Warning: Cannot determine class for function\n%s",
+               fullFuncDecl.data()
+              );   
         }
       }
     }
@@ -2908,7 +2946,9 @@ void findMember(Entry *root,QCString funcDecl,QCString related,bool overloaded,
             mtype=MemberDef::Function;
 
           // new related (member) function
-          MemberDef *md=new MemberDef(funcType,funcName,funcArgs,exceptions,
+          MemberDef *md=new MemberDef(
+              root->fileName,root->startLine,
+              funcType,funcName,funcArgs,exceptions,
               root->protection,root->virt,root->stat,TRUE,
               mtype,root->tArgList,root->argList);
           //printf("Related member name=`%s' decl=`%s' bodyLine=`%d'\n",
@@ -2959,8 +2999,8 @@ void findMember(Entry *root,QCString funcDecl,QCString related,bool overloaded,
           md->setMemberClass(cd);
           md->setInline(root->inLine);
           md->setDefinition(funcDecl);
-          md->setDefFile(root->fileName);
-          md->setDefLine(root->startLine);
+          //md->setDefFile(root->fileName);
+          //md->setDefLine(root->startLine);
           md->setPrototype(root->proto);
           md->setDocumentation(root->doc);
           md->setBriefDescription(root->brief);
@@ -2978,8 +3018,11 @@ void findMember(Entry *root,QCString funcDecl,QCString related,bool overloaded,
       }
       else
       {
-        warn("Warning: class `%s' for related function `%s' is not "
-            "documented\n", className.data(),funcName.data());
+        warn_undoc(root->fileName,root->startLine,
+                   "Warning: class `%s' for related function `%s' is not "
+                   "documented.", 
+                   className.data(),funcName.data()
+                  );
       }
     }
     else // unrelated not overloaded member found
@@ -2987,17 +3030,18 @@ void findMember(Entry *root,QCString funcDecl,QCString related,bool overloaded,
       if (className.isEmpty() && 
           !findUnrelatedFunction(root,namespaceName,funcName,funcTempList,funcArgs,funcDecl))
       {
-        warn("Warning: class for member %s (file %s at line %d) cannot "
-             "be found\n", funcName.data(),root->fileName.data(),
-             root->startLine); 
+        warn(root->fileName,root->startLine,
+             "Warning: class for member %s cannot "
+             "be found.", funcName.data()
+            ); 
       }
     }
   }
   else
   {
     // this should not be called
-    warn("Warning: member with no name found in %s at line %d\n",
-              root->fileName.data(),root->startLine);
+    warn(root->fileName,root->startLine,
+         "Warning: member with no name found.");
   }
   return;
 } 
@@ -3164,11 +3208,13 @@ void findEnums(Entry *root)
     if (!name.isEmpty())
     {
       // new enum type
-      md = new MemberDef(0,name,0,0,root->protection,Normal,FALSE,FALSE,
-               MemberDef::Enumeration,0,0);
+      md = new MemberDef(
+          root->fileName,root->startLine,
+          0,name,0,0,root->protection,Normal,FALSE,FALSE,
+          MemberDef::Enumeration,0,0);
       if (!isGlobal) md->setMemberClass(cd); else md->setFileDef(fd);
-      md->setDefFile(root->fileName);
-      md->setDefLine(root->startLine);
+      //md->setDefFile(root->fileName);
+      //md->setDefLine(root->startLine);
       md->setBodySegment(root->bodyLine,root->endBodyLine);
       bool ambig;
       md->setBodyDef(findFileDef(&inputNameDict,root->fileName,ambig));
@@ -3360,9 +3406,10 @@ void findEnumDocumentation(Entry *root)
       } 
       if (!found)
       {
-        warn("Warning: Documentation for undefined enum `%s' found at"
-             " line %d of file %s\n",name.data(),
-               root->startLine,root->fileName.data());
+        warn(root->fileName,root->startLine,
+             "Warning: Documentation for undefined enum `%s' found.",
+             name.data()
+            );
       }
     }
   }
@@ -3739,6 +3786,45 @@ void inheritDocumentation()
 
 //----------------------------------------------------------------------------
 
+void distributeMemberGroupDocumentation()
+{
+  // for each class
+  ClassListIterator cli(classList);
+  ClassDef *cd;
+  for ( ; (cd=cli.current()) ; ++cli )
+  {
+    cd->distributeMemberGroupDocumentation();
+  }
+  // for each file
+  FileName *fn=inputNameList.first();
+  while (fn)
+  {
+    FileDef *fd=fn->first();
+    while (fd)
+    {
+      fd->distributeMemberGroupDocumentation();
+      fd=fn->next();
+    }
+    fn=inputNameList.next();
+  }
+  // for each namespace
+  NamespaceDef *nd=namespaceList.first();
+  while (nd)
+  {
+    nd->distributeMemberGroupDocumentation();
+    nd=namespaceList.next();
+  }
+  // for each group
+  GroupDef *gd=groupList.first();
+  while (gd)
+  {
+    gd->distributeMemberGroupDocumentation();
+    gd=groupList.next();
+  }
+}
+
+//----------------------------------------------------------------------------
+
 void findDefineDocumentation(Entry *root)
 {
   if ((root->section==Entry::DEFINEDOC_SEC ||
@@ -3833,8 +3919,10 @@ void findDefineDocumentation(Entry *root)
     }
     else if (!root->doc.isEmpty() || !root->brief.isEmpty()) // define not found
     {
-      warn("Warning: documentation for unknown define %s found at line %d of "
-           "file %s\n",root->name.data(),root->startLine,root->fileName.data());
+      warn(root->fileName,root->startLine,
+           "Warning: documentation for unknown define %s found.\n",
+           root->name.data()
+          );
     }
   }
   EntryListIterator eli(*root->sublist);
@@ -3873,7 +3961,8 @@ void buildPageList(Entry *root)
           baseName=baseName.left(baseName.length()-4);
         else if (baseName.right(5)==".html")
           baseName=baseName.left(baseName.length()-5);
-        pi=new PageInfo(baseName, root->doc,
+        pi=new PageInfo(root->fileName,root->startLine,
+                        baseName, root->doc,
                         root->args.stripWhiteSpace());
         QCString pageName;
         if (Config::caseSensitiveNames)
@@ -3914,14 +4003,17 @@ void findMainPage(Entry *root)
     if (mainPage==0)
     {
       //printf("Found main page! \n======\n%s\n=======\n",root->doc.data());
-      mainPage = new PageInfo("index", root->doc,
-                        root->args.stripWhiteSpace());
+      mainPage = new PageInfo(root->fileName,root->startLine,
+                              "index", root->doc,
+                              root->args.stripWhiteSpace());
       setFileNameForSections(root->anchors,"index");
     }
     else
     {
-      warn("Warning: found more than one \\mainpage comment block!\n Skipping the "
-           "block at line %d of %s\n",root->startLine,root->fileName.data());
+      warn(root->fileName,root->startLine,
+           "Warning: found more than one \\mainpage comment block! Skipping this "
+           "block."
+          );
     }
   }
   EntryListIterator eli(*root->sublist);
@@ -3995,7 +4087,7 @@ void generatePageDocs()
       outputList->writeSection(si->label,si->title,FALSE);
     }
     outputList->startTextBlock();
-    parseDoc(*outputList,0,0,pi->doc);
+    parseDoc(*outputList,pi->defFileName,pi->defLine,0,0,pi->doc);
     outputList->endTextBlock();
     endFile(*outputList);
     outputList->enable(OutputGenerator::Man);
@@ -4014,13 +4106,16 @@ void buildExampleList(Entry *root)
     {
       if (exampleDict[root->name])
       {
-        warn("Warning: Example %s was already documented. Ignoring "
-             "documentation at line %d of %s\n",root->name.data(),
-             root->startLine,root->fileName.data());
+        warn(root->fileName,root->startLine,
+             "Warning: Example %s was already documented. Ignoring "
+             "documentation found here.",
+             root->name.data()
+            );
       }
       else
       {
-        PageInfo *pi=new PageInfo(root->name,root->doc,root->args);
+        PageInfo *pi=new PageInfo(root->fileName,root->startLine,
+                                  root->name,root->doc,root->args);
         setFileNameForSections(root->anchors,
                                convertSlashes(pi->name,TRUE)+"-example"
                               );
@@ -4340,7 +4435,7 @@ void readTagFile(const char *tl)
   QFileInfo fi(fileName);
   if (!fi.exists() || !fi.isFile())
   {
-    warn("Warning: Tag file `%s' does not exist or is not a file. Skipping it...\n",
+    err("Error: Tag file `%s' does not exist or is not a file. Skipping it...\n",
         fileName.data());
     return;
   }
@@ -4457,12 +4552,12 @@ void copyStyleSheet()
       }
       else
       {
-        warn("Warning: could not write to style sheet %s\n",destFileName.data());
+        err("Error: could not write to style sheet %s\n",destFileName.data());
       }
     }
     else
     {
-      warn("Warning: could not open user specified style sheet %s\n",Config::htmlStyleSheet.data());
+      err("Error: could not open user specified style sheet %s\n",Config::htmlStyleSheet.data());
       Config::htmlStyleSheet.resize(0); // revert to the default
     }
   }
@@ -4709,7 +4804,7 @@ void readFormulaRepository()
       int se=line.find(':'); // find name and text separator.
       if (se==-1)
       {
-        warn("Warning: formula.repository is corrupted!\n");
+        err("Error: formula.repository is corrupted!\n");
         break;
       }
       else
@@ -4969,7 +5064,7 @@ int main(int argc,char **argv)
 
   if (input.isEmpty())
   {
-    warn("No input read, no output generated!\n");
+    err("No input read, no output generated!\n");
     exit(1);
   }
   else
@@ -5117,6 +5212,9 @@ int main(int argc,char **argv)
     inheritDocumentation();
   }
 
+  msg("Distributing member group documentation.\n");
+  distributeMemberGroupDocumentation();
+
   /**************************************************************************
    *                        Generate documentation                          *
    **************************************************************************/
diff --git a/src/doxygen.h b/src/doxygen.h
index 93a2a27..fc4b5ea 100644
--- a/src/doxygen.h
+++ b/src/doxygen.h
@@ -36,8 +36,14 @@
 
 struct PageInfo
 {
-  PageInfo(const char *n,const char *d,const char *t) 
-     { name=n; doc=d; title=t; }
+  PageInfo(const char *f, int l,const char *n,const char *d,const char *t) :
+     defFileName(f), defLine(l), name(n), doc(d), title(t) {}
+
+  // where the page definition was found
+  QCString defFileName;
+  int defLine;
+
+  // contents of the page
   QCString name;
   QCString doc;
   QCString title;
diff --git a/src/entry.cpp b/src/entry.cpp
index 2b4f4ce..e3aaa8d 100644
--- a/src/entry.cpp
+++ b/src/entry.cpp
@@ -207,6 +207,7 @@ void Entry::reset()
   scopeSpec.resize(0);
   memberSpec.resize(0);
   initializer.resize(0);
+  startLine = 1;
   bodyLine = -1;
   endBodyLine = -1;
   mGrpId = -1;
@@ -217,6 +218,7 @@ void Entry::reset()
   stat    = FALSE;
   proto   = FALSE;
   inLine  = FALSE;
+  subGrouping = TRUE;
   protection = Public;
   sublist->clear();
   extends->clear();
diff --git a/src/entry.h b/src/entry.h
index 4adc374..74eea8f 100644
--- a/src/entry.h
+++ b/src/entry.h
@@ -159,6 +159,7 @@ class Entry
     bool stat;                // static ?
     bool proto;               // prototype ?
     bool inLine;              // inline ?
+    bool subGrouping;         // automatically group class members?
     Specifier    virt;        // virtualness of the entry 
     Entry       *parent;      // parent node in the tree
     QCString	 type;        // member type 
diff --git a/src/filedef.cpp b/src/filedef.cpp
index 657f2d9..f7853a7 100644
--- a/src/filedef.cpp
+++ b/src/filedef.cpp
@@ -35,7 +35,7 @@
     file was read from a tag file or 0 otherwise
 */
 FileDef::FileDef(const char *p,const char *nm,const char *ref)
-   : Definition(nm)
+   : Definition((QCString)p+nm,1,nm)
 {
   path=p;
   filepath=path+nm;
@@ -83,6 +83,16 @@ void FileDef::computeAnchors()
   setAnchors('a',&allMemberList);
 }
 
+void FileDef::distributeMemberGroupDocumentation()
+{
+  MemberGroupListIterator mgli(*memberGroupList);
+  MemberGroup *mg;
+  for (;(mg=mgli.current());++mgli)
+  {
+    mg->distributeMemberGroupDocumentation();
+  }
+}
+
 /*! Write the documentation page for this file to the file of output
     generators \a ol. 
 */
@@ -95,6 +105,8 @@ void FileDef::writeDocumentation(OutputList &ol)
   //{
   //  fn.prepend(stripFromPath(getPath().copy()));
   //}
+
+  //printf("WriteDocumentation %p diskname=%s\n",this,diskname.data());
   
   QCString pageTitle=name()+" File Reference";
   startFile(ol,diskname,pageTitle);
@@ -113,7 +125,7 @@ void FileDef::writeDocumentation(OutputList &ol)
   {
     //if (brief.at(bl-1)!='.' && brief.at(bl-1)!='!' && brief.at(bl!='?')) 
     //  brief+='.';
-    parseDoc(briefOutput,0,0,briefDescription());
+    parseDoc(briefOutput,filepath,1,0,0,briefDescription());
     ol+=briefOutput;
     ol.writeString(" \n");
     ol.disableAllBut(OutputGenerator::Html);
@@ -293,7 +305,7 @@ void FileDef::writeDocumentation(OutputList &ol)
     {
       //if (doc.at(dl-1)!='.' && doc.at(dl-1)!='!' && doc.at(dl-1)!='?') 
       //  doc+='.';
-      parseDoc(ol,0,0,documentation()+"\n");
+      parseDoc(ol,filepath,1,0,0,documentation()+"\n");
     }
     //printf("Writing source ref for file %s\n",name().data());
     if (Config::sourceBrowseFlag) 
diff --git a/src/filedef.h b/src/filedef.h
index 03ef921..3791473 100644
--- a/src/filedef.h
+++ b/src/filedef.h
@@ -125,6 +125,8 @@ class FileDef : public Definition
     QList<IncludeInfo> *includeFileList() const { return includeList; }
     QDict<IncludeInfo> *includeFileDict() const { return includeDict; }
 
+    void distributeMemberGroupDocumentation();
+
   private: 
     MemberList allMemberList;
     MemberList defineMembers;
diff --git a/src/filename.cpp b/src/filename.cpp
index 69646ec..6e1fa0a 100644
--- a/src/filename.cpp
+++ b/src/filename.cpp
@@ -55,7 +55,7 @@ void FileName::generateDiskNames()
     //printf("Multiple occurrences of %s\n",name.data());
     int i=0,j=0;
     bool found=FALSE;
-    while (!found)
+    while (!found) // search for the common prefix of all paths
     {
       fd=first();
       while (fd && fd->isReference()) fd=next();
@@ -66,7 +66,7 @@ void FileName::generateDiskNames()
       {
         if (!fd->isReference())
         {
-          //printf("i=%d fd->path=`%s' fd->name=`%s'\n",i,fd->path.data(),fd->name().data());
+          //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())
           {
             //warning("Warning: Input file %s found multiple times!\n"
@@ -88,8 +88,9 @@ void FileName::generateDiskNames()
       //printf("fd->setName(%s)\n",(fd->path.right(fd->path.length()-j-1)+name).data());
       if (!fd->isReference())
       {
-        fd->setName(fd->path.right(fd->path.length()-j-1)+name);
-        fd->diskname=convertSlashes(fd->name());
+        QCString prefix = fd->path.right(fd->path.length()-j-1);
+        fd->setName(prefix+name);
+        fd->diskname=convertSlashes(prefix+name);
       }
       fd=next();
     }
diff --git a/src/filename.h b/src/filename.h
index aefacb9..48c73ec 100644
--- a/src/filename.h
+++ b/src/filename.h
@@ -61,7 +61,8 @@ class FileNameListIterator : public QListIterator<FileName>
 class FileNameDict : public QDict<FileName>
 {
   public:
-    FileNameDict(uint size) : QDict<FileName>(size) {}
+    FileNameDict(uint size) : 
+       QDict<FileName>(size,Config::caseSensitiveNames) {}
    ~FileNameDict() {}
 };
 
diff --git a/src/groupdef.cpp b/src/groupdef.cpp
index 255c200..0bbe773 100644
--- a/src/groupdef.cpp
+++ b/src/groupdef.cpp
@@ -31,8 +31,8 @@
 #include "membergroup.h"
 #include "doxygen.h"
 
-GroupDef::GroupDef(const char *na,const char *t) : 
-   Definition(na)
+GroupDef::GroupDef(const char *df,int dl,const char *na,const char *t) : 
+   Definition(df,dl,na)
 {
   fileList = new FileList;
   classList = new ClassList;
@@ -66,6 +66,16 @@ GroupDef::~GroupDef()
   delete memberGroupDict;
 }
 
+void GroupDef::distributeMemberGroupDocumentation()
+{
+  MemberGroupListIterator mgli(*memberGroupList);
+  MemberGroup *mg;
+  for (;(mg=mgli.current());++mgli)
+  {
+    mg->distributeMemberGroupDocumentation();
+  }
+}
+
 void GroupDef::addFile(const FileDef *def)
 {
   fileList->append(def);
@@ -159,7 +169,7 @@ void GroupDef::writeDocumentation(OutputList &ol)
   OutputList briefOutput(&ol);
   if (!briefDescription().isEmpty())
   {
-    parseDoc(briefOutput,name(),0,briefDescription());
+    parseDoc(briefOutput,defFileName,defLine,name(),0,briefDescription());
     ol+=briefOutput;
     ol.writeString(" \n");
     ol.pushGeneratorState();
@@ -189,7 +199,7 @@ void GroupDef::writeDocumentation(OutputList &ol)
       if (!fd->briefDescription().isEmpty() && Config::briefMemDescFlag)
       {
         ol.startMemberDescription();
-        parseDoc(ol,0,0,fd->briefDescription());
+        parseDoc(ol,defFileName,defLine,0,0,fd->briefDescription());
         ol.endMemberDescription();
         ol.newParagraph();
       }
@@ -214,7 +224,7 @@ void GroupDef::writeDocumentation(OutputList &ol)
       if (!nd->briefDescription().isEmpty() && Config::briefMemDescFlag)
       {
         ol.startMemberDescription();
-        parseDoc(ol,0,0,nd->briefDescription());
+        parseDoc(ol,defFileName,defLine,0,0,nd->briefDescription());
         ol.endMemberDescription();
         ol.newParagraph();
       }
@@ -238,7 +248,7 @@ void GroupDef::writeDocumentation(OutputList &ol)
       if (!gd->briefDescription().isEmpty() && Config::briefMemDescFlag)
       {
         ol.startMemberDescription();
-        parseDoc(ol,0,0,gd->briefDescription());
+        parseDoc(ol,defFileName,defLine,0,0,gd->briefDescription());
         ol.endMemberDescription();
         ol.newParagraph();
       }
@@ -284,7 +294,7 @@ void GroupDef::writeDocumentation(OutputList &ol)
     // write documentation
     if (!documentation().isEmpty())
     {
-      parseDoc(ol,name(),0,documentation()+"\n");
+      parseDoc(ol,defFileName,defLine,name(),0,documentation()+"\n");
     }
   }
 
@@ -427,7 +437,8 @@ void addMemberToGroups(Entry *root,MemberDef *md)
       }
       else if (mgd!=gd)
       {
-        warn("Warning: Member %s found in multiple groups.!\n"
+        warn(mgd->getDefFileName(),mgd->getDefLine(),
+             "Warning: Member %s found in multiple groups.!\n"
              "The member will be put in group %s, and not in group %s",
               md->name().data(),mgd->name().data(),gd->name().data()
             );
diff --git a/src/groupdef.h b/src/groupdef.h
index 03adc17..4f90bb3 100644
--- a/src/groupdef.h
+++ b/src/groupdef.h
@@ -39,7 +39,7 @@ class MemberGroupDict;
 class GroupDef : public Definition
 {
   public:
-    GroupDef(const char *name,const char *title);
+    GroupDef(const char *fileName,int line,const char *name,const char *title);
    ~GroupDef();
     QCString getOutputFileBase() const { return fileName; }
     const char *groupTitle() const { return title; }
@@ -60,6 +60,7 @@ class GroupDef : public Definition
       return isLinkableInProject() || isReference();
     }
     void computeAnchors();
+    void distributeMemberGroupDocumentation();
 
   private: 
     QCString title;                     // title of the group
diff --git a/src/htmlgen.cpp b/src/htmlgen.cpp
index 0b58044..1c76c27 100644
--- a/src/htmlgen.cpp
+++ b/src/htmlgen.cpp
@@ -154,7 +154,7 @@ void HtmlGenerator::writeFooter(int part,bool external)
         }
         t << "doxygen.gif\" alt=\"doxygen\" " 
           << "align=center border=0 " << endl << 
-             "width=118 height=53></a> " << versionString <<" ";
+             "width=110 height=53></a>" << versionString <<" ";
       }
       break;
     default:
diff --git a/src/index.cpp b/src/index.cpp
index 86d35c0..6ed094a 100644
--- a/src/index.cpp
+++ b/src/index.cpp
@@ -393,7 +393,8 @@ void writeFileIndex(OutputList &ol)
           {
             ol.docify(" (");
             OutputList briefOutput(&ol);
-            parseDoc(briefOutput,0,0,
+            parseDoc(briefOutput,fd->absFilePath(),1,
+                0,0,
                 abbreviate(fd->briefDescription(),fd->name()));
             ol+=briefOutput;
             ol.docify(")");
@@ -432,7 +433,9 @@ void writeFileIndex(OutputList &ol)
         {
           ol.docify(" (");
           OutputList briefOutput(&ol);
-          parseDoc(briefOutput,0,0,
+          parseDoc(briefOutput,
+              fd->absFilePath(),1,
+              0,0,
               abbreviate(fd->briefDescription(),fd->name()));
           ol+=briefOutput;
           ol.docify(")");
@@ -580,8 +583,10 @@ void writeNamespaceIndex(OutputList &ol)
       if (!nd->briefDescription().isEmpty())
       {
         OutputList briefOutput(&ol);
-        parseDoc(briefOutput,nd->name(),0,
-                      abbreviate(nd->briefDescription(),nd->name()));
+        parseDoc(briefOutput,
+                 nd->getDefFileName(),nd->getDefLine(),
+                 nd->name(),0,
+                 abbreviate(nd->briefDescription(),nd->name()));
         ol+=briefOutput;
       }
       else
@@ -654,8 +659,10 @@ void writeAnnotatedClassList(OutputList &ol)
       if (!cd->briefDescription().isEmpty())
       {
         OutputList briefOutput(&ol);
-        parseDoc(briefOutput,cd->name(),0,
-                      abbreviate(cd->briefDescription(),cd->name()));
+        parseDoc(briefOutput,
+                 cd->getDefFileName(),cd->getDefLine(),
+                 cd->name(),0,
+                 abbreviate(cd->briefDescription(),cd->name()));
         ol+=briefOutput;
       }
       else
@@ -1454,10 +1461,15 @@ void writeGroupList(OutputList &ol)
     {
       ol.startDescItem();
       ol.startTextLink(gd->getOutputFileBase(),0);
-      parseDoc(ol,0,0,gd->groupTitle());
+      parseDoc(ol,
+          gd->getDefFileName(),gd->getDefLine(),
+          0,0,
+          gd->groupTitle());
       ol.endTextLink();
       ol.endDescItem();
-      parseDoc(ol,0,0,gd->briefDescription());
+      parseDoc(ol,
+          gd->getDefFileName(),gd->getDefLine(),
+          0,0,gd->briefDescription());
       ol.newParagraph();
     }
   }
@@ -1517,6 +1529,11 @@ void writeIndex(OutputList &ol)
   //ol.disable(OutputGenerator::Latex);
   ol.disableAllBut(OutputGenerator::Html);
 
+  QCString defFileName = 
+    mainPage ? mainPage->defFileName.data() : "<generated>";
+  int defLine =
+    mainPage ? mainPage->defLine : 1;
+
   if (!mainPage || mainPage->title.isEmpty())
     ol.startFile("index","Main Index",FALSE);
   else 
@@ -1526,7 +1543,7 @@ void writeIndex(OutputList &ol)
   ol.startTitleHead(0);
   if (mainPage && !mainPage->title.isEmpty())
   {
-    parseDoc(ol,0,0,mainPage->title);
+    parseDoc(ol,defFileName,defLine,0,0,mainPage->title);
   }
   else
   {
@@ -1537,14 +1554,14 @@ void writeIndex(OutputList &ol)
   if (!Config::projectNumber.isEmpty())
   {
     ol.startProjectNumber();
-    parseDoc(ol,0,0,Config::projectNumber);
+    parseDoc(ol,defFileName,defLine,0,0,Config::projectNumber);
     ol.endProjectNumber();
   }
   if (Config::noIndexFlag) writeQuickLinks(ol,FALSE);
 
   if (mainPage)
   {
-    parseDoc(ol,0,0,mainPage->doc);
+    parseDoc(ol,defFileName,defLine,0,0,mainPage->doc);
   }
   
   endFile(ol);
@@ -1565,7 +1582,7 @@ void writeIndex(OutputList &ol)
   if (!Config::projectNumber.isEmpty())
   {
     ol.startProjectNumber(); 
-    parseDoc(ol,0,0,Config::projectNumber);
+    parseDoc(ol,defFileName,defLine,0,0,Config::projectNumber);
     ol.endProjectNumber();
   }
   ol.endIndexSection(isTitlePageStart);
@@ -1577,7 +1594,7 @@ void writeIndex(OutputList &ol)
     ol.startIndexSection(isMainPage);
     if (!mainPage->title.isEmpty())
     {
-      parseDoc(ol,0,0,mainPage->title);
+      parseDoc(ol,defFileName,defLine,0,0,mainPage->title);
     }
     else
     {
@@ -1674,7 +1691,7 @@ void writeIndex(OutputList &ol)
       ol.writeSection(si->label,si->title,FALSE);
     }
     ol.startTextBlock();
-    parseDoc(ol,0,0,mainPage->doc);
+    parseDoc(ol,defFileName,defLine,0,0,mainPage->doc);
     ol.endTextBlock();
     endFile(ol);
     ol.enable(OutputGenerator::Man);
diff --git a/src/latexgen.cpp b/src/latexgen.cpp
index ee822da..671d377 100644
--- a/src/latexgen.cpp
+++ b/src/latexgen.cpp
@@ -596,7 +596,7 @@ void LatexGenerator::writeStyleInfo(int part)
         t << "\\newenvironment{CompactItemize}\n";
         t << "{\n";
         t << "  \\begin{itemize}\n";
-        t << "  \\setlength{\\itemsep}{-4pt}\n";
+        t << "  \\setlength{\\itemsep}{-3pt}\n";
         t << "  \\setlength{\\parsep}{0pt}\n";
         t << "  \\setlength{\\topsep}{0pt}\n";
         t << "  \\setlength{\\partopsep}{0pt}\n";
diff --git a/src/logos.cpp b/src/logos.cpp
index d019a92..f598435 100644
--- a/src/logos.cpp
+++ b/src/logos.cpp
@@ -31,303 +31,207 @@ unsigned char null_data[] = {
 unsigned int null_len = 43;
 
 unsigned char logo_data[] = {
-  0x47, 0x49, 0x46, 0x38, 0x37, 0x61, 0x76, 0x00, 0x35, 0x00, 0xf7, 0x00,
-  0x00, 0x31, 0x7b, 0x6b, 0x31, 0x7b, 0x73, 0x31, 0x84, 0x7b, 0x31, 0x84,
-  0x84, 0x31, 0x8c, 0x7b, 0x31, 0x8c, 0x84, 0x31, 0x8c, 0x8c, 0x39, 0x7b,
-  0x7b, 0x39, 0x84, 0x7b, 0x39, 0x84, 0x84, 0x39, 0x8c, 0x84, 0x39, 0x94,
-  0x8c, 0x39, 0x94, 0x94, 0x39, 0x9c, 0x94, 0x42, 0x7b, 0x73, 0x42, 0x8c,
-  0x84, 0x42, 0x94, 0x8c, 0x42, 0x9c, 0x8c, 0x42, 0x9c, 0x94, 0x42, 0xa5,
-  0x9c, 0x4a, 0x5a, 0x5a, 0x4a, 0x84, 0x84, 0x4a, 0x8c, 0x84, 0x4a, 0x94,
-  0x8c, 0x4a, 0x94, 0x94, 0x4a, 0x9c, 0x94, 0x4a, 0xa5, 0x94, 0x4a, 0xa5,
-  0x9c, 0x4a, 0xa5, 0xa5, 0x52, 0x52, 0x52, 0x52, 0x73, 0x73, 0x52, 0x7b,
-  0x7b, 0x52, 0x84, 0x84, 0x52, 0x94, 0x8c, 0x52, 0x9c, 0x94, 0x52, 0xa5,
-  0x9c, 0x52, 0xad, 0xa5, 0x52, 0xb5, 0xad, 0x5a, 0x5a, 0x5a, 0x5a, 0x63,
-  0x63, 0x5a, 0x6b, 0x6b, 0x5a, 0x7b, 0x7b, 0x5a, 0x8c, 0x84, 0x5a, 0x8c,
-  0x8c, 0x5a, 0x94, 0x8c, 0x5a, 0x94, 0x94, 0x5a, 0x9c, 0x94, 0x5a, 0xa5,
-  0x9c, 0x5a, 0xa5, 0xa5, 0x5a, 0xad, 0xa5, 0x5a, 0xb5, 0xad, 0x5a, 0xbd,
-  0xb5, 0x63, 0x63, 0x63, 0x63, 0x6b, 0x6b, 0x63, 0x73, 0x73, 0x63, 0x7b,
-  0x7b, 0x63, 0x84, 0x84, 0x63, 0x8c, 0x8c, 0x63, 0x94, 0x94, 0x63, 0xa5,
-  0x9c, 0x63, 0xa5, 0xa5, 0x63, 0xad, 0xa5, 0x63, 0xb5, 0xad, 0x63, 0xb5,
-  0xb5, 0x63, 0xbd, 0xbd, 0x6b, 0x6b, 0x6b, 0x6b, 0x73, 0x73, 0x6b, 0x7b,
-  0x7b, 0x6b, 0x8c, 0x8c, 0x6b, 0x9c, 0x94, 0x6b, 0xa5, 0x9c, 0x6b, 0xad,
-  0xa5, 0x6b, 0xb5, 0xad, 0x6b, 0xb5, 0xb5, 0x6b, 0xbd, 0xb5, 0x6b, 0xbd,
-  0xbd, 0x6b, 0xc6, 0xbd, 0x6b, 0xc6, 0xc6, 0x6b, 0xce, 0xc6, 0x73, 0x73,
-  0x73, 0x73, 0x7b, 0x7b, 0x73, 0x84, 0x84, 0x73, 0x8c, 0x8c, 0x73, 0x94,
-  0x8c, 0x73, 0x94, 0x94, 0x73, 0x9c, 0x94, 0x73, 0x9c, 0x9c, 0x73, 0xa5,
-  0x9c, 0x73, 0xa5, 0xa5, 0x73, 0xad, 0xad, 0x73, 0xb5, 0xad, 0x73, 0xb5,
-  0xb5, 0x73, 0xbd, 0xbd, 0x73, 0xce, 0xce, 0x7b, 0x7b, 0x7b, 0x7b, 0x8c,
-  0x8c, 0x7b, 0x94, 0x94, 0x7b, 0x9c, 0x9c, 0x7b, 0xa5, 0xa5, 0x7b, 0xb5,
-  0xb5, 0x7b, 0xbd, 0xb5, 0x7b, 0xbd, 0xbd, 0x7b, 0xc6, 0xc6, 0x7b, 0xce,
-  0xc6, 0x7b, 0xce, 0xce, 0x7b, 0xd6, 0xce, 0x7b, 0xd6, 0xd6, 0x7b, 0xde,
-  0xd6, 0x84, 0x84, 0x84, 0x84, 0x8c, 0x8c, 0x84, 0x9c, 0x94, 0x84, 0x9c,
-  0x9c, 0x84, 0xa5, 0x9c, 0x84, 0xad, 0xad, 0x84, 0xb5, 0xb5, 0x84, 0xc6,
-  0xc6, 0x84, 0xce, 0xce, 0x84, 0xd6, 0xd6, 0x8c, 0x7b, 0x7b, 0x8c, 0x84,
-  0x84, 0x8c, 0x8c, 0x8c, 0x8c, 0xa5, 0xa5, 0x8c, 0xad, 0xad, 0x8c, 0xb5,
-  0xb5, 0x8c, 0xbd, 0xb5, 0x8c, 0xbd, 0xbd, 0x8c, 0xc6, 0xc6, 0x8c, 0xce,
-  0xce, 0x8c, 0xde, 0xde, 0x94, 0x7b, 0x7b, 0x94, 0x94, 0x94, 0x94, 0x9c,
-  0x9c, 0x94, 0xa5, 0xa5, 0x94, 0xad, 0xad, 0x94, 0xbd, 0xb5, 0x94, 0xc6,
-  0xbd, 0x9c, 0x9c, 0x9c, 0x9c, 0xa5, 0xa5, 0x9c, 0xb5, 0xb5, 0x9c, 0xbd,
-  0xbd, 0x9c, 0xc6, 0xbd, 0x9c, 0xc6, 0xc6, 0x9c, 0xce, 0xc6, 0x9c, 0xce,
-  0xce, 0x9c, 0xd6, 0xd6, 0xa5, 0x5a, 0x5a, 0xa5, 0x63, 0x63, 0xa5, 0x84,
-  0x84, 0xa5, 0x94, 0x94, 0xa5, 0xa5, 0xa5, 0xa5, 0xad, 0xa5, 0xa5, 0xbd,
-  0xbd, 0xa5, 0xc6, 0xc6, 0xa5, 0xce, 0xce, 0xa5, 0xd6, 0xd6, 0xa5, 0xde,
-  0xde, 0xa5, 0xe7, 0xde, 0xad, 0x21, 0x18, 0xad, 0x21, 0x21, 0xad, 0x52,
-  0x52, 0xad, 0x63, 0x63, 0xad, 0x7b, 0x7b, 0xad, 0xad, 0xad, 0xad, 0xb5,
-  0xb5, 0xad, 0xbd, 0xbd, 0xad, 0xce, 0xc6, 0xad, 0xce, 0xce, 0xad, 0xd6,
-  0xce, 0xad, 0xd6, 0xd6, 0xb5, 0x21, 0x21, 0xb5, 0x52, 0x52, 0xb5, 0x5a,
-  0x5a, 0xb5, 0x63, 0x63, 0xb5, 0x6b, 0x6b, 0xb5, 0xb5, 0xb5, 0xb5, 0xc6,
-  0xc6, 0xb5, 0xce, 0xce, 0xb5, 0xd6, 0xce, 0xb5, 0xd6, 0xd6, 0xb5, 0xde,
-  0xd6, 0xb5, 0xde, 0xde, 0xb5, 0xe7, 0xe7, 0xbd, 0x21, 0x21, 0xbd, 0x29,
-  0x29, 0xbd, 0x42, 0x42, 0xbd, 0x52, 0x52, 0xbd, 0x73, 0x73, 0xbd, 0x7b,
-  0x7b, 0xbd, 0x84, 0x84, 0xbd, 0xbd, 0xbd, 0xbd, 0xc6, 0xc6, 0xbd, 0xce,
-  0xce, 0xbd, 0xd6, 0xd6, 0xbd, 0xde, 0xde, 0xc6, 0x39, 0x39, 0xc6, 0x73,
-  0x73, 0xc6, 0x7b, 0x7b, 0xc6, 0x84, 0x84, 0xc6, 0x8c, 0x8c, 0xc6, 0x94,
-  0x94, 0xc6, 0xc6, 0xc6, 0xc6, 0xce, 0xce, 0xc6, 0xd6, 0xd6, 0xc6, 0xde,
-  0xde, 0xc6, 0xef, 0xe7, 0xce, 0x7b, 0x7b, 0xce, 0x8c, 0x8c, 0xce, 0x94,
-  0x94, 0xce, 0xce, 0xce, 0xce, 0xd6, 0xd6, 0xce, 0xde, 0xde, 0xce, 0xe7,
-  0xe7, 0xd6, 0x84, 0x84, 0xd6, 0x94, 0x8c, 0xd6, 0x94, 0x94, 0xd6, 0x9c,
-  0x9c, 0xd6, 0xad, 0xad, 0xd6, 0xd6, 0xd6, 0xd6, 0xe7, 0xde, 0xd6, 0xef,
-  0xef, 0xde, 0xa5, 0xa5, 0xde, 0xbd, 0xbd, 0xde, 0xce, 0xce, 0xde, 0xde,
-  0xde, 0xde, 0xe7, 0xe7, 0xde, 0xef, 0xe7, 0xde, 0xef, 0xef, 0xe7, 0xbd,
-  0xbd, 0xe7, 0xe7, 0xe7, 0xe7, 0xef, 0xef, 0xe7, 0xf7, 0xf7, 0xef, 0xd6,
-  0xd6, 0xef, 0xef, 0xef, 0xef, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xff,
-  0xf7, 0xf7, 0xff, 0xff, 0xff, 0xf7, 0xf7, 0xff, 0xff, 0xff, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x76, 0x00, 0x35, 0x00, 0x00, 0x08,
-  0xfe, 0x00, 0xdd, 0x09, 0x1c, 0x48, 0xb0, 0xa0, 0xba, 0x45, 0x71, 0x76,
-  0xc8, 0x29, 0xc8, 0xb0, 0xa1, 0xc3, 0x87, 0x10, 0x23, 0x4a, 0x9c, 0x48,
-  0xb1, 0xa2, 0x3a, 0x74, 0xe4, 0xb4, 0x05, 0x10, 0x10, 0xa0, 0x48, 0xc5,
-  0x8f, 0x20, 0x43, 0x8a, 0x1c, 0x59, 0x10, 0x5d, 0xb6, 0x5e, 0xae, 0x14,
-  0x08, 0x10, 0xe0, 0x91, 0xa4, 0xcb, 0x97, 0x30, 0x43, 0xaa, 0xfb, 0xd6,
-  0x4b, 0x50, 0x1b, 0x08, 0x1c, 0x8d, 0xc4, 0xdc, 0xc9, 0xb3, 0xe7, 0x40,
-  0x75, 0xd9, 0x2a, 0x3d, 0x09, 0xb2, 0x40, 0xa5, 0x4e, 0x9f, 0x48, 0x93,
-  0xca, 0x84, 0x86, 0xe8, 0x09, 0x8d, 0x05, 0x0b, 0x04, 0x1c, 0x55, 0x4a,
-  0xb5, 0xaa, 0x43, 0x93, 0x88, 0x82, 0xd0, 0xb8, 0xb0, 0x60, 0xc0, 0x54,
-  0xab, 0x60, 0xad, 0x02, 0xcd, 0x4a, 0x43, 0x42, 0xd4, 0x23, 0x61, 0xd3,
-  0x56, 0x55, 0xc7, 0x34, 0x48, 0x8d, 0x0d, 0x10, 0x14, 0x60, 0x51, 0x4b,
-  0x17, 0x29, 0x5b, 0xb2, 0x19, 0x24, 0x14, 0xf8, 0x5a, 0xb7, 0xaf, 0xcb,
-  0xb1, 0x41, 0x4e, 0x60, 0x90, 0xa0, 0x00, 0xad, 0xdf, 0xc3, 0x24, 0xef,
-  0x6a, 0xcd, 0xab, 0x80, 0x2f, 0xe2, 0xc7, 0x13, 0xd1, 0xb5, 0xad, 0x31,
-  0xc2, 0xac, 0x61, 0xc8, 0x98, 0x1d, 0x5e, 0x64, 0xa6, 0xe9, 0x8f, 0x9f,
-  0x38, 0x42, 0x68, 0x90, 0x20, 0x7c, 0x59, 0xa0, 0x3a, 0x75, 0xe0, 0x64,
-  0x39, 0xfa, 0x03, 0xa9, 0x96, 0x39, 0x87, 0xe6, 0x82, 0x31, 0x04, 0x06,
-  0xcc, 0xdd, 0xe9, 0x69, 0xb3, 0x50, 0x35, 0x54, 0x17, 0x2c, 0xd8, 0xeb,
-  0x9f, 0xea, 0xd2, 0x2d, 0xcb, 0xc4, 0xa8, 0x14, 0x30, 0x69, 0xe1, 0xc0,
-  0x81, 0x33, 0xa8, 0x4e, 0x1a, 0x26, 0x39, 0x87, 0x62, 0x95, 0x2b, 0xb8,
-  0xae, 0x9c, 0xb4, 0x5f, 0xda, 0xd4, 0x4d, 0x3b, 0xe5, 0xa7, 0xd1, 0x34,
-  0xcd, 0xe8, 0xc0, 0xfe, 0xbd, 0xda, 0xf2, 0x03, 0xc8, 0x92, 0x25, 0x40,
-  0x62, 0xdc, 0xa8, 0xbc, 0xe0, 0xb2, 0x3a, 0x72, 0xdf, 0x0c, 0xbd, 0x28,
-  0xf1, 0xc3, 0x89, 0x13, 0x26, 0x4d, 0x38, 0xa5, 0x13, 0x88, 0x51, 0x9b,
-  0x26, 0x34, 0x4e, 0x7c, 0xf7, 0x1e, 0x39, 0xd2, 0x2c, 0x50, 0x00, 0x16,
-  0xc9, 0x64, 0xb1, 0x80, 0x04, 0x1b, 0xfc, 0xe6, 0x0e, 0x46, 0x19, 0x95,
-  0xc0, 0xe0, 0x21, 0x0f, 0x96, 0x13, 0x1f, 0x09, 0x25, 0x4c, 0x30, 0xc0,
-  0x4a, 0x01, 0x74, 0x88, 0xc0, 0x7e, 0x17, 0x81, 0xe3, 0x0b, 0x16, 0x12,
-  0x44, 0x10, 0x41, 0x89, 0x0f, 0x30, 0x72, 0x1a, 0x39, 0xe4, 0x44, 0xd3,
-  0x61, 0x00, 0x71, 0x5c, 0x02, 0x01, 0x07, 0x24, 0x28, 0x70, 0x00, 0x85,
-  0x25, 0x7d, 0x03, 0x4d, 0x1c, 0x1b, 0xc8, 0xf0, 0x43, 0x79, 0x33, 0xfc,
-  0x20, 0x03, 0x09, 0x70, 0xb5, 0x67, 0x9b, 0x49, 0xbe, 0xec, 0x30, 0x01,
-  0x09, 0x32, 0xe0, 0x77, 0x46, 0x13, 0x4d, 0x74, 0x51, 0xc7, 0x36, 0x26,
-  0x21, 0x83, 0x49, 0x13, 0xf6, 0x9d, 0x61, 0x21, 0x32, 0xbd, 0xbc, 0xd0,
-  0xd5, 0x02, 0x7a, 0xc4, 0xb1, 0xe0, 0x06, 0x8f, 0x98, 0xf6, 0x0d, 0x32,
-  0xae, 0xf0, 0xc1, 0xc1, 0x06, 0x0b, 0x98, 0x42, 0xce, 0x49, 0x2e, 0x18,
-  0xc0, 0xc1, 0x0c, 0x1c, 0x14, 0xc5, 0x51, 0x87, 0x56, 0xb4, 0x83, 0xce,
-  0x99, 0x70, 0x44, 0xa0, 0x81, 0x06, 0x7e, 0x6a, 0xf0, 0x80, 0x02, 0x04,
-  0x60, 0x71, 0x66, 0x2f, 0x89, 0x00, 0xb0, 0xd1, 0x03, 0x03, 0x48, 0x20,
-  0x43, 0x09, 0x06, 0x0a, 0xb0, 0x0c, 0x41, 0x26, 0xf5, 0xf2, 0x06, 0x04,
-  0x1b, 0x8c, 0x50, 0x82, 0x0c, 0x48, 0xf8, 0x30, 0xe4, 0x06, 0x66, 0xb5,
-  0x77, 0x11, 0x34, 0xa2, 0xe4, 0xc0, 0xa0, 0x0c, 0x3e, 0x70, 0x91, 0x05,
-  0x19, 0x67, 0x38, 0x81, 0x46, 0x17, 0xfe, 0x74, 0x64, 0xe3, 0x8a, 0x20,
-  0x82, 0xf8, 0xe1, 0x04, 0x94, 0x87, 0xf4, 0x82, 0x88, 0x11, 0x05, 0x30,
-  0x50, 0xc0, 0x0e, 0x6c, 0xe0, 0x01, 0x41, 0x03, 0x1b, 0xc4, 0x90, 0xce,
-  0x7b, 0xba, 0xe2, 0x11, 0x03, 0xa8, 0x30, 0x9c, 0x59, 0x89, 0x0e, 0x0b,
-  0xd2, 0x07, 0x43, 0x06, 0x76, 0x06, 0x70, 0x85, 0x36, 0xe5, 0x40, 0xe3,
-  0x8a, 0x1b, 0x10, 0x44, 0x30, 0xc2, 0x08, 0x2c, 0x54, 0x91, 0x50, 0x04,
-  0x0a, 0x04, 0x20, 0x46, 0x25, 0x6c, 0x44, 0xd1, 0xa1, 0x00, 0x0a, 0x2c,
-  0xb0, 0xc1, 0x0c, 0x30, 0xb0, 0xa9, 0x40, 0x1c, 0x03, 0xed, 0xe9, 0x0a,
-  0x1e, 0x17, 0x40, 0xc0, 0xe0, 0x0e, 0x37, 0xd0, 0x40, 0x03, 0x0a, 0x21,
-  0x80, 0x6a, 0x99, 0x64, 0x95, 0x7c, 0xc1, 0xe0, 0x06, 0x24, 0x10, 0xa1,
-  0x55, 0x10, 0x6e, 0xcc, 0xe1, 0x44, 0x1a, 0x6a, 0x68, 0x52, 0x89, 0x17,
-  0x41, 0xb0, 0xe1, 0x47, 0x13, 0x3f, 0x94, 0xf0, 0x46, 0x14, 0x02, 0x8b,
-  0xd0, 0x46, 0x10, 0x4f, 0x5c, 0x21, 0xc1, 0x04, 0x1b, 0xa0, 0x02, 0xd4,
-  0xc4, 0x39, 0xac, 0x29, 0xc1, 0x22, 0x35, 0xe1, 0xa0, 0x2f, 0x07, 0x3f,
-  0xe0, 0x70, 0xc2, 0x09, 0x29, 0xe0, 0x24, 0x40, 0x08, 0x6f, 0x8a, 0xc2,
-  0x46, 0x08, 0x7e, 0xee, 0x30, 0x44, 0x10, 0x41, 0x78, 0x41, 0xc8, 0x05,
-  0xe4, 0x12, 0x10, 0x45, 0x60, 0x2b, 0x25, 0x00, 0x81, 0x05, 0x28, 0x0c,
-  0x91, 0xc5, 0x68, 0x0b, 0xbc, 0x60, 0x1a, 0x39, 0x35, 0xd9, 0xb0, 0xa0,
-  0x04, 0x2d, 0xe0, 0xc1, 0x86, 0x53, 0x1d, 0x74, 0x10, 0x82, 0x04, 0x10,
-  0xb4, 0xf7, 0x8d, 0x2b, 0x6c, 0x7c, 0x50, 0x02, 0x93, 0x57, 0x08, 0xb2,
-  0x35, 0x0d, 0x41, 0xb4, 0x71, 0x46, 0x17, 0x69, 0xd0, 0x31, 0xca, 0x1d,
-  0x40, 0xbf, 0x01, 0xa5, 0x0f, 0x9e, 0x62, 0x28, 0x81, 0xfe, 0x22, 0x78,
-  0x68, 0x15, 0x85, 0x04, 0x19, 0x4c, 0xe0, 0x03, 0x39, 0xc8, 0xf4, 0xfd,
-  0x02, 0xa8, 0x23, 0xf8, 0x32, 0xb1, 0x07, 0x0c, 0x6c, 0x50, 0x42, 0x18,
-  0x5c, 0x9b, 0x90, 0x83, 0x4a, 0x01, 0x5c, 0x42, 0xb6, 0x10, 0x19, 0x8c,
-  0x10, 0x43, 0x1e, 0x78, 0x38, 0x45, 0x44, 0x0f, 0x23, 0x68, 0x00, 0x41,
-  0x11, 0x50, 0x98, 0x40, 0x41, 0x00, 0x08, 0x14, 0x80, 0x41, 0x10, 0x26,
-  0x98, 0xf0, 0x84, 0x0f, 0xa0, 0x2a, 0xa0, 0x8e, 0x6d, 0x41, 0x3d, 0xe1,
-  0xc0, 0x02, 0x79, 0x29, 0x82, 0x12, 0x22, 0x5e, 0xd0, 0xd0, 0x81, 0x07,
-  0x70, 0x0d, 0xb0, 0x03, 0x32, 0x82, 0x04, 0x81, 0x00, 0x91, 0x89, 0xa3,
-  0x29, 0x88, 0x53, 0x41, 0xf4, 0x01, 0xb7, 0x1a, 0xb0, 0x4c, 0xcc, 0x36,
-  0x1c, 0x4c, 0x64, 0xbc, 0xc1, 0x06, 0x1c, 0x18, 0x02, 0x8d, 0xf4, 0x4f,
-  0xe8, 0xc0, 0x01, 0x83, 0xa6, 0x4c, 0x7c, 0x03, 0x09, 0x13, 0x48, 0xd0,
-  0x47, 0x2f, 0x77, 0xd0, 0x80, 0x40, 0x04, 0x24, 0xfc, 0x30, 0x0a, 0xef,
-  0xfe, 0x46, 0xa1, 0x92, 0x00, 0x71, 0x2c, 0x9f, 0x02, 0x93, 0x5b, 0xb8,
-  0x82, 0xc8, 0x17, 0x58, 0x54, 0x2f, 0xc3, 0x16, 0x97, 0x10, 0x85, 0x17,
-  0x4c, 0x87, 0x00, 0x01, 0xec, 0xa5, 0x6f, 0x26, 0x08, 0xc2, 0xd3, 0x30,
-  0x00, 0x81, 0xd9, 0xa1, 0xa3, 0x17, 0x7d, 0x4b, 0x80, 0x02, 0x24, 0xf0,
-  0x82, 0x6f, 0xec, 0x09, 0x19, 0x4d, 0x31, 0xc1, 0x09, 0x44, 0x50, 0x94,
-  0x1d, 0xb8, 0xc2, 0x0b, 0x6f, 0x81, 0x00, 0x04, 0xc6, 0x80, 0x11, 0x9a,
-  0x14, 0x8f, 0x06, 0x60, 0x80, 0x58, 0x1a, 0x68, 0x41, 0x3c, 0xe6, 0x59,
-  0x01, 0x08, 0x32, 0x00, 0xd5, 0x1e, 0x30, 0x02, 0x41, 0x7f, 0x49, 0x01,
-  0x54, 0x13, 0xc8, 0x42, 0xf1, 0x0e, 0x27, 0x81, 0x11, 0x28, 0x43, 0x7a,
-  0xfe, 0x15, 0x90, 0x40, 0xfb, 0xb4, 0x41, 0x3c, 0xad, 0x40, 0x61, 0x7e,
-  0x55, 0x60, 0x43, 0x10, 0x58, 0x10, 0x03, 0x19, 0x2c, 0x42, 0x14, 0x79,
-  0x50, 0xc2, 0x7d, 0x96, 0xc0, 0x07, 0x68, 0x64, 0x43, 0x80, 0x1a, 0x2c,
-  0xe0, 0x02, 0xf6, 0x20, 0x40, 0x7f, 0x61, 0x01, 0x06, 0x60, 0x63, 0x87,
-  0x3b, 0xc6, 0xd6, 0x3b, 0x05, 0xe8, 0x8b, 0x07, 0xb3, 0x7b, 0x0f, 0xd9,
-  0x68, 0x70, 0x82, 0x10, 0x84, 0xad, 0x05, 0x42, 0x41, 0xc1, 0x02, 0x18,
-  0x20, 0x81, 0x32, 0x3d, 0xa8, 0x76, 0x34, 0x88, 0x42, 0x17, 0xd6, 0xa0,
-  0x06, 0x5a, 0x8c, 0x0d, 0x0f, 0xbe, 0xb3, 0xc1, 0xa3, 0x24, 0xa4, 0x8c,
-  0x8b, 0xe0, 0xf1, 0x09, 0x2f, 0x20, 0x01, 0x09, 0x38, 0x10, 0x85, 0x1a,
-  0x70, 0x80, 0x03, 0x25, 0xe8, 0x43, 0xed, 0x4c, 0x80, 0x03, 0x21, 0xce,
-  0x20, 0x18, 0x57, 0x74, 0x0a, 0x0e, 0x0a, 0x50, 0x00, 0x01, 0x80, 0x81,
-  0x62, 0x22, 0x68, 0x52, 0x19, 0xe4, 0x70, 0x2b, 0x27, 0x94, 0xe1, 0x12,
-  0xd9, 0xb0, 0x50, 0x17, 0x6b, 0xa0, 0x12, 0x08, 0x1c, 0xc2, 0x17, 0x80,
-  0xa4, 0x01, 0x16, 0x48, 0x90, 0x81, 0x06, 0x8e, 0x51, 0x14, 0x4e, 0x79,
-  0x00, 0xe0, 0x46, 0xb0, 0x9f, 0x07, 0x15, 0x91, 0x06, 0x1b, 0xa8, 0xa5,
-  0x0b, 0xb2, 0x72, 0x82, 0xca, 0x48, 0x00, 0x09, 0x53, 0x5b, 0x23, 0x15,
-  0xba, 0xc0, 0x4c, 0x66, 0x48, 0x86, 0x98, 0x48, 0x80, 0xe1, 0x06, 0x1a,
-  0xd0, 0x83, 0x63, 0x51, 0x2d, 0x96, 0x37, 0xc4, 0xde, 0x0a, 0x54, 0x80,
-  0xbd, 0x0d, 0x48, 0x03, 0x8f, 0x43, 0x10, 0xe2, 0x0f, 0xcc, 0x10, 0xbd,
-  0x27, 0xdc, 0x20, 0x03, 0x0a, 0x28, 0xc0, 0x02, 0x06, 0xe1, 0x94, 0x22,
-  0xd4, 0x87, 0x0b, 0x50, 0x72, 0xc2, 0x2b, 0xc9, 0x71, 0x1a, 0x32, 0xd2,
-  0xc0, 0x06, 0xe9, 0xfe, 0x5c, 0xc0, 0x22, 0x7e, 0x39, 0x4b, 0xb8, 0xcc,
-  0xee, 0x1b, 0x42, 0xa1, 0x41, 0x0a, 0x32, 0x40, 0xd0, 0x49, 0xb1, 0x43,
-  0x32, 0x82, 0x10, 0x68, 0x06, 0xd8, 0xb4, 0x03, 0xb2, 0xb8, 0x80, 0x41,
-  0x24, 0xd8, 0x86, 0x40, 0xec, 0xb9, 0x05, 0x66, 0xa2, 0xc1, 0x1c, 0xcf,
-  0x7c, 0x82, 0x11, 0x96, 0x10, 0xa4, 0x35, 0x4d, 0x80, 0x0c, 0x0f, 0x62,
-  0x8a, 0x53, 0x9e, 0x30, 0x82, 0x0d, 0x2c, 0x09, 0x7b, 0x13, 0x18, 0xc3,
-  0x4c, 0xd6, 0x18, 0x04, 0x2b, 0x38, 0x6e, 0x06, 0x40, 0x40, 0xc2, 0xe1,
-  0x20, 0x60, 0x00, 0x05, 0x5c, 0x22, 0x2b, 0x94, 0xc4, 0x8f, 0x7d, 0xe6,
-  0xf0, 0x8a, 0x6c, 0xd0, 0xb3, 0x9e, 0x1f, 0xa4, 0x81, 0x10, 0xbe, 0xc4,
-  0x08, 0x68, 0x9c, 0xd0, 0x08, 0x23, 0x10, 0xa1, 0x18, 0xc9, 0xd1, 0x45,
-  0x1b, 0x2c, 0x74, 0x03, 0x3d, 0x28, 0x07, 0xb2, 0xda, 0x60, 0x83, 0x92,
-  0xc2, 0x65, 0x07, 0x01, 0xc5, 0x81, 0x22, 0x65, 0x50, 0x86, 0x72, 0x98,
-  0x44, 0x28, 0x56, 0xc0, 0x92, 0x1a, 0x38, 0xb1, 0x52, 0x3c, 0x50, 0xe1,
-  0x56, 0x4b, 0x38, 0xc2, 0x16, 0x1c, 0xc7, 0x81, 0x4c, 0xb0, 0x83, 0x26,
-  0x6c, 0x60, 0x23, 0x0e, 0x48, 0x36, 0x01, 0x92, 0x6d, 0x60, 0x19, 0xed,
-  0x28, 0x47, 0x0b, 0x69, 0xf0, 0x84, 0x22, 0xf4, 0xe8, 0x51, 0xdf, 0x33,
-  0x4b, 0x29, 0x26, 0x79, 0x82, 0x24, 0x70, 0xe1, 0x0c, 0x65, 0x80, 0xc6,
-  0x37, 0xc8, 0x81, 0x8e, 0xd3, 0xa0, 0x02, 0x13, 0x4d, 0x2d, 0xca, 0x02,
-  0x1a, 0x61, 0x54, 0xad, 0xe8, 0x40, 0x60, 0xb3, 0x23, 0x5c, 0x2c, 0x5d,
-  0x60, 0x55, 0x1f, 0x98, 0xc2, 0x17, 0x89, 0x98, 0x02, 0x06, 0xbe, 0x75,
-  0xbd, 0x23, 0x04, 0x55, 0x08, 0x89, 0x64, 0x92, 0x19, 0x50, 0x71, 0x89,
-  0x37, 0x64, 0x81, 0x09, 0xae, 0x4a, 0xfe, 0xc3, 0x34, 0x08, 0x27, 0x88,
-  0x2f, 0x38, 0x81, 0x99, 0x4b, 0x10, 0x42, 0x1b, 0x62, 0x18, 0x03, 0x0e,
-  0x48, 0xe3, 0x99, 0xac, 0x3b, 0x41, 0x8f, 0x38, 0x30, 0x81, 0x12, 0x24,
-  0xc1, 0x4c, 0x64, 0x5b, 0x18, 0xc2, 0xce, 0x26, 0xb0, 0x01, 0xf0, 0x81,
-  0x8c, 0xad, 0x33, 0x02, 0x96, 0x9a, 0xa0, 0x09, 0x6d, 0x64, 0x23, 0x1a,
-  0xca, 0x80, 0x04, 0x13, 0xb8, 0x30, 0x8a, 0xde, 0x0d, 0x75, 0x00, 0x05,
-  0xa0, 0xec, 0x09, 0x75, 0x20, 0x01, 0xb0, 0x39, 0x50, 0xa4, 0x34, 0xc0,
-  0xc1, 0x08, 0x14, 0xb9, 0x5e, 0x84, 0x2d, 0x52, 0x91, 0x24, 0x88, 0x81,
-  0x16, 0x7e, 0x29, 0x05, 0x12, 0xc0, 0x94, 0x09, 0x5d, 0x40, 0x03, 0x80,
-  0xcc, 0x80, 0xa5, 0x4d, 0x90, 0x63, 0x7b, 0x51, 0xe0, 0x82, 0x7e, 0xbb,
-  0x10, 0x06, 0xb6, 0x89, 0x01, 0x08, 0x68, 0x90, 0x41, 0x0c, 0xc4, 0x31,
-  0x36, 0x36, 0x98, 0xa0, 0x03, 0x20, 0x60, 0x6e, 0x09, 0x64, 0x51, 0xaf,
-  0xed, 0xf5, 0x2e, 0x05, 0x23, 0x58, 0x81, 0x07, 0x50, 0xa0, 0x82, 0x5a,
-  0x72, 0xb2, 0x14, 0x45, 0x34, 0x81, 0x10, 0xe0, 0xc9, 0x85, 0x2e, 0xa8,
-  0x81, 0x0e, 0x5c, 0x60, 0xc2, 0x76, 0x65, 0x50, 0x08, 0xef, 0xa6, 0x53,
-  0x01, 0x45, 0x1d, 0x6f, 0x2d, 0x6d, 0x39, 0x13, 0x08, 0xfa, 0x0d, 0x06,
-  0xf0, 0x25, 0x99, 0x22, 0x79, 0x80, 0x63, 0x12, 0x6c, 0xa1, 0xc1, 0x5a,
-  0xc1, 0x41, 0x12, 0x96, 0x60, 0xd1, 0x34, 0xa0, 0x01, 0x4b, 0x9a, 0xc8,
-  0x19, 0x1b, 0xb4, 0x90, 0x86, 0x34, 0x74, 0xc1, 0x11, 0xcb, 0xe3, 0xeb,
-  0x0e, 0x0e, 0x56, 0x06, 0x74, 0x14, 0xb1, 0x03, 0x27, 0x28, 0x01, 0x07,
-  0x30, 0xe0, 0x83, 0xd9, 0x99, 0xa9, 0x26, 0x78, 0xf8, 0x42, 0x1b, 0x28,
-  0x66, 0x02, 0x1a, 0x7c, 0x61, 0x04, 0x45, 0xe1, 0xc1, 0xfe, 0x15, 0x7b,
-  0x87, 0xc2, 0x2d, 0x60, 0x09, 0x40, 0x4e, 0x48, 0x31, 0x13, 0xca, 0xa0,
-  0x08, 0xef, 0x1a, 0x08, 0x02, 0xe2, 0xd5, 0x0a, 0x0b, 0x82, 0x89, 0x81,
-  0x75, 0xf0, 0xe7, 0x8a, 0x4a, 0xbc, 0xe7, 0x0a, 0x60, 0xf0, 0x3d, 0x0c,
-  0x94, 0x60, 0x05, 0x35, 0x90, 0x81, 0xa2, 0xfd, 0x40, 0x30, 0x25, 0x02,
-  0xad, 0x08, 0x5c, 0x00, 0x44, 0x1d, 0xd2, 0xd0, 0x84, 0x3e, 0x00, 0x83,
-  0x45, 0x2d, 0x94, 0x42, 0x16, 0xd4, 0x00, 0x88, 0x68, 0xd4, 0x64, 0x28,
-  0x82, 0x50, 0xf4, 0x23, 0xc4, 0x71, 0x32, 0xd6, 0xa5, 0x40, 0xcb, 0x13,
-  0xd0, 0x04, 0x41, 0x46, 0xd5, 0x0b, 0x52, 0xf4, 0xa2, 0x17, 0xa2, 0x88,
-  0xf2, 0x13, 0xc2, 0x00, 0x95, 0x0d, 0x80, 0x83, 0x29, 0x14, 0x0b, 0xc2,
-  0x10, 0xb0, 0xe0, 0x2a, 0xb4, 0x72, 0x21, 0x13, 0xda, 0x58, 0xe3, 0x10,
-  0x8a, 0x22, 0x01, 0xf1, 0x0a, 0x21, 0x08, 0x3a, 0x58, 0x68, 0x06, 0xbc,
-  0x1c, 0xd2, 0x59, 0x79, 0x61, 0x28, 0x42, 0xc0, 0x01, 0x11, 0xa8, 0xf0,
-  0x05, 0x2f, 0xb0, 0x81, 0x10, 0xaf, 0x20, 0x47, 0x3b, 0x46, 0xe5, 0x6c,
-  0x68, 0x4f, 0x21, 0x0e, 0x7a, 0x18, 0x85, 0x4f, 0xdf, 0xb3, 0x3d, 0x3c,
-  0xdc, 0xa1, 0x12, 0xbf, 0xa0, 0x92, 0xac, 0xd4, 0x36, 0x08, 0x52, 0x44,
-  0x23, 0x8d, 0x93, 0xe4, 0xc1, 0x90, 0x48, 0x30, 0x1d, 0x4a, 0xc1, 0x67,
-  0xb1, 0x6f, 0xba, 0x17, 0xd0, 0xc0, 0x90, 0x97, 0x11, 0x6c, 0x83, 0x70,
-  0x95, 0xc0, 0x43, 0xae, 0xa1, 0x60, 0x85, 0x2c, 0xc4, 0x81, 0x11, 0xd1,
-  0xc0, 0x88, 0xb3, 0xdb, 0x10, 0x07, 0x4c, 0x28, 0x23, 0x1c, 0x41, 0x61,
-  0x83, 0x17, 0xc4, 0xb0, 0x08, 0x60, 0x7c, 0xe7, 0x27, 0x55, 0x12, 0x05,
-  0x22, 0x68, 0x85, 0x08, 0x51, 0xb8, 0x42, 0x14, 0x95, 0x10, 0x45, 0x2f,
-  0xfe, 0xb2, 0xd1, 0xd8, 0x15, 0x65, 0x03, 0x4d, 0x88, 0xd8, 0x78, 0xc7,
-  0x91, 0x31, 0x6e, 0x43, 0xc2, 0xda, 0x15, 0xc8, 0xb0, 0xe0, 0x7b, 0x64,
-  0xe5, 0x0a, 0x57, 0x44, 0xe3, 0xa7, 0x19, 0xbd, 0x81, 0x0c, 0x66, 0x50,
-  0x02, 0x48, 0xb0, 0xa3, 0x1d, 0x18, 0xc7, 0x88, 0x3a, 0x32, 0x31, 0x0d,
-  0xe0, 0xd2, 0xa0, 0x08, 0xc8, 0x13, 0x07, 0x46, 0xb4, 0x55, 0x09, 0x41,
-  0xe0, 0x01, 0x0f, 0x82, 0xb0, 0xc4, 0xc8, 0x19, 0xfb, 0x5f, 0x8d, 0x8b,
-  0x02, 0x19, 0xf4, 0xb4, 0x57, 0x25, 0x2a, 0xe1, 0x8a, 0x6f, 0x30, 0xfb,
-  0x48, 0xe4, 0xf0, 0x86, 0x31, 0x8a, 0xc1, 0x0b, 0x5e, 0xec, 0x82, 0x17,
-  0xc5, 0x28, 0xc6, 0xd8, 0x8b, 0xe1, 0x8c, 0x67, 0x5c, 0xe3, 0xed, 0x6f,
-  0x7f, 0x86, 0x31, 0x8c, 0x61, 0xf6, 0x5d, 0xa4, 0xdd, 0x19, 0xd6, 0xb8,
-  0x46, 0xde, 0xad, 0xf1, 0x8c, 0x63, 0xa8, 0x1d, 0xef, 0x7b, 0x97, 0xfb,
-  0xdc, 0xf1, 0x0e, 0x77, 0x5e, 0xd0, 0x8d, 0x07, 0x40, 0xf8, 0xc1, 0x0c,
-  0xa4, 0x41, 0x0e, 0xbd, 0x57, 0xe3, 0xf1, 0xdd, 0xb0, 0xa2, 0x29, 0x8c,
-  0x2b, 0x8d, 0x22, 0xde, 0xc0, 0x53, 0x25, 0x58, 0x02, 0x39, 0xb0, 0x41,
-  0x0c, 0x62, 0xe8, 0xa2, 0x15, 0xac, 0x08, 0x3d, 0x2b, 0x5a, 0x31, 0x8c,
-  0xce, 0x37, 0xc3, 0xf3, 0xad, 0x48, 0x7d, 0xe9, 0x4f, 0xaf, 0x8b, 0xcf,
-  0x93, 0xbe, 0x19, 0xd4, 0xb0, 0x06, 0xd0, 0x6d, 0xf3, 0xa6, 0x5e, 0xe8,
-  0xe2, 0x16, 0xb7, 0x48, 0x05, 0xee, 0x77, 0xbf, 0x7b, 0xdd, 0xf3, 0x1e,
-  0xf7, 0xb6, 0xe0, 0x7d, 0xf0, 0x6d, 0x11, 0xfc, 0xdd, 0x0f, 0xdf, 0xf8,
-  0xb7, 0x20, 0xfe, 0xf1, 0x81, 0x8f, 0x8b, 0x27, 0x0c, 0x01, 0x08, 0x30,
-  0x2d, 0x03, 0x32, 0x8c, 0x41, 0xfc, 0x54, 0xd8, 0x22, 0x15, 0xc2, 0xa8,
-  0x44, 0x21, 0x7e, 0xfe, 0x34, 0x03, 0x19, 0x64, 0x21, 0x0c, 0x3a, 0xe0,
-  0xfe, 0x0f, 0x58, 0x76, 0xfd, 0x54, 0x98, 0xff, 0xfc, 0xe8, 0x37, 0xbf,
-  0x27, 0xd0, 0xef, 0x89, 0xf6, 0xbb, 0xff, 0xfd, 0x9e, 0xe8, 0x44, 0x2e,
-  0xce, 0xf1, 0x20, 0x9a, 0x80, 0x7c, 0x12, 0x91, 0xf8, 0x84, 0xfe, 0xf3,
-  0xff, 0x89, 0xfc, 0x47, 0x42, 0x15, 0xfd, 0x07, 0x80, 0xfe, 0x07, 0x80,
-  0xfb, 0xb7, 0x0a, 0x91, 0x60, 0x80, 0xab, 0x00, 0x0a, 0x0a, 0xb8, 0x80,
-  0x0c, 0xd8, 0x80, 0xa0, 0xc0, 0x0a, 0xad, 0xd7, 0x0a, 0x81, 0xa0, 0x40,
-  0x5d, 0x00, 0x25, 0x8a, 0x50, 0x09, 0xa1, 0x00, 0x0a, 0xad, 0xa0, 0x0b,
-  0x9e, 0x07, 0x0a, 0x76, 0xc0, 0x06, 0x5c, 0x90, 0x78, 0x42, 0x12, 0x24,
-  0xe6, 0x01, 0x04, 0x5c, 0x60, 0x09, 0x94, 0x10, 0x09, 0x0a, 0x28, 0x09,
-  0xa0, 0x10, 0x09, 0x91, 0x20, 0x09, 0x2a, 0xf8, 0x82, 0x32, 0x08, 0x83,
-  0x30, 0x38, 0x83, 0x92, 0x70, 0x83, 0x1a, 0xc8, 0x0b, 0xcf, 0xc0, 0x0d,
-  0xd7, 0x30, 0x0e, 0xb6, 0xa1, 0x23, 0xae, 0x50, 0x09, 0x88, 0xb0, 0x75,
-  0x89, 0xb0, 0x75, 0x5b, 0x37, 0x84, 0x46, 0x58, 0x09, 0x45, 0x68, 0x84,
-  0x4b, 0x98, 0x84, 0x44, 0x28, 0x84, 0x50, 0x58, 0x84, 0x43, 0x38, 0x84,
-  0x52, 0x58, 0x84, 0x22, 0xd7, 0x0b, 0x13, 0x33, 0x04, 0x50, 0xd2, 0x04,
-  0x73, 0x00, 0x6b, 0x56, 0xd8, 0x0b, 0xd0, 0x80, 0x0c, 0x13, 0x13, 0x04,
-  0x42, 0x90, 0x05, 0x4d, 0x00, 0x7d, 0x4b, 0xb0, 0x85, 0x3c, 0x05, 0x72,
-  0x4e, 0xd8, 0x86, 0x6e, 0xc8, 0x86, 0x4e, 0xe8, 0x71, 0x31, 0xd7, 0x4b,
-  0xfc, 0xf1, 0x26, 0xd0, 0x10, 0x86, 0xc8, 0x90, 0x87, 0x7a, 0x88, 0x87,
-  0x7a, 0xd8, 0x87, 0x79, 0x18, 0x86, 0x80, 0x88, 0x0c, 0x81, 0x18, 0x86,
-  0xc9, 0x80, 0x87, 0x84, 0x68, 0x88, 0xbf, 0x82, 0x78, 0x87, 0xba, 0xf2,
-  0x04, 0x60, 0x50, 0x06, 0x73, 0xd0, 0x05, 0xc0, 0x90, 0x0d, 0x77, 0x78,
-  0x87, 0xda, 0xf0, 0x0d, 0x27, 0x21, 0x08, 0xb9, 0x86, 0x03, 0x47, 0x90,
-  0x86, 0x4d, 0xe0, 0x07, 0xb2, 0x60, 0x89, 0x92, 0x38, 0x89, 0xa2, 0x38,
-  0x8a, 0xa4, 0x58, 0x8a, 0x77, 0x98, 0x0d, 0x8b, 0xf5, 0x75, 0x47, 0x82,
-  0x0e, 0xac, 0xd8, 0x8a, 0xae, 0xf8, 0x8a, 0xb0, 0x18, 0x8b, 0xb2, 0x38,
-  0x8b, 0xac, 0x58, 0x75, 0xb4, 0x22, 0x0a, 0x24, 0x77, 0x1a, 0xaf, 0x78,
-  0x11, 0x34, 0xd1, 0x74, 0x12, 0x17, 0x2c, 0x95, 0x30, 0x72, 0xac, 0x78,
-  0x11, 0xb0, 0x48, 0x8c, 0xc6, 0x38, 0x8c, 0x8d, 0x95, 0x8c, 0xe9, 0x90,
-  0x8c, 0x17, 0xd1, 0x8c, 0xaa, 0xb8, 0x6a, 0x03, 0xd1, 0x0e, 0x62, 0x34,
-  0x7b, 0x11, 0xf1, 0x8c, 0x32, 0xf1, 0x5f, 0x79, 0x38, 0x6e, 0x9a, 0x31,
-  0x73, 0x68, 0x52, 0x73, 0x82, 0xc8, 0x58, 0xd4, 0x98, 0x19, 0x69, 0x71,
-  0x11, 0x2c, 0x82, 0x0e, 0xe1, 0xb8, 0x1b, 0xb5, 0x58, 0x8e, 0x8d, 0x25,
-  0x8e, 0xec, 0xd8, 0x8e, 0xee, 0xf8, 0x8e, 0xf0, 0x18, 0x8f, 0xf2, 0x38,
-  0x8f, 0xf4, 0x58, 0x8f, 0xf6, 0x78, 0x8f, 0xf8, 0x98, 0x8f, 0xfa, 0xb8,
-  0x8f, 0xfc, 0xd8, 0x8f, 0xfe, 0xf8, 0x8f, 0x00, 0x19, 0x90, 0x02, 0x39,
-  0x90, 0x04, 0xb9, 0x8f, 0x01, 0x01, 0x00, 0x3b
+  0x47, 0x49, 0x46, 0x38, 0x39, 0x61, 0x6e, 0x00, 0x35, 0x00, 0xe7, 0x00,
+  0x00, 0xff, 0xff, 0xe2, 0x9f, 0x20, 0x20, 0xb6, 0x25, 0x25, 0xff, 0xff,
+  0xe0, 0xff, 0xff, 0xdc, 0xdf, 0xdf, 0xc6, 0xff, 0xcc, 0xcc, 0xdf, 0xb2,
+  0xb2, 0xfe, 0xfc, 0xd3, 0xbf, 0xbf, 0xa9, 0xff, 0xff, 0xe3, 0xf8, 0xe6,
+  0x93, 0xff, 0xff, 0xdb, 0xdf, 0xdf, 0xc0, 0xf5, 0xdc, 0x76, 0xdf, 0xdf,
+  0xc4, 0xf8, 0xe6, 0x92, 0xde, 0xdc, 0xb9, 0xee, 0xc3, 0x2c, 0xfc, 0xf4,
+  0xbd, 0xfc, 0xf4, 0xbc, 0xfd, 0xf8, 0xc9, 0xdf, 0xdf, 0xc5, 0xf3, 0xd6,
+  0x64, 0xfb, 0xf0, 0xaf, 0xd5, 0xbb, 0x57, 0xf9, 0xeb, 0xa1, 0xf6, 0xe2,
+  0x86, 0xd9, 0xc9, 0x81, 0xf7, 0xe1, 0x86, 0xbf, 0xbf, 0xa4, 0xff, 0xff,
+  0xdf, 0xf4, 0xd6, 0x64, 0x3d, 0x36, 0x19, 0xfd, 0xf8, 0xc8, 0xfa, 0xef,
+  0xaf, 0x20, 0x1f, 0x18, 0xf9, 0xeb, 0xa0, 0xfd, 0xf9, 0xc9, 0xdd, 0xd9,
+  0xb0, 0xfc, 0xf5, 0xbc, 0xb2, 0x92, 0x21, 0xdc, 0xd5, 0xa4, 0xdf, 0xdf,
+  0xc7, 0x3f, 0x3c, 0x2c, 0x1f, 0x1c, 0x0f, 0xb8, 0xa5, 0x58, 0xf7, 0xe2,
+  0x85, 0xf5, 0xdc, 0x75, 0x20, 0x1f, 0x19, 0xff, 0xfe, 0xdb, 0xbf, 0xbf,
+  0xaa, 0xf7, 0xe1, 0x85, 0xf9, 0xea, 0xa1, 0xd0, 0xab, 0x26, 0xf2, 0xd0,
+  0x52, 0xff, 0xfc, 0xd3, 0xda, 0xce, 0x8d, 0x40, 0x3f, 0x35, 0xdc, 0xd5,
+  0xa5, 0xf7, 0xe2, 0x86, 0xfa, 0xf0, 0xaf, 0x3e, 0x3b, 0x28, 0x40, 0x40,
+  0x39, 0x40, 0x40, 0x37, 0xdb, 0xd2, 0x99, 0xbb, 0xb0, 0x78, 0xfb, 0xef,
+  0xaf, 0xd6, 0xc0, 0x67, 0xfa, 0xeb, 0xa1, 0xdd, 0xda, 0xb0, 0xf6, 0xe1,
+  0x86, 0x04, 0x04, 0x03, 0xfe, 0xfc, 0xd4, 0x5c, 0x51, 0x26, 0xba, 0xac,
+  0x6e, 0xdf, 0xdf, 0xc3, 0xef, 0xc6, 0x34, 0xf0, 0xca, 0x42, 0xb9, 0xa9,
+  0x64, 0xff, 0xfe, 0xdc, 0x1e, 0x1b, 0x0d, 0x1f, 0x1c, 0x11, 0x1f, 0x1d,
+  0x14, 0xf5, 0xdd, 0x76, 0x5b, 0x51, 0x26, 0xdd, 0xda, 0xaf, 0xf9, 0xea,
+  0xa0, 0x3f, 0x3d, 0x2f, 0xb5, 0x9c, 0x3d, 0xd6, 0xc1, 0x67, 0xdc, 0xd2,
+  0x99, 0xfa, 0xeb, 0xa0, 0xd5, 0xbc, 0x57, 0xd9, 0xc9, 0x80, 0x3f, 0x3e,
+  0x32, 0x3e, 0x3a, 0x25, 0xfe, 0xf8, 0xc8, 0xda, 0xce, 0x8c, 0x20, 0x20,
+  0x1c, 0xf7, 0xe6, 0x93, 0xd7, 0xc6, 0x75, 0x3d, 0x37, 0x1e, 0xfb, 0xef,
+  0xae, 0xfd, 0xf9, 0xc8, 0xbe, 0xbd, 0x9e, 0xbb, 0xb4, 0x83, 0xd7, 0xc5,
+  0x75, 0x1f, 0x1d, 0x12, 0xdc, 0xd1, 0x98, 0x20, 0x20, 0x1b, 0x1f, 0x1e,
+  0x16, 0x1f, 0x1b, 0x0d, 0xbf, 0xbf, 0xa5, 0x40, 0x40, 0x38, 0xdf, 0xdc,
+  0xb9, 0xfc, 0xf5, 0xbd, 0xf4, 0xd6, 0x65, 0xfa, 0xea, 0xa1, 0xd8, 0xc9,
+  0x81, 0xf0, 0xcb, 0x42, 0xdf, 0xde, 0xc0, 0x1e, 0x18, 0x06, 0xf6, 0xdc,
+  0x75, 0xbf, 0xbf, 0xa8, 0xd8, 0xc6, 0x75, 0xd6, 0xc0, 0x66, 0xf7, 0xe6,
+  0x92, 0xf1, 0xca, 0x42, 0xd2, 0xb2, 0x3a, 0xbe, 0xbe, 0x9e, 0x43, 0x40,
+  0x2f, 0xd7, 0xc6, 0x74, 0xb8, 0xa6, 0x58, 0xbc, 0xb4, 0x83, 0xda, 0xcd,
+  0x8d, 0xf4, 0xd7, 0x64, 0xbb, 0xb0, 0x79, 0xfe, 0xf9, 0xc9, 0x5e, 0x5a,
+  0x42, 0xfa, 0xea, 0xa0, 0x60, 0x60, 0x55, 0x71, 0x17, 0x17, 0xbc, 0xb4,
+  0x82, 0x88, 0x1c, 0x1c, 0xba, 0xac, 0x6d, 0xbd, 0xb7, 0x8e, 0xef, 0xc5,
+  0x34, 0xd8, 0xc5, 0x75, 0xff, 0xff, 0xdd, 0xfb, 0xf0, 0xae, 0x44, 0x44,
+  0x3a, 0xff, 0xff, 0xe1, 0xde, 0xdf, 0xc0, 0x10, 0x10, 0x0d, 0xf3, 0xd7,
+  0x64, 0xd1, 0xad, 0x2d, 0xbd, 0xb8, 0x8d, 0xdf, 0xdf, 0xc2, 0xbf, 0x99,
+  0x99, 0x3e, 0x39, 0x22, 0x5f, 0x5c, 0x47, 0xef, 0xc6, 0x35, 0xf6, 0xdc,
+  0x76, 0xff, 0xff, 0xde, 0x61, 0x61, 0x54, 0x60, 0x60, 0x54, 0xfb, 0xf4,
+  0xbc, 0x3e, 0x38, 0x22, 0x3f, 0x3b, 0x28, 0x20, 0x20, 0x1a, 0xdc, 0xd6,
+  0xa4, 0x5f, 0x5e, 0x4c, 0xbb, 0xb3, 0x82, 0x5e, 0x58, 0x3c, 0x10, 0x0f,
+  0x0b, 0xde, 0xd9, 0xb0, 0xe3, 0xd9, 0x9f, 0xd2, 0xb1, 0x3a, 0xbb, 0xb4,
+  0x82, 0xcd, 0xc6, 0x99, 0xa0, 0x90, 0x4d, 0xe5, 0xe2, 0xb6, 0xb8, 0xa9,
+  0x64, 0xdf, 0xdf, 0xc1, 0xda, 0xcd, 0x8c, 0xfa, 0xf0, 0xae, 0x08, 0x07,
+  0x05, 0xfe, 0xf8, 0xc9, 0xfa, 0xef, 0xae, 0xbf, 0xbe, 0xa5, 0x62, 0x5c,
+  0x3f, 0xf1, 0xd0, 0x52, 0x5e, 0x58, 0x3d, 0xbe, 0xba, 0x97, 0x8f, 0x8f,
+  0x7f, 0x60, 0x5f, 0x50, 0x28, 0x26, 0x1d, 0xb9, 0xac, 0x6e, 0x71, 0x63,
+  0x2e, 0xdb, 0xcd, 0x8d, 0xd8, 0xc5, 0x74, 0xfe, 0xfd, 0xd4, 0x98, 0x8f,
+  0x63, 0x60, 0x5e, 0x4c, 0xc2, 0xb7, 0x7e, 0xf6, 0xe1, 0x85, 0xf6, 0xe2,
+  0x85, 0x0f, 0x0d, 0x06, 0x42, 0x3e, 0x2b, 0xbe, 0xbb, 0x97, 0xdc, 0xd1,
+  0x99, 0x3d, 0x34, 0x15, 0xbd, 0xb7, 0x8d, 0x98, 0x86, 0x3e, 0x99, 0x89,
+  0x4a, 0xee, 0xc5, 0x34, 0x27, 0x25, 0x19, 0xe1, 0xd0, 0x84, 0x60, 0x60,
+  0x52, 0x3e, 0x39, 0x21, 0x3e, 0x38, 0x21, 0x60, 0x5f, 0x4f, 0x44, 0x44,
+  0x3b, 0xee, 0xc6, 0x35, 0x1e, 0x1a, 0x0a, 0xf6, 0xdd, 0x76, 0xdb, 0xd2,
+  0x98, 0xb5, 0x9c, 0x3e, 0xdc, 0xd2, 0x98, 0x85, 0x6d, 0x19, 0x18, 0x17,
+  0x10, 0xd0, 0xad, 0x2e, 0x93, 0x7c, 0x28, 0xee, 0xc6, 0x34, 0x3c, 0x34,
+  0x15, 0xdd, 0xd9, 0xaf, 0xe3, 0xe3, 0xc7, 0x1f, 0x1f, 0x18, 0xbf, 0xbe,
+  0xa4, 0xbf, 0xbd, 0x9e, 0x44, 0x43, 0x38, 0x30, 0x30, 0x29, 0xef, 0xc5,
+  0x35, 0x48, 0x47, 0x3c, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0x21, 0xf9, 0x04, 0x01, 0x00, 0x00, 0xff, 0x00, 0x2c, 0x00, 0x00,
+  0x00, 0x00, 0x6e, 0x00, 0x35, 0x00, 0x00, 0x08, 0xfe, 0x00, 0xff, 0x09,
+  0x1c, 0x48, 0xb0, 0xa0, 0xc1, 0x83, 0x08, 0x13, 0x2a, 0x5c, 0xc8, 0xb0,
+  0xa1, 0xc3, 0x87, 0x10, 0x23, 0x4a, 0x9c, 0x48, 0xb1, 0xa2, 0xc5, 0x8b,
+  0x18, 0x33, 0x56, 0xac, 0xc7, 0xb1, 0x63, 0x3d, 0x8d, 0x20, 0x43, 0x5a,
+  0xac, 0x17, 0xa7, 0x81, 0xc9, 0x38, 0x1f, 0x45, 0xaa, 0x5c, 0xc9, 0xb0,
+  0x5e, 0x03, 0x02, 0x30, 0x1b, 0xa4, 0x64, 0x49, 0xb3, 0xa6, 0x40, 0x97,
+  0x30, 0x09, 0xc8, 0xb4, 0xc9, 0x93, 0x25, 0xce, 0x98, 0x33, 0x7b, 0x0a,
+  0xcd, 0xf8, 0x53, 0x67, 0xd0, 0xa1, 0x48, 0x29, 0x16, 0xdd, 0x99, 0xb4,
+  0xe9, 0xc4, 0xa5, 0x47, 0x9d, 0x4a, 0x5d, 0x08, 0x75, 0xaa, 0xd5, 0x96,
+  0x0d, 0x2a, 0xc1, 0xc4, 0x15, 0xf5, 0xaa, 0xd7, 0x9b, 0x9e, 0x3e, 0x7c,
+  0x20, 0xe5, 0xa9, 0xeb, 0xd7, 0xa4, 0x1e, 0x3b, 0x3e, 0x18, 0xc0, 0xf6,
+  0x41, 0xca, 0xb4, 0x1e, 0x07, 0xc6, 0xbd, 0xd9, 0xf1, 0xdf, 0x5c, 0x82,
+  0x77, 0xe1, 0xde, 0xb5, 0xab, 0x97, 0xae, 0x5e, 0x8e, 0x11, 0x39, 0x26,
+  0x28, 0x60, 0xa1, 0x00, 0xe1, 0x02, 0x98, 0x00, 0x28, 0x2e, 0xf0, 0xb1,
+  0xde, 0xe0, 0xc2, 0x86, 0x0b, 0xac, 0x98, 0xd1, 0x38, 0x81, 0x05, 0x0b,
+  0x09, 0x2a, 0x17, 0x48, 0xd0, 0xa8, 0x5e, 0xa3, 0xc1, 0x99, 0xf1, 0x5a,
+  0xde, 0xdc, 0x71, 0xb0, 0xe1, 0xc2, 0x90, 0x43, 0x0b, 0x3e, 0x7d, 0x3a,
+  0xb3, 0xe3, 0xcb, 0x90, 0x51, 0x93, 0x7e, 0xe8, 0xb8, 0x80, 0x02, 0xc5,
+  0xb8, 0x6f, 0x2b, 0x56, 0xb0, 0xa2, 0xde, 0x8f, 0x04, 0xb7, 0x83, 0xe3,
+  0x9e, 0xfc, 0x63, 0x06, 0x80, 0xdb, 0x05, 0x7e, 0x8c, 0xf9, 0x51, 0xe0,
+  0x78, 0xef, 0xc1, 0x00, 0x18, 0xcb, 0x35, 0xae, 0x80, 0xf7, 0xef, 0x15,
+  0xbb, 0x75, 0x57, 0xe7, 0xcd, 0x71, 0x46, 0xf3, 0xe3, 0xda, 0x15, 0xfe,
+  0x50, 0xc6, 0xae, 0x3b, 0x7b, 0xf5, 0xd0, 0x0d, 0xeb, 0x7d, 0xc7, 0xbd,
+  0x9b, 0x3d, 0xe3, 0x04, 0xec, 0xe3, 0x2b, 0xce, 0xcc, 0x9e, 0xf3, 0x7a,
+  0xc6, 0xd8, 0xe7, 0x37, 0x1e, 0x96, 0x1f, 0xc0, 0x0c, 0xe6, 0xf2, 0xd5,
+  0xe7, 0x58, 0x79, 0x86, 0xb9, 0xa7, 0x5e, 0x80, 0x02, 0xb6, 0xc4, 0x07,
+  0x5b, 0x03, 0x7c, 0x30, 0xc0, 0x03, 0x10, 0x36, 0xc8, 0xd6, 0x07, 0x6e,
+  0x31, 0xc1, 0xe0, 0x00, 0x4c, 0x44, 0x28, 0x21, 0x13, 0xf5, 0x2c, 0xc8,
+  0xe0, 0x5a, 0x6c, 0x31, 0x61, 0x4a, 0x3d, 0x33, 0x30, 0xc8, 0xa1, 0x5d,
+  0x6b, 0x89, 0xf5, 0x80, 0x1c, 0x72, 0x80, 0xf8, 0x60, 0x3b, 0x29, 0x3e,
+  0xc8, 0x91, 0x8b, 0x7c, 0xd4, 0x63, 0x0a, 0x88, 0x14, 0xd6, 0xe3, 0x62,
+  0x88, 0x0c, 0x3a, 0xe8, 0x56, 0x4b, 0x79, 0x10, 0xc0, 0x80, 0x0c, 0x0c,
+  0x78, 0x00, 0x84, 0x1b, 0x97, 0x78, 0xc0, 0xc0, 0x92, 0x0c, 0xc8, 0x04,
+  0x13, 0x14, 0x45, 0x1e, 0x09, 0x84, 0x92, 0x50, 0xc8, 0x40, 0x80, 0x91,
+  0x0d, 0x10, 0xc9, 0x24, 0x01, 0x32, 0x78, 0x30, 0x46, 0x3d, 0x72, 0xbc,
+  0xb4, 0xe4, 0x3b, 0xf5, 0x78, 0x20, 0x83, 0x95, 0x04, 0xf8, 0x02, 0x44,
+  0x1c, 0x0c, 0x10, 0x00, 0x85, 0x07, 0x97, 0xc8, 0xf3, 0x4d, 0x26, 0x42,
+  0xca, 0x64, 0x26, 0x50, 0x65, 0x42, 0x21, 0x24, 0x03, 0x79, 0xd4, 0x93,
+  0xc9, 0x92, 0x50, 0x7a, 0xb0, 0x4d, 0x03, 0x4c, 0x36, 0x69, 0x96, 0x5c,
+  0x69, 0x20, 0xa0, 0x28, 0x02, 0x11, 0xe8, 0x50, 0x0f, 0x12, 0x9a, 0xc4,
+  0x13, 0x01, 0x0e, 0x8a, 0x46, 0x50, 0x0f, 0x02, 0x49, 0x30, 0xea, 0x28,
+  0x47, 0x3a, 0x44, 0xb0, 0xe8, 0x1c, 0xf5, 0x08, 0xa2, 0x28, 0xa5, 0x8a,
+  0xa6, 0xb1, 0x69, 0x3d, 0x69, 0x64, 0xca, 0xa8, 0x37, 0x93, 0x2a, 0xa3,
+  0xa9, 0x2a, 0xfe, 0x9e, 0x32, 0x4a, 0xcf, 0xa3, 0x6e, 0x48, 0x82, 0x03,
+  0x0e, 0x96, 0x7a, 0x4a, 0x69, 0x04, 0xc4, 0x88, 0x8a, 0x29, 0xa3, 0xf0,
+  0xd4, 0x13, 0x41, 0x12, 0x99, 0xce, 0xa1, 0x83, 0x2a, 0x73, 0x20, 0x40,
+  0xaa, 0xa5, 0x54, 0x59, 0x51, 0x81, 0x08, 0x15, 0x98, 0x70, 0x42, 0x0c,
+  0x1c, 0x21, 0x11, 0xc3, 0x09, 0xd1, 0x8a, 0x70, 0x42, 0x3d, 0xd0, 0x86,
+  0x31, 0x6d, 0x47, 0x31, 0x58, 0xc1, 0x8b, 0x08, 0x22, 0xb0, 0x53, 0xcf,
+  0x17, 0x27, 0x40, 0xab, 0x48, 0x05, 0xb0, 0x30, 0xe3, 0x11, 0xba, 0xd9,
+  0x1a, 0x01, 0xad, 0x09, 0x68, 0x48, 0xc3, 0x91, 0xbc, 0x15, 0xd8, 0xc2,
+  0x8a, 0x26, 0xf5, 0xc4, 0x20, 0x09, 0xb4, 0x96, 0x1a, 0x41, 0x6f, 0x05,
+  0x15, 0x60, 0x6b, 0x82, 0x09, 0x61, 0x08, 0xf3, 0x05, 0x47, 0x06, 0xa3,
+  0x61, 0x45, 0x0c, 0xd7, 0x22, 0x0c, 0xad, 0x11, 0x87, 0xde, 0x64, 0x05,
+  0x0a, 0x28, 0x4c, 0x30, 0x81, 0x0a, 0x24, 0x74, 0xe4, 0xce, 0x0e, 0x13,
+  0x50, 0x40, 0xc1, 0x0e, 0xf5, 0x50, 0xa0, 0xf1, 0x0e, 0x24, 0x20, 0xf1,
+  0x28, 0x09, 0x2a, 0x88, 0x4c, 0xc1, 0x2a, 0xf5, 0x60, 0xb1, 0x83, 0xc9,
+  0x28, 0xd0, 0x41, 0x81, 0x24, 0x1d, 0x73, 0x44, 0x82, 0x24, 0xa7, 0x4c,
+  0x90, 0x31, 0xcd, 0xab, 0x60, 0xc1, 0x51, 0x27, 0x3e, 0x53, 0x40, 0x4b,
+  0x28, 0xc5, 0xc8, 0x6c, 0x32, 0xc5, 0x2a, 0x64, 0x5c, 0xb3, 0xc9, 0x23,
+  0x57, 0x13, 0x4a, 0xce, 0x2a, 0x84, 0x4c, 0x01, 0xc7, 0x2c, 0x53, 0x40,
+  0x87, 0xc6, 0x2a, 0x54, 0x6c, 0x57, 0x27, 0x18, 0x60, 0xd0, 0x43, 0x0f,
+  0x41, 0xb0, 0xd0, 0x11, 0x0b, 0x5b, 0x0c, 0xd1, 0x03, 0x06, 0x41, 0xd4,
+  0x83, 0xc1, 0x08, 0x23, 0x6c, 0x31, 0xc8, 0x39, 0xbb, 0xbc, 0x32, 0xc8,
+  0x16, 0x23, 0x0c, 0x81, 0xc1, 0xfe, 0x2c, 0x2c, 0xb4, 0x02, 0xb7, 0xde,
+  0x67, 0xb0, 0x6d, 0xf6, 0xd9, 0xe5, 0x58, 0x82, 0x81, 0x25, 0x79, 0x63,
+  0x60, 0xc8, 0xd9, 0x6a, 0x88, 0x3d, 0x42, 0x2c, 0x41, 0xb4, 0x01, 0x78,
+  0xd7, 0x8f, 0x84, 0xad, 0x37, 0xdb, 0x86, 0x2c, 0xb2, 0x88, 0x1a, 0x6a,
+  0x98, 0x3d, 0x4d, 0x2f, 0x23, 0xf4, 0x30, 0xce, 0x1b, 0x6f, 0xb4, 0xa1,
+  0x4b, 0x0f, 0x67, 0x9c, 0xb1, 0x85, 0xd7, 0x76, 0x89, 0xc1, 0x48, 0x09,
+  0x25, 0xd4, 0x20, 0x44, 0x2a, 0x53, 0xf8, 0x20, 0x84, 0x06, 0x57, 0x94,
+  0x70, 0x45, 0x0e, 0xf5, 0x20, 0x53, 0x43, 0x0d, 0x1a, 0x34, 0xf3, 0x4b,
+  0x36, 0xd1, 0x08, 0x51, 0x02, 0x17, 0x76, 0x20, 0x93, 0xca, 0xed, 0x45,
+  0x70, 0x51, 0x82, 0x1d, 0x76, 0xe0, 0x2e, 0x84, 0x0f, 0x1d, 0x4d, 0x91,
+  0x08, 0xf0, 0x5c, 0xd4, 0xb0, 0x7b, 0x5a, 0x3e, 0xe4, 0x50, 0x82, 0x06,
+  0x25, 0x14, 0x21, 0xbe, 0x06, 0x1a, 0xac, 0xde, 0xbd, 0x06, 0x45, 0xd4,
+  0x70, 0x88, 0x2b, 0xc1, 0x24, 0x92, 0x0b, 0xfa, 0x42, 0xd4, 0x93, 0xc3,
+  0xeb, 0x1a, 0x1c, 0x32, 0xc5, 0x14, 0x62, 0x1c, 0x0f, 0x3c, 0xef, 0x2d,
+  0x45, 0x02, 0xc1, 0x02, 0x0b, 0x20, 0xc3, 0x02, 0x38, 0xc0, 0x01, 0x2f,
+  0x08, 0x10, 0x02, 0xff, 0xbb, 0x43, 0x3d, 0x96, 0x00, 0xc0, 0x05, 0xfc,
+  0x41, 0x1b, 0x5e, 0xf0, 0x02, 0x02, 0xff, 0xb7, 0x04, 0x30, 0x20, 0xf0,
+  0x0f, 0x03, 0xe4, 0x00, 0x00, 0x31, 0x58, 0xc1, 0x8e, 0x80, 0xc1, 0x0b,
+  0x0b, 0xf8, 0x1f, 0x04, 0x96, 0x00, 0x97, 0x48, 0xdc, 0x21, 0x84, 0x22,
+  0x04, 0x20, 0xef, 0xd8, 0xc0, 0x40, 0x11, 0xde, 0x41, 0x83, 0x64, 0x40,
+  0x20, 0x07, 0xea, 0xa1, 0xc1, 0xff, 0x71, 0x80, 0x0d, 0x6c, 0xd0, 0x60,
+  0x03, 0x67, 0x98, 0x9e, 0x27, 0x6c, 0x80, 0x07, 0xfe, 0x1b, 0x78, 0x01,
+  0x0f, 0x3a, 0xc0, 0x03, 0x67, 0x74, 0xe0, 0x87, 0x34, 0x48, 0x46, 0x3d,
+  0xaa, 0x70, 0x84, 0x23, 0xd2, 0xa0, 0x03, 0x47, 0x38, 0x82, 0x03, 0xa6,
+  0xe8, 0x87, 0x2a, 0xf4, 0xe1, 0x89, 0x2f, 0x58, 0x03, 0x37, 0xba, 0x51,
+  0x86, 0x17, 0xbc, 0xe0, 0x08, 0x1b, 0x78, 0x42, 0x3d, 0xa4, 0x30, 0xc6,
+  0x35, 0x08, 0x91, 0x07, 0x6b, 0xf8, 0x0b, 0x2a, 0x9e, 0xd0, 0x07, 0x4a,
+  0x3c, 0x31, 0x88, 0x33, 0xe4, 0xc8, 0x13, 0x9c, 0xd8, 0x01, 0x1a, 0xfc,
+  0x30, 0x88, 0x65, 0xa8, 0x47, 0x1f, 0x8e, 0xf8, 0x0c, 0x42, 0x48, 0x41,
+  0x0a, 0x84, 0x78, 0xc1, 0x06, 0x3a, 0xf0, 0x82, 0x3c, 0x3a, 0xa4, 0x1e,
+  0x85, 0x70, 0x00, 0x0c, 0xa6, 0x28, 0x0e, 0x07, 0x8c, 0x62, 0x8a, 0x0e,
+  0x20, 0x82, 0x0b, 0xea, 0x61, 0x06, 0x17, 0x68, 0x41, 0x91, 0x90, 0x9c,
+  0xa2, 0x16, 0xaa, 0x00, 0x0d, 0x22, 0x60, 0xd2, 0x05, 0x2d, 0x68, 0x81,
+  0x0b, 0xa6, 0x08, 0x03, 0x2d, 0xa4, 0xa3, 0x1e, 0x2d, 0x40, 0xa5, 0x27,
+  0x61, 0x40, 0x85, 0x49, 0xfe, 0x85, 0x23, 0x95, 0x74, 0x00, 0x15, 0x1c,
+  0xe0, 0x07, 0x8f, 0x14, 0xc2, 0x0f, 0x7b, 0xa0, 0xc2, 0x23, 0x1d, 0xb0,
+  0x07, 0x49, 0xd6, 0x83, 0x08, 0x7b, 0x50, 0xa4, 0x16, 0x42, 0x79, 0x49,
+  0x2a, 0x2c, 0x92, 0x08, 0xac, 0xbb, 0x89, 0x12, 0x52, 0x90, 0x01, 0x10,
+  0x5c, 0x00, 0x11, 0xce, 0x04, 0x41, 0x06, 0x52, 0xa0, 0x84, 0x10, 0xc0,
+  0x21, 0x0a, 0x21, 0xa8, 0x42, 0x17, 0x2e, 0xc0, 0xcd, 0x0b, 0x6c, 0x22,
+  0x03, 0x55, 0x88, 0x02, 0x1c, 0x94, 0xd0, 0x05, 0x69, 0x2a, 0x21, 0x0a,
+  0x51, 0xd0, 0xa6, 0x34, 0xd3, 0x11, 0x82, 0x7a, 0xc0, 0xa1, 0x1e, 0x21,
+  0xc8, 0x40, 0x1d, 0x10, 0x91, 0x01, 0xbd, 0x84, 0xc0, 0x1a, 0xed, 0xfe,
+  0xe4, 0x88, 0x12, 0x32, 0xc0, 0x4d, 0x22, 0x1c, 0xa3, 0x23, 0xd9, 0xec,
+  0x42, 0x1d, 0xb8, 0x29, 0xcd, 0x8e, 0xf0, 0xd3, 0x9b, 0x19, 0x08, 0x41,
+  0x3c, 0x2f, 0x50, 0x07, 0x67, 0xd6, 0xb3, 0x25, 0xf5, 0xf8, 0x84, 0x01,
+  0x26, 0x4a, 0xd1, 0x8a, 0x1a, 0xe0, 0x00, 0x18, 0xcd, 0xa8, 0x45, 0x33,
+  0xca, 0x51, 0x8a, 0x76, 0x74, 0xa2, 0x18, 0xfd, 0x44, 0x3d, 0xb2, 0x00,
+  0x8c, 0x1b, 0xdc, 0x80, 0x1c, 0xf5, 0xc0, 0xe8, 0x45, 0x0f, 0x30, 0xd2,
+  0x1b, 0x64, 0x61, 0x1d, 0xe1, 0xa0, 0x46, 0x16, 0x4c, 0x7a, 0x83, 0x7a,
+  0x72, 0xf4, 0x00, 0x16, 0x5d, 0x29, 0x4e, 0x2b, 0xaa, 0x52, 0x9e, 0x7a,
+  0xad, 0x1e, 0x8e, 0x08, 0x80, 0x00, 0x86, 0x4a, 0xd4, 0xa2, 0x1a, 0xf5,
+  0xa8, 0x48, 0x4d, 0xea, 0x51, 0x03, 0x50, 0x8f, 0x40, 0xe0, 0x01, 0x0f,
+  0x4e, 0xa8, 0x87, 0x51, 0x99, 0xea, 0x04, 0x40, 0x38, 0x21, 0x10, 0xb2,
+  0x08, 0x84, 0x13, 0xa0, 0x0a, 0x88, 0x7a, 0x2a, 0xf5, 0xab, 0x4b, 0x85,
+  0x04, 0x60, 0x12, 0xc2, 0x11, 0x48, 0x04, 0xe0, 0xac, 0x68, 0x4d, 0xab,
+  0x5a, 0xd7, 0xca, 0xd6, 0xb6, 0xae, 0xb5, 0x1e, 0x9c, 0x10, 0x05, 0x36,
+  0x26, 0x81, 0x8e, 0x7a, 0xbc, 0xb5, 0x09, 0xa2, 0x98, 0x47, 0x13, 0xf6,
+  0x0a, 0x0e, 0x75, 0x4c, 0xa2, 0x09, 0x9c, 0xb0, 0xab, 0x5b, 0x07, 0xcb,
+  0x56, 0x47, 0xfc, 0xf4, 0x95, 0x88, 0x4d, 0xac, 0x62, 0x39, 0x62, 0x03,
+  0x09, 0x38, 0xd6, 0x1c, 0x7f, 0x49, 0x81, 0x63, 0x27, 0x3b, 0xd9, 0x14,
+  0x2c, 0xf6, 0xb2, 0x7b, 0x39, 0x8b, 0x5d, 0x24, 0x2b, 0x01, 0x1b, 0x98,
+  0xa5, 0x1e, 0x29, 0x68, 0xec, 0x64, 0x6d, 0x60, 0x59, 0xcd, 0xf2, 0x04,
+  0xb4, 0xa4, 0x3d, 0x14, 0x47, 0x42, 0x9b, 0xda, 0x64, 0x9a, 0x16, 0x23,
+  0x7a, 0x88, 0x2d, 0x2d, 0x44, 0xc7, 0xfa, 0xda, 0xda, 0xda, 0xf6, 0xb6,
+  0xb8, 0xcd, 0xad, 0x6e, 0x77, 0xcb, 0xdb, 0xde, 0xfa, 0xf6, 0xb7, 0xc0,
+  0x0d, 0xae, 0x70, 0x87, 0x4b, 0xdc, 0xe2, 0x1a, 0xf7, 0xb8, 0xc8, 0x4d,
+  0xae, 0x72, 0x97, 0xcb, 0xdc, 0xe6, 0x3a, 0xf7, 0xb9, 0x53, 0x09, 0x08,
+  0x00, 0x3b
 };
-const unsigned int logo_len = 3536;
+const unsigned int logo_len = 2378;
 
 unsigned char search_data[] = {
   0x47, 0x49, 0x46, 0x38, 0x39, 0x61, 0x78, 0x00, 0x1a, 0x00, 0xe7, 0x00,
diff --git a/src/memberdef.cpp b/src/memberdef.cpp
index dab56ea..30f371f 100644
--- a/src/memberdef.cpp
+++ b/src/memberdef.cpp
@@ -225,12 +225,13 @@ static void writeTemplatePrefix(OutputList &ol,ArgumentList *al,bool br=TRUE)
  *           all types.
  */
 
-MemberDef::MemberDef(const char *t,const char *na,const char *a,const char *e,
+MemberDef::MemberDef(const char *df,int dl,
+                     const char *t,const char *na,const char *a,const char *e,
                      Protection p,Specifier v,bool s,bool r,MemberType mt,
                      const ArgumentList *tal,const ArgumentList *al
-                    ) : Definition(substituteClassNames(na))
+                    ) : Definition(df,dl,substituteClassNames(na))
 {
-  //printf("++++++ MemberDef(%s,%s,%s) ++++++ \n",t,na,a);
+  //printf("++++++ MemberDef(%s file=%s,line=%d) ++++++ \n",na,df,dl);
   classDef=0;
   fileDef=0;
   fileDec=0;
@@ -251,7 +252,6 @@ MemberDef::MemberDef(const char *t,const char *na,const char *a,const char *e,
   args=substituteClassNames(a);
   if (type.isNull()) decl=name()+args; else decl=type+" "+name()+args;
   declLine=0;
-  defLine=0;
   memberGroup=0;
   virt=v;
   prot=p;
@@ -395,8 +395,10 @@ QCString MemberDef::getOutputFileBase() const
   {
     return nspace->getOutputFileBase();
   }
-  warn("Warning: Internal inconsistency: member %s does not belong to any\n"
-       " container!\n",name().data());
+  warn(defFileName,defLine,
+       "Warning: Internal inconsistency: member %s does not belong to any"
+       " container!",name().data()
+      );
   return "dummy";
 }
 
@@ -773,7 +775,7 @@ void MemberDef::writeDeclaration(OutputList &ol,
     if (!briefDescription().isEmpty() && Config::briefMemDescFlag && !annMemb)
     {
       ol.startMemberDescription();
-      parseDoc(ol,cname,name(),briefDescription());
+      parseDoc(ol,defFileName,defLine,cname,name(),briefDescription());
       if (/*!documentation().isEmpty()*/ detailsAreVisible()) 
       {
         ol.disableAllBut(OutputGenerator::Html);
@@ -1044,14 +1046,14 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
         ) /* || !annMemb */
        )  
     { 
-      parseDoc(ol,scopeName,name(),briefDescription());
+      parseDoc(ol,defFileName,defLine,scopeName,name(),briefDescription());
       ol.newParagraph();
     }
 
     /* write detailed description */
     if (!documentation().isEmpty())
     { 
-      parseDoc(ol,scopeName,name(),documentation()+"\n");
+      parseDoc(ol,defFileName,defLine,scopeName,name(),documentation()+"\n");
       ol.pushGeneratorState();
       ol.disableAllBut(OutputGenerator::RTF);
       ol.newParagraph();
@@ -1083,7 +1085,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
           ol.endEmphasis();
           ol.endDescTableTitle();
           ol.startDescTableData();
-          parseDoc(ol,scopeName,name(),a->docs);
+          parseDoc(ol,defFileName,defLine,scopeName,name(),a->docs);
           ol.endDescTableData();
         }
       }
@@ -1138,7 +1140,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
 
             if (!fmd->briefDescription().isEmpty())
             { 
-              parseDoc(ol,scopeName,fmd->name(),fmd->briefDescription());
+              parseDoc(ol,defFileName,defLine,scopeName,fmd->name(),fmd->briefDescription());
               //ol.newParagraph();
             }
             if (!fmd->briefDescription().isEmpty() && 
@@ -1148,7 +1150,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
             }
             if (!fmd->documentation().isEmpty())
             { 
-              parseDoc(ol,scopeName,fmd->name(),fmd->documentation()+"\n");
+              parseDoc(ol,defFileName,defLine,scopeName,fmd->name(),fmd->documentation()+"\n");
             }
             ol.endDescTableData();
           }
@@ -1329,7 +1331,7 @@ void MemberDef::warnIfUndocumented()
     t="group", d=gd;
 
   if (d && d->isLinkable() && !isLinkable() && name().find('@')==-1)
-   warn("Warning: Member %s of %s %s is not documented\n",
+   warn_undoc(defFileName,defLine,"Warning: Member %s of %s %s is not documented.",
         name().data(),t,d->name().data());
 }
 
diff --git a/src/memberdef.h b/src/memberdef.h
index 90f0f75..f369592 100644
--- a/src/memberdef.h
+++ b/src/memberdef.h
@@ -59,7 +59,8 @@ class MemberDef : public Definition
                         // initialization 
     };
     
-    MemberDef(const char *type,const char *name,const char *args,
+    MemberDef(const char *defFileName,int defLine,
+              const char *type,const char *name,const char *args,
               const char *excp,Protection prot,Specifier virt,bool stat,
               bool related,MemberType t,const ArgumentList *tal,
               const ArgumentList *al);
@@ -96,8 +97,8 @@ class MemberDef : public Definition
     MemberList *getSectionList() const   { return section; }
     void setMemberType(MemberType t)     { mtype=t; }
     void setDefinition(const char *d)    { def=d; }
-    void setDefFile(const char *f)       { defFile=f; }
-    void setDefLine(int l)               { defLine=l; }
+    //void setDefFile(const char *f)       { defFile=f; }
+    //void setDefLine(int l)               { defLine=l; }
     void setFileDef(FileDef *fd)         { fileDef=fd; }
     void setFileDec(FileDef *fd)         { fileDec=fd; }
     void setAnchor(const char *a)        { anc=a; }
@@ -143,10 +144,8 @@ class MemberDef : public Definition
     ExampleList *getExampleList() const { return exampleList; }
 
     // prototype related members
-    const char *getDefFile()        { return defFile; }
-    int getDefLine()                { return defLine; }
-    void setDecFile(const char *f)  { declFile=f; }
-    void setDecLine(int l)          { defLine=l; }
+    //void setDecFile(const char *f)  { declFile=f; }
+    //void setDecLine(int l)          { defLine=l; }
     
     // convenience members
     bool isSignal() const    { return mtype==Signal;      }
@@ -219,8 +218,8 @@ class MemberDef : public Definition
     QCString declFile;        // file where the declaration was found
     int      declLine;        // line where the declaration was found
     QCString def;             // member definition in code (fully qualified name)
-    QCString defFile;         // file where the definition was found
-    int      defLine;         // line where the definition was found
+    //QCString defFile;         // file where the definition was found
+    //int      defLine;         // line where the definition was found
     QCString anc;             // HTML anchor name
     Specifier virt;           // normal/virtual/pure virtual
     Protection prot;          // protection type [Public/Protected/Private]
diff --git a/src/membergroup.cpp b/src/membergroup.cpp
index 75317d4..dc3529a 100644
--- a/src/membergroup.cpp
+++ b/src/membergroup.cpp
@@ -75,7 +75,7 @@ void MemberGroup::setAnchors()
 void MemberGroup::writeDeclarations(OutputList &ol,
                ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd)
 {
-  memberList->writeDeclarations(ol,cd,nd,fd,gd,grpHeader,doc,TRUE);
+  memberList->writeDeclarations(ol,cd,nd,fd,gd,grpHeader,doc,TRUE,TRUE);
 }
 
 void MemberGroup::writePlainDeclarations(OutputList &ol,
@@ -101,8 +101,26 @@ int MemberGroup::countDecMembers()
 {
   if (numDeclMembers==-1) /* number of member not cached */
   {
-    memberList->countDecMembers(TRUE);
+    memberList->countDecMembers(TRUE,TRUE);
     numDeclMembers = memberList->totalCount();
   }
   return numDeclMembers;
 }
+
+void MemberGroup::distributeMemberGroupDocumentation()
+{
+  MemberDef *md=memberList->first();
+  if (md && md->hasDocumentation())
+  {
+    MemberDef *omd=memberList->next();
+    while (omd)
+    {
+      if (!omd->hasDocumentation())
+      {
+        omd->setBriefDescription(md->briefDescription());
+        omd->setDocumentation(md->documentation());
+      }
+      omd=memberList->next();
+    }
+  }
+}
diff --git a/src/membergroup.h b/src/membergroup.h
index 1b54596..37fa9dd 100644
--- a/src/membergroup.h
+++ b/src/membergroup.h
@@ -53,6 +53,7 @@ class MemberGroup /* : public Definition */
     bool allMembersInSameSection() { return inSameSection; }
     void addToDeclarationSection();
     int countDecMembers();
+    void distributeMemberGroupDocumentation();
 
   private: 
     MemberList *memberList;      // list of all members in the group
diff --git a/src/memberlist.cpp b/src/memberlist.cpp
index 430fb2d..e15f36a 100644
--- a/src/memberlist.cpp
+++ b/src/memberlist.cpp
@@ -44,13 +44,16 @@ int MemberList::compareItems(GCI item1, GCI item2)
   return strcmp(c1->name(),c2->name());
 }
 
-void MemberList::countDecMembers(bool inGroup)
+void MemberList::countDecMembers(bool inGroup,bool countSubGroups)
 {
+  //printf("----- countDecMembers ----\n");
   varCnt=funcCnt=enumCnt=enumValCnt=typeCnt=protoCnt=defCnt=friendCnt=0;
   m_count=0;
   MemberDef *md=first();
   while (md)
   {
+    //printf("md=%p md->name()=`%s' inGroup=%d getMemberGroup()=%p\n",
+    //    md,md->name().data(),inGroup,md->getMemberGroup());
     if (!(md->memberClass()==0 && md->isStatic() && !Config::extractPrivateFlag) &&
         (!Config::hideMemberFlag || md->hasDocumentation()) &&
         (
@@ -60,7 +63,8 @@ void MemberList::countDecMembers(bool inGroup)
          (md->isEnumerate() &&
           md->hasDocumentedEnumValues()
          )
-        ) && inGroup==(md->getMemberGroup()!=0) &&
+        ) && 
+        inGroup==(md->getMemberGroup()!=0) &&
         !(inGroup && md->protection()==Private && !Config::extractPrivateFlag)
        )
     {
@@ -88,17 +92,18 @@ void MemberList::countDecMembers(bool inGroup)
     }
     md=next();
   }
-  if (memberGroupList && !inGroup)
+  if (memberGroupList && countSubGroups)
   {
     MemberGroupListIterator mgli(*memberGroupList);
     MemberGroup *mg;
     for (;(mg=mgli.current());++mgli)
     {
-      //printf("memberGroupList adding %d inGroup=%d\n",
-      //    mg->countDecMembers(),m_count);
-      m_count+=mg->countDecMembers();
+      int mgCount = mg->countDecMembers();
+      //printf("memberGroupList adding %d inGroup=%d\n",mgCount,inGroup);
+      m_count+=mgCount;
     }
   }
+  //printf("----- end countDecMembers ----\n");
 
   //printf("MemberList::countDecMembers(%d)=%d\n",inGroup,m_count);
 }
@@ -147,12 +152,13 @@ MemberListIterator::MemberListIterator(const QList<MemberDef> &l) :
 
 void MemberList::writePlainDeclarations(OutputList &ol,
                        ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd,
-                       bool inGroup
+                       bool inGroup,bool countSubGroups
                       )
 {
-  countDecMembers(inGroup);
-  //printf("writePlainDeclaration() totalCount()=%d defineCount()=%d\n",totalCount(),defineCount());
+  //printf("----- writePlainDeclaration() ----\n");
+  countDecMembers(inGroup,countSubGroups);
   if (totalCount()==0) return; // no members in this list
+  //printf("----> writePlainDeclaration() inGroup=%d totalCount()=%d\n",inGroup,totalCount());
   
   ol.pushGeneratorState();
 
@@ -163,6 +169,7 @@ void MemberList::writePlainDeclarations(OutputList &ol,
 
   if (defineCount()>0)
   {
+    //printf("There are %d defines\n",defineCount());
     if (sectionPerType)
     {
       ol.startMemberHeader();
@@ -191,6 +198,7 @@ void MemberList::writePlainDeclarations(OutputList &ol,
   
   if (protoCount()>0)
   {
+    //printf("There are %d prototypes\n",protoCount());
     if (sectionPerType)
     {
       ol.startMemberHeader();
@@ -214,6 +222,7 @@ void MemberList::writePlainDeclarations(OutputList &ol,
   
   if (typedefCount()>0)
   {
+    //printf("There are %d typedefs\n",typedefCount());
     if (sectionPerType) 
     {
       ol.startMemberHeader();
@@ -236,6 +245,7 @@ void MemberList::writePlainDeclarations(OutputList &ol,
   // write enums 
   if (enumCount()>0)
   {
+    //printf("There are %d enums\n",enumCount());
     if (sectionPerType) 
     {
       ol.startMemberHeader();
@@ -357,6 +367,7 @@ void MemberList::writePlainDeclarations(OutputList &ol,
             {
               ol.startMemberDescription();
               parseDoc(ol,
+                       md->getDefFileName(),md->getDefLine(),
                        cd?cd->name().data():0,md->name().data(),
                        md->briefDescription()
                       );
@@ -384,6 +395,7 @@ void MemberList::writePlainDeclarations(OutputList &ol,
   // write functions
   if (funcCount()>0)
   {
+    //printf("There are %d functions\n",funcCount());
     if (sectionPerType) 
     {
       ol.startMemberHeader();
@@ -408,6 +420,7 @@ void MemberList::writePlainDeclarations(OutputList &ol,
   
   if (friendCount()>0)
   {
+    //printf("There are %d friends\n",friendCount());
     MemberListIterator mli(*this);
     for ( ; (md=mli.current()) ; ++mli )
     {
@@ -455,6 +468,7 @@ void MemberList::writePlainDeclarations(OutputList &ol,
   // write variables
   if (varCount()>0)
   {
+    //printf("There are %d variables\n",varCount());
     if (sectionPerType) 
     {
       ol.startMemberHeader();
@@ -483,6 +497,7 @@ void MemberList::writePlainDeclarations(OutputList &ol,
       if (md->fromAnnonymousScope() && !md->annonymousDeclShown()
           && inGroup==(md->getMemberGroup()!=0))
       {
+        //printf("annonymous compound members\n");
         md->setFromAnnonymousScope(FALSE);
         md->writeDeclaration(ol,cd,nd,fd,gd,inGroup);
         md->setFromAnnonymousScope(TRUE);
@@ -493,16 +508,28 @@ void MemberList::writePlainDeclarations(OutputList &ol,
   if (!sectionPerType) { ol.endMemberList(); /*ol.writeChar('\n');*/ }
 
   ol.popGeneratorState();
+  //printf("----- end writePlainDeclaration() ----\n");
 }
 
 void MemberList::writeDeclarations(OutputList &ol,
              ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd,
-             const char *title,const char *subtitle,bool inGroup)
+             const char *title,const char *subtitle,
+             bool inGroup,bool countSubGroups)
 {
-  //printf("MemberList::writeDeclaration(title=`%s',subtitle=`%s')\n",
-  //    title,subtitle);
-  countDecMembers(inGroup);
-  if (totalCount()==0) return;
+  //printf("MemberList::writeDeclaration(title=`%s',subtitle=`%s')\n",title,subtitle);
+  //printf("----- writeDeclaration() ----\n");
+  countDecMembers(FALSE,countSubGroups);            // count member not in group
+  int normalMembers = totalCount();
+  int ingroupMembers = 0;
+  //printf("Normal members %d\n",normalMembers);
+  if (inGroup)
+  {
+    countDecMembers(TRUE,countSubGroups);             // count member inside group
+    ingroupMembers = totalCount();
+  }
+  int totalMembers = normalMembers + ingroupMembers;
+  //printf("Total members %d\n",totalMembers);
+  if (totalMembers==0) return;
   if (title) 
   {
     ol.startMemberHeader();
@@ -514,13 +541,13 @@ void MemberList::writeDeclarations(OutputList &ol,
     //printf("subtitle=`%s'\n",subtitle);
     ol.startMemberSubtitle();
     if (inGroup)
-      parseDoc(ol,0,0,subtitle);
+      parseDoc(ol,"<generated>",1,0,0,subtitle);
     else
       parseText(ol,subtitle);
     ol.endMemberSubtitle();
   }
 
-  writePlainDeclarations(ol,cd,nd,fd,gd,inGroup);
+  writePlainDeclarations(ol,cd,nd,fd,gd,inGroup,FALSE);
   
   if (memberGroupList)
   {
@@ -530,13 +557,17 @@ void MemberList::writeDeclarations(OutputList &ol,
     while ((mg=mgli.current()))
     {
       ol.startMemberGroupHeader();
-      parseText(ol,mg->header());
+      if (mg->header()!="[NOHEADER]")
+      {
+        parseText(ol,mg->header());
+      }
       ol.endMemberGroupHeader();
       if (!mg->documentation().isEmpty())
       {
         //printf("Member group has docs!\n");
         ol.startMemberGroupDocs();
-        parseDoc(ol,0,0,mg->documentation());
+        parseDoc(ol,"<generated>",1,
+            0,0,mg->documentation());
         ol.endMemberGroupDocs();
       }
       ol.startMemberGroup();
@@ -545,6 +576,7 @@ void MemberList::writeDeclarations(OutputList &ol,
       ol.endMemberGroup(mgli.current()==0);
     }
   }
+  //printf("----- end writeDeclaration() ----\n");
 
 }
 
diff --git a/src/memberlist.h b/src/memberlist.h
index 239d5f7..8346c8f 100644
--- a/src/memberlist.h
+++ b/src/memberlist.h
@@ -41,7 +41,7 @@ class MemberList : public QList<MemberDef>
     int protoCount() const     { return protoCnt;   }
     int defineCount() const    { return defCnt;     }
     int friendCount() const    { return friendCnt;  }
-    void countDecMembers(bool inGroup);
+    void countDecMembers(bool inGroup,bool countSubGroups);
     void countDocMembers();
     int totalCount() const 
          { return //varCnt+funcCnt+enumCnt+enumValCnt+typeCnt+
@@ -50,10 +50,11 @@ class MemberList : public QList<MemberDef>
          }
     void writePlainDeclarations(OutputList &ol,
                ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd,
-               bool inGroup=FALSE);
+               bool inGroup=FALSE,bool countSubGroups=TRUE);
     void writeDeclarations(OutputList &ol,
                ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd,
-               const char *title,const char *subtitle,bool inGroup=FALSE);
+               const char *title,const char *subtitle,
+               bool inGroup=FALSE,bool countSubGroups=TRUE);
     void writeDocumentation(OutputList &ol,const char *scopeName
                /*,MemberDef::MemberType m*/);
     void addMemberGroup(MemberGroup *mg);
diff --git a/src/message.cpp b/src/message.cpp
index 838182f..678a80a 100644
--- a/src/message.cpp
+++ b/src/message.cpp
@@ -18,6 +18,57 @@
 #include <stdarg.h>
 #include <stdio.h>
 #include "config.h"
+#include <qregexp.h>
+
+static QCString outputFormat;
+static int warnFormatOrder; // 1 = $file,$line,$text
+                            // 2 = $text,$line,$file
+                            // 3 = $line,$text,$file
+                            // 4 = $file,$text,$line
+                            // 5 = $text,$file,$line
+                            // 6 = $line,$file,$text
+
+void initWarningFormat()
+{
+  int filePos = Config::warnFormat.find("$file");
+  int linePos = Config::warnFormat.find("$line");
+  int textPos = Config::warnFormat.find("$text");
+
+  // sort items on position (there are 6 cases)
+  warnFormatOrder = 1;
+  if (filePos>linePos && filePos>textPos)
+  {
+    if (linePos>textPos) // $text,$line,$file
+    {
+      warnFormatOrder = 2;
+    }
+    else                 // $line,$text,$file
+    {
+      warnFormatOrder = 3;
+    }
+  }
+  else if (filePos<linePos && filePos<textPos)
+  {
+    if (linePos>textPos) // $file,$text,$line
+    {
+      warnFormatOrder = 4;
+    }
+  }
+  else if (filePos<linePos && filePos>textPos) // $text,$file,$line
+  {
+    warnFormatOrder = 5;
+  }
+  else // $line,$file,$text
+  {
+    warnFormatOrder = 6;
+  }
+  outputFormat = Config::warnFormat.
+      replace(QRegExp("\\$file"),"%s").
+      replace(QRegExp("\\$text"),"%s").
+      replace(QRegExp("\\$line"),"%d")+
+      '\n';
+}
+
 
 void msg(const char *fmt, ...)
 {
@@ -30,7 +81,31 @@ void msg(const char *fmt, ...)
   }
 }
 
-void warn(const char *fmt, ...)
+void warn(const char *file,int line,const char *fmt, ...)
+{
+  if (Config::warningFlag)
+  {
+    if (file==0) file="<unknwon>";
+    char text[4096];
+    va_list args;
+    va_start(args, fmt);
+    vsprintf(text, fmt, args);
+    va_end(args); 
+    switch(warnFormatOrder)
+    {
+      case 1: fprintf(stderr,outputFormat,file,line,text); break;
+      case 2: fprintf(stderr,outputFormat,text,line,file); break;
+      case 3: fprintf(stderr,outputFormat,line,text,file); break;
+      case 4: fprintf(stderr,outputFormat,file,text,line); break;
+      case 5: fprintf(stderr,outputFormat,text,file,line); break;
+      case 6: fprintf(stderr,outputFormat,line,file,text); break;
+      default:
+        printf("Error: warning format has not been initialized!\n");
+    }
+  }
+}
+
+void warn_cont(const char *fmt, ...)
 {
   if (Config::warningFlag)
   {
@@ -41,6 +116,30 @@ void warn(const char *fmt, ...)
   }
 }
   
+void warn_undoc(const char *file,int line,const char *fmt, ...)
+{
+  if (Config::warningUndocFlag)
+  {
+    if (file==0) file="<unknwon>";
+    char text[4096];
+    va_list args;
+    va_start(args, fmt);
+    vsprintf(text, fmt, args);
+    va_end(args); 
+    switch(warnFormatOrder)
+    {
+      case 1: fprintf(stderr,outputFormat,file,line,text); break;
+      case 2: fprintf(stderr,outputFormat,text,line,file); break;
+      case 3: fprintf(stderr,outputFormat,line,text,file); break;
+      case 4: fprintf(stderr,outputFormat,file,text,line); break;
+      case 5: fprintf(stderr,outputFormat,text,file,line); break;
+      case 6: fprintf(stderr,outputFormat,line,file,text); break;
+      default:
+        printf("Error: warning format has not been initialized!\n");
+    }
+  }
+}
+  
 void err(const char *fmt, ...)
 {
   va_list args;
diff --git a/src/message.h b/src/message.h
index e125cdd..87022f6 100644
--- a/src/message.h
+++ b/src/message.h
@@ -19,7 +19,10 @@
 #define MESSAGE_H
 
 extern void msg(const char *fmt, ...);
-extern void warn(const char *fmt, ...);
+extern void warn(const char *file,int line,const char *fmt, ...);
+extern void warn_cont(const char *fmt, ...);
+extern void warn_undoc(const char *file,int line,const char *fmt, ...);
 extern void err(const char *fmt, ...);
+void initWarningFormat();
 
 #endif
diff --git a/src/namespacedef.cpp b/src/namespacedef.cpp
index 0507f2a..7c145ec 100644
--- a/src/namespacedef.cpp
+++ b/src/namespacedef.cpp
@@ -27,7 +27,9 @@
 #include "doxygen.h"
 #include "message.h"
 
-NamespaceDef::NamespaceDef(const char *name,const char *ref) : Definition(name)
+NamespaceDef::NamespaceDef(const char *df,int dl,
+                           const char *name,const char *ref) : 
+   Definition(df,dl,name)
 {
   fileName="namespace_"+nameToFile(name);
   classList = new ClassList;
@@ -38,6 +40,8 @@ NamespaceDef::NamespaceDef(const char *name,const char *ref) : Definition(name)
   memberGroupList = new MemberGroupList;
   memberGroupList->setAutoDelete(TRUE);
   memberGroupDict = new MemberGroupDict(1009);
+  defFileName = df;
+  defLine = dl;
 }
 
 NamespaceDef::~NamespaceDef()
@@ -49,6 +53,15 @@ NamespaceDef::~NamespaceDef()
   delete memberGroupDict;
 }
 
+void NamespaceDef::distributeMemberGroupDocumentation()
+{
+  MemberGroupListIterator mgli(*memberGroupList);
+  MemberGroup *mg;
+  for (;(mg=mgli.current());++mgli)
+  {
+    mg->distributeMemberGroupDocumentation();
+  }
+}
 void NamespaceDef::insertUsedFile(const char *f)
 {
   if (files.find(f)==-1) files.append(f);
@@ -130,7 +143,7 @@ void NamespaceDef::writeDocumentation(OutputList &ol)
   OutputList briefOutput(&ol); 
   if (!briefDescription().isEmpty()) 
   {
-    parseDoc(briefOutput,name(),0,briefDescription());
+    parseDoc(briefOutput,defFileName,defLine,name(),0,briefDescription());
     ol+=briefOutput;
     ol.writeString(" \n");
     ol.pushGeneratorState();
@@ -183,7 +196,7 @@ void NamespaceDef::writeDocumentation(OutputList &ol)
     }
     if (!documentation().isEmpty())
     {
-      parseDoc(ol,name(),0,documentation()+"\n");
+      parseDoc(ol,defFileName,defLine,name(),0,documentation()+"\n");
       ol.newParagraph();
     }
     ol.endTextBlock();
diff --git a/src/namespacedef.h b/src/namespacedef.h
index 13458c8..d6f4b59 100644
--- a/src/namespacedef.h
+++ b/src/namespacedef.h
@@ -36,7 +36,8 @@ class MemberGroupList;
 class NamespaceDef : public Definition
 {
   public:
-    NamespaceDef(const char *name,const char *ref=0);
+    NamespaceDef(const char *defFileName,int defLine,
+                 const char *name,const char *ref=0);
    ~NamespaceDef();
     //QCString namespaceFile() const { return fileName; }
     QCString getOutputFileBase() const { return fileName; }
@@ -72,6 +73,7 @@ class NamespaceDef : public Definition
     {
       return isLinkableInProject() || isReference();
     }
+    void distributeMemberGroupDocumentation();
     
   private:
     //QCString reference;
diff --git a/src/pre.l b/src/pre.l
index 9e7a241..34f187f 100644
--- a/src/pre.l
+++ b/src/pre.l
@@ -171,12 +171,12 @@ static FILE *findFile(const char *fileName)
       {
 	QCString cmd = Config::inputFilter+" "+absName;
 	f=popen(cmd,"r");
-	if (!f) warn("Warning: could not execute filter %s\n",cmd.data());
+	if (!f) err("Error: could not execute filter %s\n",cmd.data());
       }
       else
       {
 	f=fopen(absName,"r");
-	if (!f) warn("Warning: could not open file %s for reading\n",absName.data());
+	if (!f) err("Error: could not open file %s for reading\n",absName.data());
       }
       if (f)
       {
@@ -761,7 +761,9 @@ void addDefine()
 {
   //bool ambig;
   //FileDef   *fd=findFileDef(&inputNameDict,g_yyFileName,ambig);
-  MemberDef *md=new MemberDef("#define",g_defName,g_defArgsStr,0,
+  MemberDef *md=new MemberDef(
+      g_yyFileName,g_yyLineNr,
+      "#define",g_defName,g_defArgsStr,0,
       Public,Normal,FALSE,FALSE,MemberDef::Define,0,0);
   if (!g_defArgsStr.isEmpty())
   {
@@ -773,8 +775,8 @@ void addDefine()
   //printf("Setting initializer for `%s' to `%s'\n",g_defName.data(),g_defText.data());
   md->setInitializer(g_defLitText);
   
-  md->setDefFile(g_yyFileName);
-  md->setDefLine(g_yyLineNr);
+  //md->setDefFile(g_yyFileName);
+  //md->setDefLine(g_yyLineNr);
   md->setFileDef(g_yyFileDef);
   md->setDefinition("#define "+g_defName);
 
diff --git a/src/rtfgen.cpp b/src/rtfgen.cpp
index d8a17c7..55a3a11 100644
--- a/src/rtfgen.cpp
+++ b/src/rtfgen.cpp
@@ -1665,7 +1665,7 @@ void RTFGenerator::incrementIndentLevel()
   m_listLevel++;
   if (m_listLevel>indentLevels-1) 
   {
-    warn("Warning: Maximum indent level (%d) exceeded while generating RTF output!\n",indentLevels); 
+    warn_cont("Warning: Maximum indent level (%d) exceeded while generating RTF output!\n",indentLevels); 
     m_listLevel=indentLevels-1;
   }
 }
@@ -1675,7 +1675,7 @@ void RTFGenerator::decrementIndentLevel()
   m_listLevel--;
   if (m_listLevel<0) 
   {
-    warn("Warning: Negative indent level while generating RTF output!\n");
+    warn_cont("Warning: Negative indent level while generating RTF output!\n");
     m_listLevel=0;
   }
 }
diff --git a/src/scanner.h b/src/scanner.h
index ddb63c0..40add67 100644
--- a/src/scanner.h
+++ b/src/scanner.h
@@ -29,8 +29,10 @@
 class OutputList;
 
 extern void parseMain(Entry *);
-extern void parseDoc(OutputList &ol,const char *clName, const char *memName,
-                           const QCString &docString);
+extern void parseDoc(OutputList &ol,
+                     const char *fileName,int startLine,
+                     const char *clName, const char *memName,
+                     const QCString &docString);
 extern void parseExample(OutputList &ol,const QCString &docString, 
                            const char *fileName);
 extern void parseText(OutputList &ol,const QCString &txtString);
diff --git a/src/scanner.l b/src/scanner.l
index 6f2fea7..a976a68 100644
--- a/src/scanner.l
+++ b/src/scanner.l
@@ -56,7 +56,6 @@
 static bool             insideArgumentList;
 static QCString         className;
 static QCString         memberName;
-static QCString         refName;
 static OutputList *     outDoc;
 static QCString         code;
 static QCString         linkRef;
@@ -98,9 +97,9 @@ static Entry*		global_root  = 0 ;
 static Entry*		current      = 0 ;
 static Entry*		previous     = 0 ;
 static Entry*		tempEntry    = 0 ;
-static int		yyLineNr     = 0 ;
+static int		yyLineNr     = 1 ;
 static int              anonCount    = 0 ;        
-static char		yyFileName[2048] ;
+static char		yyFileName[4096] ;
 static int              lastMemberGroupLine;
 static bool    		sig;
 static bool    		slot;
@@ -179,7 +178,6 @@ static void initParser()
   insideArgumentList=FALSE;
   className.resize(0);
   memberName.resize(0);
-  refName="<unknown>";
   code.resize(0);
   linkRef.resize(0);
   linkText.resize(0);
@@ -415,15 +413,18 @@ static void includeFile(OutputList &ol,const char *fileName,bool quiet)
   }
   else if (ambig)
   {
-    warn("Include file name %s is ambigious.\n",fileName);
-    warn("Possible candidates:\n");
-    //includeFileList.writeMatches(fileName);
-    showFileDefMatches(&exampleNameDict,fileName);
+    QCString text;
+    text.sprintf("Include file name %s is ambigious.\n",fileName);
+    text+="Possible candidates:\n";
+    text+=showFileDefMatches(&exampleNameDict,fileName);
+    warn(yyFileName,yyLineNr,text);
   }
   else
   {
-    warn("Warning: example file %s is not found. ",fileName);
-    warn("Check your EXAMPLE_PATH\n");
+    warn(yyFileName,yyLineNr,
+         "Warning: example file %s is not found. "
+         "Check your EXAMPLE_PATH",fileName
+	);
   }
 }
 
@@ -440,14 +441,17 @@ static void verbIncludeFile(OutputList &ol,const char *name)
   }
   else if (ambig)
   {
-    warn("Include file name %s is ambigious.\n",name);
-    warn("Possible candidates:\n");
-    showFileDefMatches(&exampleNameDict,name);
+    QCString text;
+    text.sprintf("Include file name %s is ambigious.\n",name);
+    text+=("Possible candidates:\n");
+    text+=showFileDefMatches(&exampleNameDict,name);
+    warn(yyFileName,yyLineNr,text);
   }
   else
   {
-    warn("Warning: example file %s is not found. ",name);
-    warn("Check your EXAMPLE_PATH\n");
+    warn(yyFileName,yyLineNr,
+         "Warning: example file %s is not found. "
+         "Check your EXAMPLE_PATH",name);
   }
 }
 
@@ -619,7 +623,8 @@ static void addListItemMarker(const char *marker)
       if (listIndentStack.isEmpty()) 
       {
 	insideItemList=FALSE;
-	warn("Warning: list item with invalid indent found!\n");
+	warn(yyFileName,yyLineNr,
+             "Warning: list item with invalid indent found!");
       }
       else
       {
@@ -690,7 +695,8 @@ static void addSection()
   }
   else
   {
-    warn("Warning: Duplicate label %s found!\n",sectionLabel.data());
+    warn(yyFileName,yyLineNr,
+         "Warning: Duplicate label %s found!",sectionLabel.data());
   }
 }
 
@@ -731,7 +737,7 @@ static void checkDocs()
      )
   {
     warn("Warning: Found lonely '<' symbol at the start of the documentation "
-	 "at line %d of %s\n",yyLineNr,yyFileName);
+	 "at line %d of %s",yyLineNr,yyFileName);
 	 
   }
 }
@@ -810,28 +816,33 @@ static QCString findAndCopyImage(const char *fileName,ImageTypes type)
       }
       else
       {
-	warn("Warning: could not write output image %s\n",outputFile.data());
+	warn(yyFileName,yyLineNr,
+             "Warning: could not write output image %s",outputFile.data());
       }
     }
     else
     {
-      warn("Warning: could not open image %s\n",fileName);
+      warn(yyFileName,yyLineNr,
+           "Warning: could not open image %s",fileName);
     }
   }
   else if (ambig)
   {
-    warn("Warning: image file name %s is ambigious.\n",fileName);
-    warn("Possible candidates:\n");
-    //includeFileList.writeMatches(fileName);
-    showFileDefMatches(&imageNameDict,fileName);
+    QCString text;
+    text.sprintf("Warning: image file name %s is ambigious.\n",fileName);
+    text+="Possible candidates:\n";
+    text+=showFileDefMatches(&imageNameDict,fileName);
+    warn(yyFileName,yyLineNr,text);
   }
   else
   {
     result=fileName;
     if (result.left(5)!="http:")
     {
-      warn("Warning: image file %s is not found in IMAGE_PATH: "  
-	   "assuming external image.\n",fileName);
+      warn(yyFileName,yyLineNr,
+           "Warning: image file %s is not found in IMAGE_PATH: "  
+	   "assuming external image.",fileName
+          );
     }
   }
   return result;
@@ -930,7 +941,7 @@ DOCPARAM  ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
 %x      DefineArg
 %x	DefineEnd
 %x	Include
-%x	ClassName
+%x	CompoundName
 %x	ClassVar
 %x	ClassTemplSpec
 %x	Bases
@@ -1084,7 +1095,7 @@ DOCPARAM  ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
 <*>\x06[^\x06]*\x06			{ // new file
   					  if (memberGroupId!=NOGROUP)
 					  {
-					    warn("Warning: Missing //@} in file %s\n",yyFileName);
+					    warn(yyFileName,yyLineNr,"Warning: Missing //@}");
 					    memberGroupId=NOGROUP;
 					  }
   					  yyLineNr= 0 ; // there is always an extra newline at the start of the file
@@ -1246,8 +1257,10 @@ DOCPARAM  ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
 					  BEGIN( DocScan );
   					}
   */
-<DocScan>{CMD}"endlink"/[^a-z_A-Z0-9]      { warn("Warning: \\endlink without \\link "
-    					         "in documentation of %s\n", refName.data()); 
+<DocScan>{CMD}"endlink"/[^a-z_A-Z0-9]   { warn(yyFileName,yyLineNr,
+                                               "Warning: \\endlink without \\link "
+    					       "in documentation."
+                                              ); 
 					}
 <DocScan>{CMD}"addindex"/{BN}		{
   					  BEGIN(DocIndexWord);
@@ -1620,8 +1633,10 @@ DOCPARAM  ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
 <DocScan>{CMD}"endif"/[^a-z_A-Z0-9]	{
 					  if (--depthIf<0)
 					  {
-					    warn("Warning: documentation block contains \\endif without "
-						 "matching \\if found in documentation of %s!",refName.data());
+					    warn(yyFileName,yyLineNr,
+                                                 "Warning: documentation block contains \\endif without "
+						 "matching \\if found in documentation."
+                                                );
 					  }
 					  else
 					  {
@@ -1657,8 +1672,8 @@ DOCPARAM  ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
 					  }
 					  else if (!generateLink(*outDoc,className,yytext,TRUE,0))
 					  {
-					    warn("Warning: reference to unknown section %s!\n",yytext);
-					    outDoc->writeBoldString(" unknown reference!");
+					    warn(yyFileName,yyLineNr,"Warning: reference to unknown section %s!",yytext);
+					    outDoc->writeBoldString(" unknown reference! ");
 					  }
 					  BEGIN(DocScan);
   					}
@@ -1687,8 +1702,8 @@ DOCPARAM  ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
 					  }
 					  else if (!generateLink(*outDoc,className,sectionRef,TRUE,text))
 					  {
-					    warn("Warning: reference to unknown section %s!\n",sectionRef.data());
-					    outDoc->writeBoldString("unknown reference!");
+					    warn(yyFileName,yyLineNr,"Warning: reference to unknown section %s!",sectionRef.data());
+					    outDoc->writeBoldString(" unknown reference! ");
 					  }
 					  BEGIN(DocScan);
   					}
@@ -1705,8 +1720,8 @@ DOCPARAM  ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
 					  }
 					  else
 					  {
-					    warn("Warning: reference to unknown section %s!\n",sectionRef.data());
-					    outDoc->writeBoldString("unknown reference!");
+					    warn(yyFileName,yyLineNr,"Warning: reference to unknown section %s!",sectionRef.data());
+					    outDoc->writeBoldString(" unknown reference! ");
 					  }
 					  BEGIN(DocScan);
   					}
@@ -1767,10 +1782,10 @@ DOCPARAM  ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
 					  BEGIN(DocScan);
   					}
 <DocImage>[a-z_A-Z0-9\.\-]+		{
-					  warn("Warning: %s is an unsupported output format for \\image\n",yytext);
+					  warn(yyFileName,yyLineNr,"Warning: %s is an unsupported output format for \\image",yytext);
   					}
 <DocImage,DocHtmlImageName,DocLatexImageName>\n {
-  					  warn("Warning: invalid \\image command found!\n");
+  					  warn(yyFileName,yyLineNr,"Warning: invalid \\image command found!");
 					  outDoc->enableAll();
 					  BEGIN(DocScan);
   					}
@@ -1780,8 +1795,8 @@ DOCPARAM  ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
 					  BEGIN( DocCodeBlock ); 
 					}
 <DocScan>{CMD}"endcode"/[^a-z_A-Z0-9] 	{ 
-  					  warn("Warning: \\endcode without <PRE> or \\code "
-    					       "in the documentation of %s\n",refName.data()); 
+  					  warn(yyFileName,yyLineNr,"Warning: \\endcode without <PRE> or \\code "
+    					       "in the documentation."); 
 					}
 <DocScan>{SCOPEMASK}"("[a-z_A-Z0-9,:\<\> \t\*\&]+")"	{
   					  generateRef(*outDoc,className,yytext,inSeeBlock);
@@ -1891,13 +1906,8 @@ DOCPARAM  ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
 <DocScan>"</"{STRONG}{ATTR}">"		{ outDoc->endBold(); }
 <DocScan>"<"{CENTER}{ATTR}">"		{ outDoc->startCenter(); }
 <DocScan>"</"{CENTER}{ATTR}">"		{ outDoc->endCenter(); }
-<DocScan>"<"{TABLE}{ATTR}">"		{ 
-  					  startTable();
-  					  /*outDoc->startTable();*/ }
-<DocScan>"</"{TABLE}{ATTR}">"		{
- 					  endTable(); 
-  					  /*outDoc->endTable();*/ 
-					}
+<DocScan>"<"{TABLE}{ATTR}">"		{ startTable(); }
+<DocScan>"</"{TABLE}{ATTR}">"		{ endTable(); }
 <DocScan>"<"{INPUT}{ATTR}">"
 <DocScan>"<"{SMALL}{ATTR}">"		{ outDoc->startSmall(); }
 <DocScan>"</"{SMALL}{ATTR}">"		{ outDoc->endSmall(); }
@@ -1928,8 +1938,10 @@ DOCPARAM  ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
 					  BEGIN( DocCodeBlock ); 
 					}
 <DocScan>"</"{PRE}{ATTR}">"		 	{ 
-  					  warn("Warning: </PRE> without <PRE> or \\code"
-    					         "in the documentation of %s\n",refName.data()); 
+  					  warn(yyFileName,yyLineNr,
+                                               "Warning: </PRE> without <PRE> or \\code"
+    					       "in the documentation."
+                                              ); 
 					}
 <DocScan>"<"{SUB}{ATTR}">"		{ outDoc->startSubscript(); }
 <DocScan>"</"{SUB}{ATTR}">"		{ outDoc->endSubscript(); }
@@ -1945,7 +1957,9 @@ DOCPARAM  ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
 <DocScan>"</"{OL}{ATTR}">"		{ 
 					  if (currentListIndentLevel<=0)
 					  {
-					    warn("Warning: more </ol> tags than <ol> tags in the documentation of %s\n",yyFileName);
+					    warn(yyFileName,yyLineNr,
+                                                 "Warning: more </ol> tags than <ol> tags in the documentation."
+                                                );
 					  }
 					  else
 					  {
@@ -1959,7 +1973,9 @@ DOCPARAM  ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
 <DocScan>"</"{UL}{ATTR}">"		{ 
 					  if (currentListIndentLevel<=0)
 					  {
-					    warn("Warning: more </ul> tags than <ul> tags in the documentation of %s\n",yyFileName);
+					    warn(yyFileName,yyLineNr,
+                                                 "Warning: more </ul> tags than <ul> tags in the documentation."
+                                                );
 					  }
 					  else
 					  {
@@ -1980,7 +1996,9 @@ DOCPARAM  ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
 <DocScan>"</"{DL}{ATTR}">"		{ 
 					  if (currentListIndentLevel<=0)
 					  {
-					    warn("Warning: more </dl> tags than <dl> tags in the documentation of %s\n",yyFileName);
+					    warn(yyFileName,yyLineNr,
+                                                 "Warning: more </dl> tags than <dl> tags in the documentation."
+                                                );
 					  }
 					  else
 					  {
@@ -2278,7 +2296,7 @@ DOCPARAM  ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
 					  current->startLine = yyLineNr;
 					  current->bodyLine  = yyLineNr;
 					  lineCount();
-  					  BEGIN( ClassName ); 
+  					  BEGIN( CompoundName ); 
 					}
 <FindMembers>{B}*"module"{BN}+		{ 
   					  isTypedef=FALSE;
@@ -2288,7 +2306,7 @@ DOCPARAM  ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
 					  current->startLine = yyLineNr;
 					  current->bodyLine  = yyLineNr;
 					  lineCount();
-  					  BEGIN( ClassName ); 
+  					  BEGIN( CompoundName ); 
 					}
 <FindMembers>{B}*"interface"{BN}+ 	{ // M$/Corba IDL interface
   					  isTypedef=FALSE;
@@ -2299,7 +2317,7 @@ DOCPARAM  ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
 					  current->startLine = yyLineNr;
 					  current->bodyLine  = yyLineNr;
 					  lineCount();
-					  BEGIN( ClassName );
+					  BEGIN( CompoundName );
   					}
 <FindMembers>{B}*"exception"{BN}+ 	{ // Corba IDL exception
   					  isTypedef=FALSE;
@@ -2310,7 +2328,7 @@ DOCPARAM  ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
 					  current->startLine = yyLineNr;
 					  current->bodyLine  = yyLineNr;
 					  lineCount();
-					  BEGIN( ClassName );
+					  BEGIN( CompoundName );
   					}
 <FindMembers>{B}*(("typedef"{BN}+)?)"class"{BN}+ { 
 					  isTypedef=((QCString)yytext).find("typedef")!=-1;
@@ -2321,7 +2339,7 @@ DOCPARAM  ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
 					  current->startLine = yyLineNr;
 					  current->bodyLine  = yyLineNr;
 					  lineCount() ;
-					  BEGIN( ClassName ) ;
+					  BEGIN( CompoundName ) ;
 					}
 <FindMembers>{B}*(("typedef"{BN}+)?)"struct"{BN}+ { 
 					  isTypedef=((QCString)yytext).find("typedef")!=-1;
@@ -2332,7 +2350,7 @@ DOCPARAM  ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
 					  current->startLine = yyLineNr;
 					  current->bodyLine  = yyLineNr;
 					  lineCount() ;
-					  BEGIN( ClassName ) ;
+					  BEGIN( CompoundName ) ;
 					}
 <FindMembers>{B}*(("typedef"{BN}+)?)"union"{BN}+ { 
 					  isTypedef=((QCString)yytext).find("typedef")!=-1;
@@ -2343,7 +2361,7 @@ DOCPARAM  ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
 					  current->startLine = yyLineNr;
 					  current->bodyLine  = yyLineNr;
 					  lineCount() ;
-					  BEGIN( ClassName ) ;
+					  BEGIN( CompoundName ) ;
 					}
 <FindMembers>{B}*(("typedef"{BN}+)?)"enum"{BN}+	{ 
 					  isTypedef=((QCString)yytext).find("typedef")!=-1;
@@ -2354,7 +2372,7 @@ DOCPARAM  ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
 					  current->startLine = yyLineNr;
 					  current->bodyLine  = yyLineNr;
 					  lineCount() ;
-					  BEGIN( ClassName ) ;
+					  BEGIN( CompoundName ) ;
 					}
 <Operator>"("{BN}*")"{BN}*/"("		{
   					  lineCount();
@@ -2689,15 +2707,17 @@ DOCPARAM  ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
 <FindMembers>"//@{"|"/*@{*/"		{
 					  if (memberGroupId!=NOGROUP)
 					  {
-  					    warn("Warning: ignoring nested member group "
-					         "at line %d of %s. Previous command was found at line %d\n",
-						 yyLineNr,yyFileName,lastMemberGroupLine);
+  					    warn(yyFileName,yyLineNr,"Warning: ignoring nested member group. "
+					         "Previous command was found at line %d.",lastMemberGroupLine);
 					  }
 					  else if (memberGroupHeader.isEmpty())
 					  {
-					    warn("Warning: member group has empty header "
-						 "at line %d of %s.\n",yyLineNr,yyFileName);
-					    memberGroupHeader="[No header specified!]";
+					    //warn("Warning: member group does not have a header "
+					    //	 "at line %d of %s.\n",yyLineNr,yyFileName);
+					    memberGroupHeader="[NOHEADER]";
+					    memberGroupId = newMemberGroupId();
+					    current->mGrpId = memberGroupId;
+					    lastMemberGroupLine = yyLineNr;
 					  }
 					  else
 					  {
@@ -2709,8 +2729,8 @@ DOCPARAM  ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
 <FindMembers>"//@}"|"/*@}*/"		{
 					  if (memberGroupId==NOGROUP)
 					  {
-					    warn("Warning: end of member group without matching begin "
-						 "at line %d of %s.\n",yyLineNr,yyFileName);
+					    warn(yyFileName,yyLineNr,
+                                                 "Warning: end of member group without matching begin.");
 					  }
 					  else
 					  {
@@ -3708,7 +3728,7 @@ DOCPARAM  ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
 <SkipString>.				{
   				          //addToBodyCond(yytext);
   					}
-<Bases,ClassName>";"			{ 
+<Bases,CompoundName>";"			{ 
 					  current->section = Entry::EMPTY_SEC ;
 					  current->type.resize(0) ;
 					  current->name.resize(0) ;
@@ -3716,7 +3736,7 @@ DOCPARAM  ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
 					  current->argList->clear();
 					  BEGIN( FindMembers ) ;
 					}
-<ClassName>{SCOPENAME}{BN}*/"<"		{
+<CompoundName>{SCOPENAME}{BN}*/"<"		{
   					  sharpCount = 0;
   					  current->name = yytext ;
 					  lineCount();
@@ -3739,7 +3759,7 @@ DOCPARAM  ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
 <ClassTemplSpec>.			{
   					  current->name += yytext;
 					}
-<ClassName>{SCOPENAME}			{ 
+<CompoundName>{SCOPENAME}			{ 
 					  current->name = yytext ;
 					  lineCount();
 					  BEGIN( ClassVar );
@@ -3790,7 +3810,7 @@ DOCPARAM  ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
 					  }
 					  BEGIN( FindMembers );
     					}
-<ClassName,ClassVar>{B}*"{"{B}*		{ current->fileName = yyFileName ;
+<CompoundName,ClassVar>{B}*"{"{B}*	{ current->fileName = yyFileName ;
 					  current->startLine = yyLineNr ;
 					  current->name = removeRedundantWhiteSpace(current->name);
 					  if (current->name.isEmpty() && !isTypedef) // anonymous compound
@@ -4014,7 +4034,7 @@ DOCPARAM  ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
 					  BEGIN( tmpDocType );
   					}
 <JavaDoc>"<"{TABLE}{ATTR}">"		{ 
-  					  current->doc+=yytext;
+  					  //current->doc+=yytext;
 					  int i;
 					  for (i=yyleng-1;i>=0;i--)
 					  {
@@ -4131,6 +4151,15 @@ DOCPARAM  ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
 					  current->startLine = yyLineNr;
  					  BEGIN( ExampleDocArg1 );
 					}
+<LineDoc>{CMD}"name"[^\n]*\n		{
+  					  memberGroupHeader=&yytext[5];
+					  memberGroupHeader=memberGroupHeader.stripWhiteSpace(); 
+					  current->section = Entry::MEMBERGRP_SEC;
+					  current->fileName = yyFileName;
+					  current->startLine = yyLineNr;
+					  yyLineNr++;  
+					  BEGIN( lastDocContext );
+  					}
 <Doc,JavaDoc>{CMD}"name"{B}+ 		{
   					  //printf("--> mgroup found!\n");
 					  current->section = Entry::MEMBERGRP_SEC;
@@ -4160,8 +4189,10 @@ DOCPARAM  ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
   					}
 <NameSpaceDocArg1>"\\"{B}*"\n"		{ yyLineNr++; }
 <NameSpaceDocArg1>"\n"			{
-  					  warn("Warning: missing argument after "
-					       "\\namespace at line %d of %s.\n",yyLineNr,yyFileName);
+  					  warn(yyFileName,yyLineNr,
+                                               "Warning: missing argument after "
+					       "\\namespace."
+                                              );
   					  yyLineNr++;
   					}
 <ClassDocArg1>{SCOPENAME}/"<"		{
@@ -4185,8 +4216,10 @@ DOCPARAM  ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
 					}
 <ClassDocArg1>"\\"{B}*"\n"		{ yyLineNr++; }
 <ClassDocArg1>"\n"			{
-  					  warn("Warning: missing argument after "
-					       "\\class at line %d of %s.\n",yyLineNr,yyFileName);
+  					  warn(yyFileName,yyLineNr,
+                                               "Warning: missing argument after "
+					       "\\class."
+                                              );
   					  yyLineNr++;
 					  
   					}
@@ -4198,8 +4231,10 @@ DOCPARAM  ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
   					}
 <GroupDocArg1>"\\"{B}*"\n"		{ yyLineNr++; }
 <GroupDocArg1>"\n"			{
-  					  warn("Warning: missing argument after "
-					       "\\defgroup at line %d of %s.\n",yyLineNr,yyFileName);
+  					  warn(yyFileName,yyLineNr,
+                                               "Warning: missing argument after "
+					       "\\defgroup."
+                                              );
 					  yyLineNr++;
 					  BEGIN( Doc );
   					}
@@ -4252,8 +4287,10 @@ DOCPARAM  ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
 					}
 <PageDocArg1>"\\"{B}*"\n"		{ yyLineNr++; }
 <PageDocArg1>"\n"			{
-  					  warn("Warning: missing argument after "
-					       "\\page at line %d of %s.\n",yyLineNr,yyFileName);
+  					  warn(yyFileName,yyLineNr,
+                                               "Warning: missing argument after "
+					       "\\page."
+                                              );
   					  yyLineNr++;
 					  BEGIN( Doc );
   					}
@@ -4272,8 +4309,9 @@ DOCPARAM  ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
   					}
 <EnumDocArg1>"\\"{B}*"\n"		{ yyLineNr++; }
 <EnumDocArg1>"\n"			{
-  					  warn("Warning: missing argument after "
-					       "\\enum at line %d of %s.\n",yyLineNr,yyFileName);
+  					  warn(yyFileName,yyLineNr,
+                                               "Warning: missing argument after \\enum."
+                                              );
   					  yyLineNr++;
 					  BEGIN( Doc );
   					}
@@ -4507,6 +4545,9 @@ DOCPARAM  ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
   					  lineCount();
   					  BEGIN( GroupName ); 
 					}
+<ClassDoc,LineDoc,Doc,JavaDoc>{CMD}"nosubgrouping"/[^a-z_A-Z0-9] {
+                                          current->subGrouping = FALSE; 
+                                        }
 <GroupName>{ID}				{
   					  current->groups->append(
 					    new QCString(yytext)
@@ -4696,9 +4737,10 @@ DOCPARAM  ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
   					}
 <ClassDocRelates,ClassDocFunc,ClassDocDefine,GroupDocArg1,ClassDocArg1,SectionTitle,EnumDocArg1,PageDocArg1,ExampleDocArg1,ClassDefineArgs,GroupName>"*/" {
 					  current->doc += "\n\n";
-					  err("Warning: unexpected end of "
-				              "documentation block found in "
-					      "file %s at line %d\n",yyFileName,yyLineNr);
+					  warn(yyFileName,yyLineNr,
+                                              "Warning: unexpected end of "
+				              "documentation block."
+					      );
 					  BEGIN( lastDocContext );
 					}
 <FileDocArg1>"*/"			{
@@ -4905,27 +4947,13 @@ void parseDocument(OutputList &ol,const QCString &docString)
   if (inBlock()) endBlock();
   if (currentListIndentLevel>0)
   {
-    if (!refName.isEmpty())
-    {
-      warn("Warning: Documentation block of %s ended in the middle " 
-	   "of a list (indent level %d)!\n",refName.data(),
-	   currentListIndentLevel);
-    }
-    else if (!exampleName.isEmpty())
-    {
-      warn("Warning: Documentation block of %s ended in the middle " 
-	   "of a list (indent level %d)!\n",exampleName.data(),
-	   currentListIndentLevel);
-    }
-    else
-    {
-      warn("Warning: Documentation block ended in the middle " 
-	   "of a list (indent level %d)!\n",currentListIndentLevel);
-    }
+    warn(yyFileName,yyLineNr,"Warning: Documentation ended in the middle " 
+	   "of a list (indent level %d)!",currentListIndentLevel);
   }
   if (depthIf!=0)
   {
-    warn("Warning: Documentation block contains \\if without matching \\endif: %d\n",depthIf);
+    warn(yyFileName,yyLineNr,"Warning: Documentation block contains \\if "
+         "without matching \\endif: nesting level is %d",depthIf);
   }
   if (!tableStack.isEmpty())
   {
@@ -4933,7 +4961,9 @@ void parseDocument(OutputList &ol,const QCString &docString)
   }
   if (insideVerbatim)
   {
-    warn("Warning: file ended inside a \\verbatim block!\n");
+    warn(yyFileName,yyLineNr,
+         "Warning: file ended inside a \\verbatim block!"
+        );
   }
   ol+=*outDoc;
   delete outDoc; outDoc=0;
@@ -4942,27 +4972,17 @@ void parseDocument(OutputList &ol,const QCString &docString)
 
 //----------------------------------------------------------------------------
 
-void parseDoc(OutputList &ol,const char *clName,
-              const char *memName,const QCString &docString)
+void parseDoc(OutputList &ol,const char *fileName,int startLine,
+              const char *clName,const char *memName,const QCString &docString)
 {
-  //printf("Doc---------\n%s\n---------\n",docString.data());
+  //printf("parseDoc(file=`%s',line=%d)\n",fileName,startLine);
   initParser();
   initParseCodeContext();
   exampleDoc=FALSE;           // do not cross reference with member docs
   className=clName;
   memberName=memName;
-  if (memName)
-  {
-    refName=className+"::"+memberName;
-  }
-  else if (clName)
-  {
-    refName=className;
-  }
-  else
-  {
-    refName="<unknown>";
-  }
+  strcpy(yyFileName,fileName);
+  yyLineNr = startLine;
   parseDocument(ol,docString);
 
 }
@@ -4992,7 +5012,7 @@ void parseExample(OutputList &ol,const QCString &docString,
   initParseCodeContext();
   exampleDoc=TRUE;            // cross reference with member docs
   exampleName=fileName;
-  refName="example "+exampleName;
+  strcpy(yyFileName,fileName);
   parseDocument(ol,docString); 
 }
 
diff --git a/src/tag.l b/src/tag.l
index 6215605..7b37851 100644
--- a/src/tag.l
+++ b/src/tag.l
@@ -54,7 +54,7 @@ static void addClass(const char *name,const char *fileName)
   //printf("adding class %s\n",name);
   if (name!=0 && strlen(name)>0 && classDict[name]==0)
   {
-    cd = new ClassDef(name,ClassDef::Class,tagName,fileName);
+    cd = new ClassDef(fileName,1,name,ClassDef::Class,tagName,fileName);
     fd = 0;
     nd = 0;
     classList.inSort(cd);
@@ -92,7 +92,7 @@ static void addNamespace(const char *name)
     // since namespace are open, this need not to be the case. As a result
     // namespace may contain members that are located in 
     // different namespaces!
-    nd = new NamespaceDef(name,tagName);
+    nd = new NamespaceDef("<tagfile>",1,name,tagName);
     namespaceList.inSort(nd);
     namespaceDict.insert(name,nd);
   }
@@ -110,7 +110,8 @@ static void addMember(const char *name,const char *anchor,const char *args)
     MemberDef *md;
     ArgumentList *argList = new ArgumentList;
     stringToArgumentList(args,argList);
-    md=new MemberDef(0,name,args,0,Public,Normal,FALSE,FALSE,
+    md=new MemberDef("<tagfile>",1,
+                       0,name,args,0,Public,Normal,FALSE,FALSE,
                        MemberDef::Function,0,argList); 
     delete argList;
     md->setAnchor(anchor);
diff --git a/src/translator.h b/src/translator.h
index 8f4e03c..89ef47b 100644
--- a/src/translator.h
+++ b/src/translator.h
@@ -793,7 +793,7 @@ class Translator
     /*! Text shown before a multi-line variable/enum initialization */
     virtual QCString trInitialValue()
     {
-      return "Initial value:";
+      return "Initializer:";
     }
     /*! Text used the source code in the file index */
     virtual QCString trCode()
diff --git a/src/util.cpp b/src/util.cpp
index f20f8ab..275b754 100644
--- a/src/util.cpp
+++ b/src/util.cpp
@@ -221,7 +221,7 @@ ClassDef *getResolvedClass(const char *name)
     }
     if (count==10)
     {
-      warn("Warning: possible recursive typedef dependency detected for %s!\n",name);
+      warn_cont("Warning: possible recursive typedef dependency detected for %s!\n",name);
       return classDict[name];
     }
     else
@@ -734,7 +734,7 @@ QCString fileToString(const char *name)
     QFileInfo fi(name);
     if (!fi.exists() || !fi.isFile())
     {
-      warn("Error: file `%s' not found\n",name);
+      err("Error: file `%s' not found\n",name);
       return "";
     }
     f.setName(name);
@@ -742,7 +742,7 @@ QCString fileToString(const char *name)
   }
   if (!fileOpened)  
   {
-    warn("Error: cannot open file `%s' for reading\n",name);
+    err("Error: cannot open file `%s' for reading\n",name);
     return "";
   }
   int fsize=f.size();
@@ -2086,8 +2086,9 @@ FileDef *findFileDef(const FileNameDict *fnDict,const char *n,bool &ambig)
 
 //----------------------------------------------------------------------
 
-void showFileDefMatches(const FileNameDict *fnDict,const char *n)
+QCString showFileDefMatches(const FileNameDict *fnDict,const char *n)
 {
+  QCString result;
   QCString name=n;
   QCString path;
   int slashPos=QMAX(name.findRev('/'),name.findRev('\\'));
@@ -2104,11 +2105,12 @@ void showFileDefMatches(const FileNameDict *fnDict,const char *n)
     {
       if (path.isEmpty() || fd->getPath().right(path.length())==path)
       {
-        msg("   %s\n",fd->absFilePath().data());
+        result+="   %s\n",fd->absFilePath().data();
       }
       fd=fn->next();
     }
   }
+  return result;
 }
 
 //----------------------------------------------------------------------
@@ -2281,11 +2283,15 @@ QCString insertTemplateSpecifierInScope(const QCString &scope,const QCString &te
   if (!templ.isEmpty() && scope.find('<')==-1)
   {
     int si,pi=0;
-    while ((si=scope.find("::",pi))!=-1 && !getClass(scope.left(si)+templ)
-      && !getClass(scope.left(si))) 
-       { //printf("Tried `%s'\n",(scope.left(si)+templ).data()); 
-         pi=si+2; 
-       }
+    ClassDef *cd=0;
+    while (
+            (si=scope.find("::",pi))!=-1 && !getClass(scope.left(si)+templ) && 
+            ((cd=getClass(scope.left(si)))==0 || cd->templateArguments()==0) 
+          ) 
+    { 
+      //printf("Tried `%s'\n",(scope.left(si)+templ).data()); 
+      pi=si+2; 
+    }
     if (si==-1) // not nested => append template specifier
     {
       result+=templ; 
diff --git a/src/util.h b/src/util.h
index 316963b..597459b 100644
--- a/src/util.h
+++ b/src/util.h
@@ -65,7 +65,7 @@ extern ClassDef *getClass(const char *key);
 extern ClassDef *getResolvedClass(const char *key);
 extern FileDef *findFileDef(const FileNameDict *fnDict,const char *n,
                 bool &ambig);
-extern void showFileDefMatches(const FileNameDict *fnDict,const char *n);
+extern QCString showFileDefMatches(const FileNameDict *fnDict,const char *n);
 extern int guessSection(const char *name);
 extern bool isId(char c);
 extern QCString removeRedundantWhiteSpace(const QCString &s);
-- 
cgit v0.12