Apache Felix Logback
Copyright 2018 The Apache Software Foundation

This software was developed at the Apache Software Foundation
(http://www.apache.org) and may have dependencies on other
Apache software licensed under Apache License 2.0.

I. Included Third-Party Software

This product includes software developed at
The Apache Software Foundation (http://www.apache.org/).
Licensed under the Apache License 2.0.

II. Used Third-Party Software

This product used software developed at The Logback
Project (https://logback.qos.ch/). Licensed under the
Eclipse Public License 1.0.

III. Overall License Summary
- Apache License 2.0
- Eclipse Public License 1.0