################################################################################
#
#    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.
#
################################################################################

welcome = \
\u001B[36m ____                  _          __  __ _      \u001B[0m\n\
\u001B[36m/ ___|  ___ _ ____   _(_) ___ ___|  \\/  (_)_  __\u001B[0m\n\
\u001B[36m\\___ \\ / _ \\ '__\\ \\ / / |/ __/ _ \\ |\\/| | \\ \\/ /\u001B[0m\n\
\u001B[36m ___) |  __/ |   \\ V /| | (_|  __/ |  | | |>  < \u001B[0m\n\
\u001B[36m|____/ \\___|_|    \\_/ |_|\\___\\___|_|  |_|_/_/\\_\\\u001B[0m\n\
\n\
\u001B[1m  Apache ServiceMix\u001B[0m (${pom.version})\n\
\n\
Hit '\u001B[1m<tab>\u001B[0m' for a list of available commands\n\
   and '\u001B[1m[cmd] --help\u001B[0m' for help on a specific command.\n\
Hit '<ctrl-d>' or 'osgi:shutdown' to shutdown ServiceMix.\n

