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

http://commons.wikimedia.org/wiki/File:Go-previous.svg

This work has been released into the public domain by its author, The Tango! Desktop Project (Contributors; FAQ). This applies worldwide.
In some countries this may not be legally possible; if so:
The Tango! Desktop Project (Contributors; FAQ) grants anyone the right to use this work for any purpose, without any conditions, unless such conditions are required by law.

=====

http://commons.wikimedia.org/wiki/File:Go-next.svg

This work has been released into the public domain by its author, The Tango! Desktop Project (Contributors; FAQ). This applies worldwide.
In some countries this may not be legally possible; if so:
The Tango! Desktop Project (Contributors; FAQ) grants anyone the right to use this work for any purpose, without any conditions, unless such conditions are required by law.