# ============LICENSE_START==========================================
# ONAP : APPC
# ===================================================================
# Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
# ===================================================================
#
# Unless otherwise specified, all software contained herein is licensed
# under the Apache License, Version 2.0 (the License);
# you may not use this software 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.
#
# ECOMP is a trademark and service mark of AT&T Intellectual Property.
# ============LICENSE_END============================================
# Target dirs in all projects
**/target/*
**/target-ide/*

# Added for Intellij IDEA IDE
**/.idea/*
*.iml
**/*.iml
/.idea/

# Used to not upload Blackduck Scans
**/appc_bdio.jsonld
**/blackDuckHubProjectName.txt
**/blackDuckHubProjectVersionName.txt

# Generated models and features
**/bin/*

# Checkstyle files
**/.checkstyle


# MANIFEST.MF is updated on every clean install
**/src/main/resources/META-INF/

# Karaf Assembly
#/appc-adapters/appc-*-adapter/appc-*-adapter-installer/src/assembly/*

# Used to not upload any maven dependency graph outputs
**/deptree.text

.project

*.prefs
.classpath
**/.classpath
/target/
logs/
debug-logs/
**/.settings/*
**/*.iml
/.idea/
/bin/
