/*
 * 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.
 */

@font-face {
    font-family: 'canaroblack';
    src: url('rene_bieder_-_canaro_black-webfont.eot');
    src: url('rene_bieder_-_canaro_black-webfont.eot?#iefix') format('embedded-opentype'),
         url('rene_bieder_-_canaro_black-webfont.woff') format('woff'),
         url('rene_bieder_-_canaro_black-webfont.ttf') format('truetype'),
         url('rene_bieder_-_canaro_black-webfont.svg#canaroblack') format('svg');
    font-weight: normal;
    font-style: normal;

}

@font-face {
    font-family: 'canaro_bookbold';
    src: url('rene_bieder_-_canaro_bold-webfont.eot');
    src: url('rene_bieder_-_canaro_bold-webfont.eot?#iefix') format('embedded-opentype'),
         url('rene_bieder_-_canaro_bold-webfont.woff') format('woff'),
         url('rene_bieder_-_canaro_bold-webfont.ttf') format('truetype'),
         url('rene_bieder_-_canaro_bold-webfont.svg#canaro_bookbold') format('svg');
    font-weight: normal;
    font-style: normal;
}

@font-face {
    font-family: 'canarobook';
    src: url('rene_bieder_-_canaro_book-webfont.eot');
    src: url('rene_bieder_-_canaro_book-webfont.eot?#iefix') format('embedded-opentype'),
         url('rene_bieder_-_canaro_book-webfont.woff') format('woff'),
         url('rene_bieder_-_canaro_book-webfont.ttf') format('truetype'),
         url('rene_bieder_-_canaro_book-webfont.svg#canarobook') format('svg');
    font-weight: normal;
    font-style: normal;
}

@font-face {
    font-family: 'canaroextralight';
    src: url('rene_bieder_-_canaro_extralight-webfont.eot');
    src: url('rene_bieder_-_canaro_extralight-webfont.eot?#iefix') format('embedded-opentype'),
         url('rene_bieder_-_canaro_extralight-webfont.woff') format('woff'),
         url('rene_bieder_-_canaro_extralight-webfont.ttf') format('truetype'),
         url('rene_bieder_-_canaro_extralight-webfont.svg#canaroextralight') format('svg');
    font-weight: normal;
    font-style: normal;
}

@font-face {
    font-family: 'canaromedium';
    src: url('rene_bieder_-_canaro_medium-webfont.eot');
    src: url('rene_bieder_-_canaro_medium-webfont.eot?#iefix') format('embedded-opentype'),
         url('rene_bieder_-_canaro_medium-webfont.woff') format('woff'),
         url('rene_bieder_-_canaro_medium-webfont.ttf') format('truetype'),
         url('rene_bieder_-_canaro_medium-webfont.svg#canaromedium') format('svg');
    font-weight: normal;
    font-style: normal;
}

@font-face {
    font-family: 'stag_sanslight';
    src: url('stagsans-light-webfont.eot');
    src: url('stagsans-light-webfont.eot?#iefix') format('embedded-opentype'),
         url('stagsans-light-webfont.woff') format('woff'),
         url('stagsans-light-webfont.ttf') format('truetype'),
         url('stagsans-light-webfont.svg#stag_sanslight') format('svg');
    font-weight: normal;
    font-style: normal;
}
