# 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.
#
# Documentation - These files are never code.
README(\..*)?$, Docs
NOTICE$, Docs
VERSION$, Docs
BUILD$, Docs
DISCLAIMER, Docs
CHANGELOG$, Docs
\.md$, Docs
\.txt$, Docs
\.placeholder$, Empty

# Uncommentable files
#
# These files cannot contain comments, so no header can be added.
# They are nevertheless covered by the Apache license.
^go\.sum$, Apache-2.0
^vendor/modules\.txt$, Apache-2.0
\.project$, Apache-2.0
\.cfg$, Apache-2.0
\.json$, Apache-2.0
\.webmanifest, Apache-2.0
\.csv$, Apache-2.0
\.conf$, Apache-2.0
\.config(\.example)?$, Apache-2.0
\.traffic_ops$, Apache-2.0 # JSON with a specific format.
\.dist$, Apache-2.0 # JSON with a specific format.
traffic_monitor_config\.js$, Apache-2.0 # Actually JSON with a specific format.
CrStates$, Apache-2.0 # JSON with a specific format.
^docs/.*\.(png|jpe?g|ico|gif)$, Apache-2.0
^blueprints/.*\.(png|jpe?g|ico|gif)$, Apache-2.0
favicon.(ico|png)$, Apache-2.0
traffic_ops/app/db/trafficvault/test/.*\.key$, Apache-2.0 # test AES key files
traffic_ops/app/db/trafficvault/test/data/.*\.dat$, Apache-2.0 # test data files
^traffic_ops/experimental/goto/testFiles/, Apache-2.0
\.pem$, Apache-2.0 # Single certificate file.
traffic_router/core/src/test/resources/api/.*/cdns/name/thecdn/sslkeys(-missing-1)?, Apache-2.0 #JSON files with no extension
traffic_router/core/src/test/resources/api/.*/steering*, Apache-2.0
traffic_router/core/src/test/resources/api/.*/federations/all, Apache-2.0
BUILD_NUMBER$, Apache-2.0
\.jks, Apache-2.0 # Java Key Store

# Images, created for this project or used under an Apache license.
^misc/logos/ATC-PNG\.png, Apache-2.0
^misc/logos/ATC-PNG-FULL-BLACK\.png, Apache-2.0
^misc/logos/ATC-PNG-FULL-BLACK-LARGE\.png, Apache-2.0
^misc/logos/ATC-PNG-FULL-WHITE\.png, Apache-2.0
^misc/logos/ATC-PNG-FULL-WHITE-LARGE\.png, Apache-2.0
^misc/logos/ATC-PNG-LARGE\.png, Apache-2.0
^misc/logos/ATC-SVG\.sketch, Apache-2.0
^misc/logos/ATC-SVG-FULL\.sketch, Apache-2.0
^misc/logos/page_logos/trafficLogoFactory\.psd, Apache-2.0
^misc/logos/page_logos/traffic_monitor_logo\.png, Apache-2.0
^misc/logos/page_logos/traffic_operations_logo\.png, Apache-2.0
^misc/logos/page_logos/traffic_portal\.png, Apache-2.0
^misc/logos/page_logos/traffic_router_logo\.png, Apache-2.0
^misc/logos/page_logos/traffic_stats_logo\.png, Apache-2.0
^misc/logos/page_logos/traffic_stats_logo_red\.png, Apache-2.0

# Demo certificates
ssl\.(crt|key)$, Apache-2.0
/keystore, Apache-2.0

# Uncommentable files
#
# These files cannot contain comments, but are covered by separate
# licenses. These licenses must be documented in the root LICENSE file.
Inconsolata\.ttf$, SIL OFL 1.1
Inconsolata-Bold\.ttf$, SIL OFL 1.1
[Ff]ont[Aa]wesome[^\.]*\.([ot]tf|eot|woff2?)$, SIL OFL 1.1
Lato-Bold\.ttf$, SIL OFL 1.1
Lato-Regular\.ttf$, SIL OFL 1.1
ssl-bundle\.crt$, MPL
^traffic_portal/app/src/assets/images/sort_, MIT

# Code dependencies
#
# These files could bear headers, but are part of dependent code and
# so we present them for the most part unmodified. These licenses must
# be documented in the root LICENSE file.
[Ff]ont[Aa]wesome[^\.]*\.css, MIT
select2.css, Apache-2.0
select2.css, GPL/LGPL
j[Mm]enu.*\.(css|js), MIT
sphinx_rtd_theme/.*\.(html|css|css\.map|js|py)$, MIT
bootstrap(-theme)?\.css\.map, MIT
datatables\.min, MIT
GeoLite2-City.mmdb.gz, CC-A-SA
jquery\.tree\.min\.css$, MIT
jquery\.dataTables\..*\.(css|js)$, MIT
github\.com/basho/backoff/.*, MIT
github\.com/dchest/siphash/.*, CC0
github\.com/kylelemons/godebug.*, Apache-2.0
github\.com/pkg/errors\..*, BSD
traffic_portal/app/src/assets/js/chartjs/angular-chart\..*, BSD
traffic_portal/app/src/assets/css/jsonformatter\..*, Apache-2.0
traffic_portal/app/src/assets/js/jsonformatter\..*, Apache-2.0
traffic_portal/app/src/assets/js/fast-json-patch.*, MIT
traffic_portal/app/src/assets/css/angular-ui-tree\..*, MIT
traffic_portal/app/src/assets/js/angular-ui-tree\..*, MIT
traffic_portal/app/src/assets/css/colReorder.dataTables\..*, MIT
traffic_portal/app/src/assets/js/colReorder.dataTables\..*, MIT
traffic_portal/app/src/assets/js/dataTables.buttons\..*, MIT
traffic_portal/app/src/assets/js/buttons.html5\..*, MIT

# Ignored - Do not report.
\.DS_Store, Ignore # Created automatically OSX.

# This file is created dynamically by the testing script itself, it is
# not distributed, but if it were, it would be Apache, and the source
# would be right with it.
^infrastructure/test/license/license, Apache-2.0

# Don't object to licenses in the license file itself.
^LICENSE$, !GoBSD
^LICENSE$, !MIT
^LICENSE$, !BSD
^LICENSE$, !X11
^LICENSE$, !ISC

# ... or in the documentation about the licenses.
^infrastructure/test/license/README.md$, !BSD
^infrastructure/test/license/README.md$, !GPL/LGPL
^infrastructure/test/license/README.md$, !MIT
^infrastructure/test/license/README.md$, !WTFPL
^infrastructure/test/license/README.md$, !X11

# License files are licensed under their own terms, don't attempt to detect them.
^licenses/.*, Ignore

# False positives
licenseList\.go$, !GoBSD
licenseList\.go$, !MIT
licenseList\.go$, !BSD
licenseList\.go$, !X11
^traffic_ops/app/t_integration/extensions\.t$, !X11
GeoLite2-City.mmdb.gz, !MIT

# Files generated by tools that are checked into the repo, covered by the
# Apache-2.0 license.
.*\/pnpm-lock\.yaml$, Apache-2.0

# Google fonts, distributed under the Apache-2.0 license
/Roboto\.ttf$, Apache-2.0
/Roboto\.\d+\.ttf$, Apache-2.0
/MaterialIcons.ttf$, Apache-2.0

# Files that have content generated - not written - by code already covered
# under its own licenses terms.
^\.env$, Apache-2.0
