   =========================================================================
   ==      NOTICE file for use with the Apache License, Version 2.0,      ==
   =========================================================================

   Apache James JSieve Library
   Copyright 2008 The Apache Software Foundation

   This product includes software developed at
   The Apache Software Foundation (http://www.apache.org/).

   This product may include software developed at
   aQute / Peter Kriens (http://www.aqute.biz/)
   Package in stage\biz.aQute\jars\bnd-0.0.249.jar
   License in stage\biz.aQute\jars\bnd-0.0.249.LICENSE
   
   This product may include/use software, JUnit (http://www.junit.org/),
   developed by Kent Beck, Erich Gamma, and David Saff
   License: Common Public License Version 1.0
   (http://www.opensource.org/licenses/cpl.php)
   