   =========================================================================
   ==      NOTICE file for use with the Apache License, Version 2.0,      ==
   =========================================================================
   
   Apache JAMES Mime4j
   Copyright 2004-2010 The Apache Software Foundation
   
   This product includes software developed at
   The Apache Software Foundation (http://www.apache.org/).

   This product test suite includes data (mimetools-testmsgs folder) developed 
   by Eryq and ZeeGee Software Inc as part of the "MIME-tools" Perl5 toolkit
   and licensed under the Artistic License
