 Licensed to the Apache Software Foundation (ASF) under one or more
 contributor license agreements.  See the NOTICE file distributed with
 this work for additional information regarding copyright ownership.
 The ASF licenses this file to You under the Apache License, Version 2.0
 (the "License"); you may not use this file except in compliance with
 the License.  You may obtain a copy of the License at
	
     http://www.apache.org/licenses/LICENSE-2.0

 Unless required by applicable law or agreed to in writing, software
 distributed under the License is distributed on an "AS IS" BASIS,
 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.

 Files having a separate license should be ignored.
 For Celix these include
   - Mongoose
   - Civetweb
   - Unzip and MiniZip files
   - Doxygen scripts for CMake (Doxyfile.in, UseDoxygen.cmake)
   - memstream
 
 Also there are several files which can't have a license statement.
   - *.in Input files used by CMake to generate files for deployment,
          should not contain comments.
  - .project Eclipse project file, not in the release but generated by CMake.
             Excluded to prevent false positives when using RAT on a dev tree.
  - Template files for code generation. 
   
 Todo: Why doesn't RAT exclude these files when using a full path?

cmake/config.properties.in
cmake/run.sh.in
cmake/RunConfig.in

Doxyfile.in

 Workaround to exclude .in files.
(.*).in

build/*

.project
   
md5.inl


MiniZip64_info.txt

unzip.c
unzip.h
miniunz.c
ioapi.c
ioapi.h
iowin32.c
iowin32.h

UseDoxygen.cmake
CodeCoverage.cmake

manifest_sections.txt
manifest.txt

fmemopen.c
fmemopen.h
open_memstream.c
open_memstream.h

 Documentation files
(.)*.md

.travis.yml

(.)*\.descriptor

scope.*\.json


 MIT - C Thread Pool
thpool.c
thpool.h
