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

-------------------------------------------------------------

This project bundles the following dependencies under
the Apache Software License 2.0

  - org.apache.lucene : lucene-core version 5.5.0
  - org.apache.lucene : lucene-analyzers-common version 5.5.0
  - org.apache.lucene : lucene-backward-codecs version 5.5.0
  - org.apache.lucene : lucene-grouping version 5.5.0
  - org.apache.lucene : lucene-highlighter version 5.5.0
  - org.apache.lucene : lucene-join version 5.5.0
  - org.apache.lucene : lucene-memory version 5.5.0
  - org.apache.lucene : lucene-misc version 5.5.0
  - org.apache.lucene : lucene-queries version 5.5.0
  - org.apache.lucene : lucene-queryparser version 5.5.0
  - org.apache.lucene : lucene-sandbox version 5.5.0
  - org.apache.lucene : lucene-spatial version 5.5.0
  - org.apache.lucene : lucene-spatial-extras version 5.5.0
  - org.apache.lucene : lucene-spatial3d version 5.5.0
  - org.apache.lucene : lucene-suggest version 5.5.0
  - com.carrotsearch : hppc version 0.7.1
  - com.google.guava : guava version 18.0
  - com.google.code.findbugs : jsr305 version 1.3.9
  - com.ning : compress-lzf version 1.0.2
  - com.spatial4j : spatial4j version 0.5
  - com.twitter : chill-java version 0.7.4
  - com.fasterxml.jackson.core : jackson-core version 2.6.6
  - com.fasterxml.jackson.dataformat : jackson-dataformat-smile version 2.6.6
  - com.fasterxml.jackson.dataformat : jackson-dataformat-yaml version 2.6.6
  - com.fasterxml.jackson.dataformat : jackson-dataformat-cbor version 2.6.6
  - com.tdunning : t-digest version 3.0
  - io.netty : netty version 3.10.5.Final
  - joda-time : joda-time version 2.5

===================================
       Notice for Yaml
===================================

This project bundles yaml (v. 1.15) under the Creative Commons License (CC-BY 2.0).

Original project website: http://www.yaml.de

Copyright (c) 2005-2013, Dirk Jesse

YAML under Creative Commons License (CC-BY 2.0)
===============================================

The YAML framework is published under the Creative Commons Attribution 2.0 License (CC-BY 2.0), which permits
both private and commercial use (http://creativecommons.org/licenses/by/2.0/).

Condition: For the free use of the YAML framework, a backlink to the YAML homepage (http://www.yaml.de) in a
suitable place (e.g.: footer of the website or in the imprint) is required.

===================================
       Notice for Tartarus
===================================

This project bundles tartarus under the MIT License.

Original source repository: https://github.com/sergiooramas/tartarus

Copyright (c) 2017 Sergio Oramas and Oriol Nieto

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

===================================
       Notice for HdrHistogram
===================================

This project bundles HdrHistogram (v. 2.1.9) under the BSD 2-Clause License

Original source repository: https://github.com/HdrHistogram/HdrHistogram

The code in this repository code was Written by Gil Tene, Michael Barker,
and Matt Warren, and released to the public domain, as explained at
http://creativecommons.org/publicdomain/zero/1.0/

For users of this code who wish to consume it under the "BSD" license
rather than under the public domain or CC0 contribution text mentioned
above, the code found under this directory is *also* provided under the
following license (commonly referred to as the BSD 2-Clause License). This
license does not detract from the above stated release of the code into
the public domain, and simply represents an additional license granted by
the Author.

-----------------------------------------------------------------------------
** Beginning of "BSD 2-Clause License" text. **

 Copyright (c) 2012, 2013, 2014, 2015, 2016 Gil Tene
 Copyright (c) 2014 Michael Barker
 Copyright (c) 2014 Matt Warren
 All rights reserved.

 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions are met:

 1. Redistributions of source code must retain the above copyright notice,
    this list of conditions and the following disclaimer.

 2. Redistributions in binary form must reproduce the above copyright notice,
    this list of conditions and the following disclaimer in the documentation
    and/or other materials provided with the distribution.

 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
 THE POSSIBILITY OF SUCH DAMAGE.
