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-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 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/).
