Apache Wicket
Copyright 2006-2019 The Apache Software Foundation

This product includes software developed at
The Apache Software Foundation (http://www.apache.org/).

This is an aggregated NOTICE file for the Apache Wicket projects included
in this distribution.

NB: DO NOT ADD LICENSES/NOTICES/ATTRIBUTIONS TO THIS FILE, BUT IN THE
    NOTICE FILE OF THE CORRESPONDING PROJECT. THE RELEASE PROCEDURE WILL
    AUTOMATICALLY INCLUDE THE NOTICE IN THIS FILE.

---------------------------------------------------------------------------
src/./wicket-core
---------------------------------------------------------------------------
   Apache Wicket
   Copyright 2006-2016 Apache Software Foundation

   This product includes software developed at
   The Apache Software Foundation (http://www.apache.org/).

   This product includes software from QOS.ch (http://slf4j.org) licensed under the X11 license
   Copyright (c) 2004-2008 QOS.ch
   
   Contains Diff library from Mavens JRCS, released under
   The Apache Software License, Version 1.1.
   (c) 1999-2003

   org.apache.wicket.markup.html.form.upload.MultiFileUploadField.js is taken from [1]
   and has the following notice:
      "Licence:
       Use this however/wherever you like, just don't blame me if it breaks
       anything.

       Credit:
       If you're nice, you'll leave this bit:

       Class by Stickman -- http://www.the-stickman.com
       with thanks to:
       [for Safari fixes]
          Luis Torrefranca -- http://www.law.pitt.edu
          and
          Shawn Parker & John Pennypacker -- http://www.fuzzycoconut.com
       [for duplicate name bug]
          'neal'"
   [1]: http://the-stickman.com/web-development/javascript/upload-multiple-files-with-a-single-file-element/

---------------------------------------------------------------------------
src/./wicket-datetime
---------------------------------------------------------------------------
   Apache Wicket Date Time
   Copyright 2006-2016 Apache Software Foundation

   This product includes software developed at
   The Apache Software Foundation (http://www.apache.org/).
   
   Contains code of the Yahoo User Interface library (version: 2.8.2r1),
   released under the BSD License:
   http://developer.yahoo.net/yui/license.txt
   Copyright (c) 2010, Yahoo! Inc.

   This product includes software developed by
   Joda.org (http://www.joda.org/).
   
---------------------------------------------------------------------------
src/./wicket-examples
---------------------------------------------------------------------------
   Apache Wicket Examples
   Copyright 2006-2016 Apache Software Foundation

   This product includes software developed at
   The Apache Software Foundation (http://www.apache.org/).
   
   Contains Script.aculo.us javascript library released under a MIT license.
   Copyright (c) 2005 Thomas Fuchs
   
   Contains prototype.js javascript library released under a MIT style license.
   (c) 2005 Sam Stephenson
   
   Contains behaviour.js javascript library released under BSD license.
   Behaviour v1.1 by Ben Nolan, June 2005. Based largely on the work
   of Simon Willison
   
   com.meterware.httpunit.ParsedHTML is taken from HttpUnit, released
   under a MIT style license.
   Copyright (c) 2000-2004, Russell Gold
   
   Contains software developed by the Dojo foundation.
   The dojo javascript is dual licensed under the AFL and BSD license.
   Included in this software under the BSD license.
   Copyright (c) 2004-2005, The Dojo Foundation

   This product includes software developed by the Spring Framework Project
   (http://www.springframework.org).

   This product includes software developed by the CGLib Project
   (http://cglib.sourceforge.net).

   This product includes ASM, released under a BSD style license (http://asm.objectweb.org).
   Copyright (c) 2000-2005 INRIA, France Telecom

   This product includes software developed by
   Joda.org (http://www.joda.org/).

   This product includes jhighlight (https://jhighlight.dev.java.net/)
   which is released under CDDL 1.0 license (http://www.opensource.org/licenses/cddl1.php).

   Contains jquery.js javascript library released under a MIT style license.
   jQuery Foundation, Inc, http://jquery.org/license

   Contains qunit.js javascript library released under a MIT style license.
   jQuery Foundation, Inc, http://jquery.org/license

   Contains qunit.css released under a MIT style license.
   jQuery Foundation, Inc, http://jquery.org/license
---------------------------------------------------------------------------
src/./wicket-experimental/wicket-metrics
---------------------------------------------------------------------------
   Apache Wicket Metrics
   Copyright 2006-2016 Apache Software Foundation

   This product includes software developed at
   The Apache Software Foundation (http://www.apache.org/).
   
   This product uses AspectJ, developed at Eclipse, and licensed
   under the Eclipse Public License. (https://eclipse.org/aspectj/).
   
---------------------------------------------------------------------------
src/./wicket-guice
---------------------------------------------------------------------------
   Apache Wicket
   Copyright 2006-2016 Apache Software Foundation

   This product includes software developed at
   The Apache Software Foundation (http://www.apache.org/).

   This product includes Guice, developed at Google, and licensed
   under the Apache License 2.0. (http://code.google.com/p/google-guice/).
