Compare commits
No commits in common. "coverity_scan" and "gh-pages" have entirely different histories.
coverity_s
...
gh-pages
14
.gitignore
vendored
@ -1,14 +0,0 @@
|
||||
*.o
|
||||
*.a
|
||||
*.so
|
||||
*.so.*
|
||||
*.swp
|
||||
.deps
|
||||
Makefile.in
|
||||
Makefile
|
||||
/autom4te.cache
|
||||
/cscope.*
|
||||
/build-aux/
|
||||
/aclocal.m4
|
||||
/configure
|
||||
/config.*
|
33
.travis.yml
@ -1,33 +0,0 @@
|
||||
script: ./autogen.sh && ./configure && make
|
||||
|
||||
env:
|
||||
global:
|
||||
# COVERITY_SCAN_TOKEN
|
||||
# ** specific to your project **
|
||||
secure: "UwSy57y9-USTD6w65Ubvyg"
|
||||
|
||||
addons:
|
||||
coverity_scan:
|
||||
|
||||
# GitHub project metadata
|
||||
# ** specific to your project **
|
||||
project:
|
||||
name: tgraf/bmon
|
||||
version: 3.7
|
||||
description: bandwidth monitor
|
||||
|
||||
# Where email notification of build analysis results will be sent
|
||||
notification_email: tgraf@suug.ch
|
||||
|
||||
# Commands to prepare for build_command
|
||||
# ** likely specific to your build **
|
||||
build_command_prepend: ./autogen.sh && ./configure
|
||||
|
||||
# The command that will be added as an argument to "cov-build" to compile your project for analysis,
|
||||
# ** likely specific to your build **
|
||||
build_command: make
|
||||
|
||||
# Pattern to match selecting branches that will run analysis. We recommend leaving this set to 'coverity_scan'.
|
||||
# Take care in resource usage, and consider the build frequency allowances per
|
||||
# https://scan.coverity.com/faq#frequency
|
||||
branch_pattern: coverity_scan
|
@ -1,9 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
FLAGS="-Werror"
|
||||
|
||||
if [ $CC = "clang" ]; then
|
||||
FLAGS="$FLAGS -Wno-error=unused-command-line-argument"
|
||||
fi
|
||||
|
||||
./autogen.sh && ./configure && make CFLAGS="$FLAGS" && make distcheck
|
20
LICENSE.BSD
@ -1,20 +0,0 @@
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
|
||||
1. Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
2. Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
19
LICENSE.MIT
@ -1,19 +0,0 @@
|
||||
Permission is hereby granted, free of charge, to any person
|
||||
obtaining a copy of this software and associated documentation files
|
||||
(the "Software"), to deal in the Software without restriction,
|
||||
including without limitation the rights to use, copy, modify, merge,
|
||||
publish, distribute, sublicense, and/or sell copies of the Software,
|
||||
and to permit persons to whom the Software is furnished to do so,
|
||||
subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
@ -1,7 +0,0 @@
|
||||
# -*- Makefile -*-
|
||||
|
||||
ACLOCAL_AMFLAGS = -I m4
|
||||
|
||||
SUBDIRS = src man include examples
|
||||
|
||||
EXTRA_DIST = ChangeLog LICENSE.BSD LICENSE.MIT NEWS README.md
|
35
NEWS
@ -1,35 +0,0 @@
|
||||
v3.8 - July 25, 2015
|
||||
----------------------
|
||||
* Don't disable Netlink if TC stats are unavailable
|
||||
|
||||
v3.7 - November 22, 2014
|
||||
----------------------
|
||||
* Bugfixes
|
||||
* Documentation updates
|
||||
* Provide minimal interface information on BSD
|
||||
|
||||
v3.6 - November 22, 2014
|
||||
----------------------
|
||||
* Build fix for uclinux
|
||||
* Fix LICENSE links
|
||||
|
||||
v3.5 - August 30, 2014
|
||||
----------------------
|
||||
* Fixes for all defects identified by coverity
|
||||
* Fix accuracy issue on total rate calculation
|
||||
* Travis-CI support
|
||||
* Various other small bugfixes
|
||||
|
||||
v3.4 - August 24, 2014
|
||||
----------------------
|
||||
* Bugfixes
|
||||
* blank screen with config file
|
||||
* quick-help toggle with '?' in curses
|
||||
* Better bmon.conf example
|
||||
|
||||
v3.3 - July 6, 2014
|
||||
-------------------
|
||||
* MacOS X port
|
||||
* Only initialize curses module if actually used
|
||||
* Assorted bug and spelling fixes
|
||||
* Various build fixes
|
58
README.md
@ -1,58 +0,0 @@
|
||||
# bmon - Bandwidth Monitor
|
||||
|
||||
[](https://travis-ci.org/tgraf/bmon)
|
||||
[](https://scan.coverity.com/projects/2864)
|
||||
|
||||
bmon is a monitoring and debugging tool to capture networking related
|
||||
statistics and prepare them visually in a human friendly way. It
|
||||
features various output methods including an interactive curses user
|
||||
interface and a programmable text output for scripting.
|
||||
|
||||
## Download
|
||||
|
||||
* [Latest Release](https://github.com/tgraf/bmon/releases/latest)
|
||||
* [Older Releases](https://github.com/tgraf/bmon/releases)
|
||||
|
||||
## Debian/Ubuntu Installation
|
||||
|
||||
```
|
||||
git clone https://github.com/tgraf/bmon.git
|
||||
cd bmon
|
||||
apt-get install build-essential make libconfuse-dev libnl-3-dev libnl-route-3-dev libncurses-dev
|
||||
./autogen.sh
|
||||
./configure
|
||||
make
|
||||
make install
|
||||
bmon
|
||||
```
|
||||
|
||||
-------------
|
||||
## New in 3.8
|
||||
* Don't disable Netlink if TC stats are unavailable
|
||||
|
||||
-------------
|
||||
### Usage
|
||||
|
||||
To run bmon in the default curses mode:
|
||||
|
||||
> bmon
|
||||
|
||||
There are many other options available and full help is
|
||||
provided via:
|
||||
|
||||
> bmon --help
|
||||
|
||||
## Screenshots
|
||||
|
||||

|
||||

|
||||
|
||||
## Copyright
|
||||
|
||||
> *Copyright (c) 2001-2014 Thomas Graf <tgraf@suug.ch>*
|
||||
> *Copyright (c) 2013 Red Hat, Inc.*
|
||||
|
||||
Please see the [LICENSE.BSD](https://github.com/tgraf/bmon/blob/master/LICENSE.BSD)
|
||||
and [LICENSE.MIT](https://github.com/tgraf/bmon/blob/master/LICENSE.MIT) files for
|
||||
additional details.
|
||||
|
@ -1,4 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
autoreconf -fi;
|
||||
rm -Rf autom4te.cache;
|
200
configure.ac
@ -1,200 +0,0 @@
|
||||
#
|
||||
# configure.in Configure Script
|
||||
#
|
||||
# Copyright (c) 2001-2013 Thomas Graf <tgraf@suug.ch>
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a
|
||||
# copy of this software and associated documentation files (the "Software"),
|
||||
# to deal in the Software without restriction, including without limitation
|
||||
# the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
# and/or sell copies of the Software, and to permit persons to whom the
|
||||
# Software is furnished to do so, subject to the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
# DEALINGS IN THE SOFTWARE.
|
||||
|
||||
AC_INIT(bmon, 3.8, [], [], [http://www.infradead.org/~tgr/bmon/])
|
||||
AC_CONFIG_HEADERS(include/bmon/defs.h)
|
||||
AC_CONFIG_AUX_DIR([build-aux])
|
||||
AC_CONFIG_MACRO_DIR([m4])
|
||||
|
||||
AC_CANONICAL_TARGET
|
||||
AC_CANONICAL_SYSTEM
|
||||
|
||||
AM_INIT_AUTOMAKE([-Wall foreign subdir-objects])
|
||||
m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES(yes)], [])
|
||||
|
||||
AC_ISC_POSIX
|
||||
AC_PROG_CC
|
||||
AC_PROG_CC_STDC
|
||||
AC_PROG_CPP
|
||||
AC_PROG_MAKE_SET
|
||||
AC_PROG_INSTALL
|
||||
|
||||
AC_C_CONST
|
||||
AC_C_INLINE
|
||||
|
||||
AC_HEADER_TIME
|
||||
AC_HEADER_DIRENT
|
||||
|
||||
AC_TYPE_SIZE_T
|
||||
AC_TYPE_SIGNAL
|
||||
AC_TYPE_PID_T
|
||||
|
||||
AC_FUNC_FORK
|
||||
|
||||
AC_CHECK_HEADERS(getopt.h ncurses/ncurses.h ncurses.h curses.h)
|
||||
AC_CHECK_HEADERS(dirent.h sys/utsname.h sys/sockio.h netinet6/in6.h)
|
||||
AC_CHECK_HEADERS(fcntl.h netdb.h netinet/in.h sysctl/ioctl.h)
|
||||
AC_CHECK_HEADERS(sys/param.h sys/socket.h)
|
||||
|
||||
AC_CHECK_TYPES(suseconds_t)
|
||||
|
||||
AC_CHECK_FUNCS(atexit gettimeofday memset pow socket strcasecmp)
|
||||
AC_CHECK_FUNCS(strchr strdup strerror strncasecmp strstr strtol)
|
||||
AC_CHECK_FUNCS(uname getdate)
|
||||
|
||||
AX_WITH_CURSES
|
||||
if test "x$ax_cv_curses" != xyes || test "x$ax_cv_curses_color" != xyes; then
|
||||
AC_MSG_ERROR([requires an X/Open-compatible Curses library with color])
|
||||
fi
|
||||
|
||||
PKG_CHECK_MODULES([CONFUSE], [libconfuse], [], AC_MSG_ERROR([requires libconfuse]))
|
||||
|
||||
case ${target_os} in
|
||||
linux*|uclinux*)
|
||||
PKG_CHECK_MODULES([LIBNL], [libnl-3.0], [], AC_MSG_ERROR([requires libnl3-dev]))
|
||||
PKG_CHECK_MODULES([LIBNL_ROUTE], [libnl-route-3.0], [], AC_MSG_ERROR([requires libnl3-route]))
|
||||
;;
|
||||
esac
|
||||
|
||||
AC_CHECK_LIB(m, pow, [], AC_MSG_ERROR([requires libm]))
|
||||
|
||||
BMON_LIB=""
|
||||
|
||||
#####################################################################
|
||||
##
|
||||
## libcurses check
|
||||
##
|
||||
#####################################################################
|
||||
CURSES="No "
|
||||
AC_CHECK_LIB(ncurses, initscr, [
|
||||
AC_DEFINE_UNQUOTED(HAVE_NCURSES, "1", [have ncurses])
|
||||
LCURSES="ncurses"
|
||||
CURSES="Yes"
|
||||
],[
|
||||
AC_CHECK_LIB(curses,initscr, [
|
||||
AC_DEFINE_UNQUOTED(HAVE_CURSES, "1", [have curses])
|
||||
LCURSES="curses"
|
||||
CURSES="Yes"
|
||||
],[
|
||||
echo
|
||||
echo "*** Warning: Building bmon w/o curses support ***"
|
||||
echo
|
||||
])
|
||||
])
|
||||
|
||||
LIBCURSES="-l$LCURSES"
|
||||
|
||||
AC_CHECK_LIB($LCURSES, redrawwin, [
|
||||
AC_DEFINE_UNQUOTED(HAVE_REDRAWWIN, "1", [have redrawwin])
|
||||
])
|
||||
|
||||
AC_CHECK_LIB($LCURSES, use_default_colors, [
|
||||
AC_DEFINE_UNQUOTED(HAVE_USE_DEFAULT_COLORS, "1", [have udc])
|
||||
])
|
||||
|
||||
#####################################################################
|
||||
##
|
||||
## interface counter overflow workaround
|
||||
##
|
||||
#####################################################################
|
||||
AC_ARG_ENABLE(cnt-workaround,
|
||||
[ --disable-cnt-workaround Disables interface counter overflow workaround],[
|
||||
if test x$enableval = xno; then
|
||||
AC_DEFINE_UNQUOTED(DISABLE_OVERFLOW_WORKAROUND,"1",[no overflow workaround])
|
||||
fi
|
||||
])
|
||||
|
||||
#####################################################################
|
||||
##
|
||||
## curses
|
||||
##
|
||||
#####################################################################
|
||||
AC_ARG_ENABLE(curses,
|
||||
[ --disable-curses Disables curses output],[
|
||||
if test x$enableval = xno; then
|
||||
CURSES="No "
|
||||
fi
|
||||
])
|
||||
|
||||
#####################################################################
|
||||
##
|
||||
## debug check
|
||||
##
|
||||
#####################################################################
|
||||
DEBUG=0
|
||||
AC_ARG_ENABLE(debug,
|
||||
[ --enable-debug Enable debug mode (default disabled)],[
|
||||
if test x$enableval = xyes; then
|
||||
AC_DEFINE_UNQUOTED(DEBUG, "1", [enable debugging])
|
||||
DEBUG=1;
|
||||
fi
|
||||
])
|
||||
|
||||
#####################################################################
|
||||
##
|
||||
## target os eval
|
||||
##
|
||||
#####################################################################
|
||||
case ${target_os} in
|
||||
linux*)
|
||||
AC_DEFINE_UNQUOTED(SYS_LINUX, "1", [operating system])
|
||||
;;
|
||||
|
||||
*solaris*)
|
||||
AC_DEFINE_UNQUOTED(SYS_SUNOS, "1", [operating system])
|
||||
;;
|
||||
|
||||
*bsd*)
|
||||
AC_DEFINE_UNQUOTED(SYS_BSD, "1", [operating system])
|
||||
;;
|
||||
|
||||
*darwin*)
|
||||
AC_DEFINE_UNQUOTED(SYS_BSD, "1", [operating system])
|
||||
;;
|
||||
|
||||
*)
|
||||
AC_DEFINE_UNQUOTED(SYS_OTHER, "1", [operating system])
|
||||
;;
|
||||
esac
|
||||
|
||||
#####################################################################
|
||||
##
|
||||
## export variables
|
||||
##
|
||||
#####################################################################
|
||||
AC_SUBST(DEBUG)
|
||||
AC_SUBST(STATIC)
|
||||
AC_SUBST(SYS)
|
||||
AC_SUBST(ARCH)
|
||||
|
||||
AC_SUBST(CURSES)
|
||||
|
||||
AC_CONFIG_FILES([
|
||||
Makefile
|
||||
include/Makefile
|
||||
src/Makefile
|
||||
man/Makefile
|
||||
examples/Makefile
|
||||
])
|
||||
|
||||
AC_OUTPUT
|
@ -1,6 +0,0 @@
|
||||
# -*- Makefile -*-
|
||||
|
||||
exampledir = $(datarootdir)/doc/@PACKAGE@/examples
|
||||
example_DATA = bmon.conf
|
||||
|
||||
EXTRA_DIST = $(example_DATA)
|
@ -1,88 +0,0 @@
|
||||
/*
|
||||
* read_interval = 1.0
|
||||
* rate_interval = 1.0
|
||||
* variance = 0.1
|
||||
* history_variance = 0.1
|
||||
* sleep_time = 20000
|
||||
* lifetime = 30.0
|
||||
* show_all = true
|
||||
* policy = ""
|
||||
*/
|
||||
|
||||
/*
|
||||
* element eth0 {
|
||||
* description = { "My description" }
|
||||
* rxmax = { 10000 }
|
||||
* txmax = { 10000 }
|
||||
* max = { 12500000 }
|
||||
* }
|
||||
*/
|
||||
|
||||
/*
|
||||
* Default configuration
|
||||
*
|
||||
* The following definitions is what is compiled into bmon and used
|
||||
* by default.
|
||||
*/
|
||||
unit byte {
|
||||
variant default {
|
||||
div = { 1, 1024, 1048576, 1073741824, 1099511627776}
|
||||
txt = { "B", "KiB", "MiB", "GiB", "TiB" }
|
||||
}
|
||||
variant si {
|
||||
div = { 1, 1000, 1000000, 1000000000, 1000000000000 }
|
||||
txt = { "B", "KB", "MB", "GB", "TB" }
|
||||
}
|
||||
variant bit {
|
||||
div = { 0.125, 125, 125000, 125000000, 125000000000 }
|
||||
txt = { "b", "Kb", "Mb", "Gb", "Tb" }
|
||||
}
|
||||
}
|
||||
|
||||
unit bit {
|
||||
variant default {
|
||||
div = { 1, 1000, 1000000, 1000000000, 1000000000000 }
|
||||
txt = { "b", "Kb", "Mb", "Gb", "Tb" }
|
||||
}
|
||||
variant si {
|
||||
div = { 1, 1000, 1000000, 1000000000, 1000000000000 }
|
||||
txt = { "b", "Kb", "Mb", "Gb", "Tb" }
|
||||
}
|
||||
variant bit {
|
||||
div = { 1, 1000, 1000000, 1000000000, 1000000000000 }
|
||||
txt = { "b", "Kb", "Mb", "Gb", "Tb" }
|
||||
}
|
||||
}
|
||||
|
||||
unit number {
|
||||
variant default {
|
||||
div = { 1, 1000, 1000000, 1000000000, 1000000000000 }
|
||||
txt = { "", "K", "M", "G", "T" }
|
||||
}
|
||||
}
|
||||
unit percent {
|
||||
variant default {
|
||||
div = 1.
|
||||
txt = "%"
|
||||
}
|
||||
}
|
||||
|
||||
history second {
|
||||
interval = 1.
|
||||
size = 60
|
||||
}
|
||||
|
||||
history minute {
|
||||
interval = 60.
|
||||
size = 60
|
||||
}
|
||||
|
||||
history hour {
|
||||
interval = 3600.
|
||||
size = 60
|
||||
}
|
||||
|
||||
history day {
|
||||
interval = 86400.
|
||||
size = 60
|
||||
}
|
BIN
fonts/OpenSans-Bold-webfont.eot
Normal file
146
fonts/OpenSans-Bold-webfont.svg
Normal file
@ -0,0 +1,146 @@
|
||||
<?xml version="1.0" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
|
||||
<svg xmlns="http://www.w3.org/2000/svg">
|
||||
<metadata>
|
||||
This is a custom SVG webfont generated by Font Squirrel.
|
||||
Copyright : Digitized data copyright 20102011 Google Corporation
|
||||
Foundry : Ascender Corporation
|
||||
Foundry URL : httpwwwascendercorpcom
|
||||
</metadata>
|
||||
<defs>
|
||||
<font id="OpenSansBold" horiz-adv-x="1169" >
|
||||
<font-face units-per-em="2048" ascent="1638" descent="-410" />
|
||||
<missing-glyph horiz-adv-x="532" />
|
||||
<glyph unicode=" " horiz-adv-x="532" />
|
||||
<glyph unicode="	" horiz-adv-x="532" />
|
||||
<glyph unicode=" " horiz-adv-x="532" />
|
||||
<glyph unicode="!" horiz-adv-x="586" d="M117 143q0 84 45 127t131 43q83 0 128.5 -44t45.5 -126q0 -79 -46 -124.5t-128 -45.5q-84 0 -130 44.5t-46 125.5zM121 1462h346l-51 -977h-244z" />
|
||||
<glyph unicode=""" horiz-adv-x="967" d="M133 1462h279l-41 -528h-197zM555 1462h279l-41 -528h-197z" />
|
||||
<glyph unicode="#" horiz-adv-x="1323" d="M45 406v206h277l47 232h-252v209h289l77 407h219l-77 -407h198l78 407h215l-78 -407h240v-209h-279l-47 -232h258v-206h-297l-77 -406h-220l78 406h-194l-76 -406h-215l74 406h-238zM539 612h196l47 232h-196z" />
|
||||
<glyph unicode="$" d="M88 1049q0 145 113.5 238.5t316.5 113.5v153h137v-149q229 -10 414 -92l-94 -234q-156 64 -320 78v-295q195 -75 277.5 -130t121 -121t38.5 -154q0 -159 -115 -255.5t-322 -115.5v-205h-137v201q-244 5 -428 86v264q87 -43 209.5 -76t218.5 -39v310l-67 26 q-198 78 -280.5 169.5t-82.5 226.5zM389 1049q0 -44 30.5 -72.5t98.5 -58.5v235q-129 -19 -129 -104zM655 324q136 23 136 118q0 42 -34 71t-102 60v-249z" />
|
||||
<glyph unicode="%" horiz-adv-x="1845" d="M63 1026q0 457 345 457q169 0 259.5 -118.5t90.5 -338.5q0 -230 -89 -345.5t-261 -115.5q-165 0 -255 118.5t-90 342.5zM315 1024q0 -127 22.5 -189.5t72.5 -62.5q96 0 96 252q0 250 -96 250q-50 0 -72.5 -61.5t-22.5 -188.5zM395 0l811 1462h240l-811 -1462h-240z M1087 442q0 457 345 457q169 0 259.5 -118.5t90.5 -338.5q0 -229 -89 -344.5t-261 -115.5q-165 0 -255 118.5t-90 341.5zM1339 440q0 -127 22.5 -189.5t72.5 -62.5q96 0 96 252q0 250 -96 250q-50 0 -72.5 -61.5t-22.5 -188.5z" />
|
||||
<glyph unicode="&" horiz-adv-x="1536" d="M82 395q0 137 60.5 233.5t207.5 180.5q-75 86 -109 164.5t-34 171.5q0 152 116.5 245t311.5 93q186 0 297.5 -86.5t111.5 -231.5q0 -119 -69 -217.5t-223 -187.5l284 -277q71 117 123 301h318q-36 -135 -99 -263.5t-143 -227.5l301 -293h-377l-115 113 q-191 -133 -432 -133q-244 0 -387 112t-143 303zM403 424q0 -86 64.5 -137t165.5 -51q126 0 227 61l-332 330q-58 -44 -91.5 -92t-33.5 -111zM489 1124q0 -88 95 -194q86 48 132 94.5t46 108.5q0 53 -36 83.5t-93 30.5q-67 0 -105.5 -32t-38.5 -91z" />
|
||||
<glyph unicode="'" horiz-adv-x="545" d="M133 1462h279l-41 -528h-197z" />
|
||||
<glyph unicode="(" horiz-adv-x="694" d="M82 561q0 265 77.5 496t223.5 405h250q-141 -193 -213 -424t-72 -475q0 -245 73.5 -473.5t209.5 -413.5h-248q-147 170 -224 397t-77 488z" />
|
||||
<glyph unicode=")" horiz-adv-x="694" d="M61 1462h250q147 -175 224 -406.5t77 -494.5t-77.5 -490t-223.5 -395h-248q135 184 209 412.5t74 474.5q0 244 -72 475t-213 424z" />
|
||||
<glyph unicode="*" horiz-adv-x="1116" d="M63 1042l39 250l365 -104l-41 368h262l-41 -368l373 104l33 -252l-340 -24l223 -297l-227 -121l-156 313l-137 -311l-236 119l221 297z" />
|
||||
<glyph unicode="+" d="M88 612v219h387v390h219v-390h387v-219h-387v-385h-219v385h-387z" />
|
||||
<glyph unicode="," horiz-adv-x="594" d="M63 -264q65 266 101 502h280l15 -23q-52 -202 -176 -479h-220z" />
|
||||
<glyph unicode="-" horiz-adv-x="659" d="M61 424v250h537v-250h-537z" />
|
||||
<glyph unicode="." horiz-adv-x="584" d="M117 143q0 84 45 127t131 43q83 0 128.5 -44t45.5 -126q0 -79 -46 -124.5t-128 -45.5q-84 0 -130 44.5t-46 125.5z" />
|
||||
<glyph unicode="/" horiz-adv-x="846" d="M14 0l545 1462h277l-545 -1462h-277z" />
|
||||
<glyph unicode="0" d="M74 731q0 387 125 570.5t385 183.5q253 0 382.5 -192t129.5 -562q0 -383 -125.5 -567t-386.5 -184q-253 0 -381.5 190t-128.5 561zM381 731q0 -269 46.5 -385.5t156.5 -116.5q108 0 156 118t48 384q0 269 -48.5 386.5t-155.5 117.5q-109 0 -156 -117.5t-47 -386.5z" />
|
||||
<glyph unicode="1" d="M121 1087l471 375h254v-1462h-309v846l3 139l5 152q-77 -77 -107 -101l-168 -135z" />
|
||||
<glyph unicode="2" d="M78 1274q108 92 179 130t155 58.5t188 20.5q137 0 242 -50t163 -140t58 -206q0 -101 -35.5 -189.5t-110 -181.5t-262.5 -265l-188 -177v-14h637v-260h-1022v215l367 371q163 167 213 231.5t72 119.5t22 114q0 88 -48.5 131t-129.5 43q-85 0 -165 -39t-167 -111z" />
|
||||
<glyph unicode="3" d="M78 59v263q85 -43 187 -70t202 -27q153 0 226 52t73 167q0 103 -84 146t-268 43h-111v237h113q170 0 248.5 44.5t78.5 152.5q0 166 -208 166q-72 0 -146.5 -24t-165.5 -83l-143 213q200 144 477 144q227 0 358.5 -92t131.5 -256q0 -137 -83 -233t-233 -132v-6 q177 -22 268 -107.5t91 -230.5q0 -211 -153 -328.5t-437 -117.5q-238 0 -422 79z" />
|
||||
<glyph unicode="4" d="M35 303v215l641 944h285v-919h176v-240h-176v-303h-302v303h-624zM307 543h352v248q0 62 5 180t8 137h-8q-37 -82 -89 -160z" />
|
||||
<glyph unicode="5" d="M100 59v267q79 -42 184 -68.5t199 -26.5q283 0 283 232q0 221 -293 221q-53 0 -117 -10.5t-104 -22.5l-123 66l55 745h793v-262h-522l-27 -287l35 7q61 14 151 14q212 0 337.5 -119t125.5 -326q0 -245 -151 -377t-432 -132q-244 0 -394 79z" />
|
||||
<glyph unicode="6" d="M72 621q0 434 183.5 646t549.5 212q125 0 196 -15v-247q-89 20 -176 20q-159 0 -259.5 -48t-150.5 -142t-59 -267h13q99 170 317 170q196 0 307 -123t111 -340q0 -234 -132 -370.5t-366 -136.5q-162 0 -282.5 75t-186 219t-65.5 347zM379 510q0 -119 62.5 -201t158.5 -82 q99 0 152 66.5t53 189.5q0 107 -49.5 168.5t-149.5 61.5q-94 0 -160.5 -61t-66.5 -142z" />
|
||||
<glyph unicode="7" d="M55 1200v260h1049v-194l-553 -1266h-324l549 1200h-721z" />
|
||||
<glyph unicode="8" d="M72 371q0 125 66.5 222t213.5 171q-125 79 -180 169t-55 197q0 157 130 254t339 97q210 0 338.5 -95.5t128.5 -257.5q0 -112 -62 -199.5t-200 -156.5q164 -88 235.5 -183.5t71.5 -209.5q0 -180 -141 -289.5t-371 -109.5q-240 0 -377 102t-137 289zM358 389q0 -86 60 -134 t164 -48q115 0 172 49.5t57 130.5q0 67 -56.5 125.5t-183.5 124.5q-213 -98 -213 -248zM408 1106q0 -60 38.5 -107.5t139.5 -97.5q98 46 137 94t39 111q0 69 -50 109t-128 40q-79 0 -127.5 -40.5t-48.5 -108.5z" />
|
||||
<glyph unicode="9" d="M66 971q0 235 133.5 371.5t363.5 136.5q162 0 283.5 -76t186.5 -220.5t65 -344.5q0 -432 -182 -645t-551 -213q-130 0 -197 14v248q84 -21 176 -21q155 0 255 45.5t153 143t61 268.5h-12q-58 -94 -134 -132t-190 -38q-191 0 -301 122.5t-110 340.5zM365 975 q0 -106 49 -168t149 -62q94 0 161 61.5t67 141.5q0 119 -62.5 201t-159.5 82q-96 0 -150 -66t-54 -190z" />
|
||||
<glyph unicode=":" horiz-adv-x="584" d="M117 143q0 84 45 127t131 43q83 0 128.5 -44t45.5 -126q0 -79 -46 -124.5t-128 -45.5q-84 0 -130 44.5t-46 125.5zM117 969q0 84 45 127t131 43q83 0 128.5 -44t45.5 -126q0 -81 -46.5 -125.5t-127.5 -44.5q-84 0 -130 44t-46 126z" />
|
||||
<glyph unicode=";" horiz-adv-x="594" d="M63 -264q65 266 101 502h280l15 -23q-52 -202 -176 -479h-220zM117 969q0 84 45 127t131 43q83 0 128.5 -44t45.5 -126q0 -81 -46.5 -125.5t-127.5 -44.5q-84 0 -130 44t-46 126z" />
|
||||
<glyph unicode="<" d="M88 641v143l993 496v-240l-684 -317l684 -281v-239z" />
|
||||
<glyph unicode="=" d="M88 418v219h993v-219h-993zM88 805v219h993v-219h-993z" />
|
||||
<glyph unicode=">" d="M88 203v239l684 281l-684 317v240l993 -496v-143z" />
|
||||
<glyph unicode="?" horiz-adv-x="977" d="M6 1358q223 125 473 125q206 0 327.5 -99t121.5 -264q0 -110 -50 -190t-190 -180q-96 -71 -121.5 -108t-25.5 -97v-60h-265v74q0 96 41 167t150 151q105 75 138.5 122t33.5 105q0 65 -48 99t-134 34q-150 0 -342 -98zM244 143q0 84 45 127t131 43q83 0 128.5 -44 t45.5 -126q0 -79 -46 -124.5t-128 -45.5q-84 0 -130 44.5t-46 125.5z" />
|
||||
<glyph unicode="@" horiz-adv-x="1837" d="M102 602q0 247 108.5 448.5t309 316t461.5 114.5q220 0 393 -90t267 -256t94 -383q0 -144 -46 -263.5t-130 -187.5t-195 -68q-74 0 -131 35.5t-82 93.5h-16q-108 -129 -275 -129q-177 0 -279 106.5t-102 291.5q0 211 134 340t350 129q86 0 189.5 -16.5t170.5 -39.5 l-23 -489q0 -139 76 -139q64 0 102 93.5t38 244.5q0 161 -67 284.5t-188.5 188.5t-277.5 65q-202 0 -351 -83t-228.5 -239.5t-79.5 -361.5q0 -276 147.5 -423.5t427.5 -147.5q106 0 233 23.5t250 68.5v-192q-214 -91 -475 -91q-380 0 -592.5 200t-212.5 556zM711 627 q0 -211 172 -211q90 0 137 63.5t57 206.5l13 221q-51 11 -115 11q-125 0 -194.5 -78t-69.5 -213z" />
|
||||
<glyph unicode="A" horiz-adv-x="1413" d="M0 0l516 1468h379l518 -1468h-334l-106 348h-533l-106 -348h-334zM518 608h381q-147 473 -165.5 535t-26.5 98q-33 -128 -189 -633z" />
|
||||
<glyph unicode="B" horiz-adv-x="1376" d="M184 0v1462h455q311 0 451.5 -88.5t140.5 -281.5q0 -131 -61.5 -215t-163.5 -101v-10q139 -31 200.5 -116t61.5 -226q0 -200 -144.5 -312t-392.5 -112h-547zM494 256h202q128 0 189 49t61 150q0 182 -260 182h-192v-381zM494 883h180q126 0 182.5 39t56.5 129 q0 84 -61.5 120.5t-194.5 36.5h-163v-325z" />
|
||||
<glyph unicode="C" horiz-adv-x="1305" d="M119 729q0 228 83 399.5t238.5 263t364.5 91.5q213 0 428 -103l-100 -252q-82 39 -165 68t-163 29q-175 0 -271 -131.5t-96 -366.5q0 -489 367 -489q154 0 373 77v-260q-180 -75 -402 -75q-319 0 -488 193.5t-169 555.5z" />
|
||||
<glyph unicode="D" horiz-adv-x="1516" d="M184 0v1462h459q358 0 556 -189t198 -528q0 -361 -205.5 -553t-593.5 -192h-414zM494 256h133q448 0 448 481q0 471 -416 471h-165v-952z" />
|
||||
<glyph unicode="E" horiz-adv-x="1147" d="M184 0v1462h842v-254h-532v-321h495v-254h-495v-377h532v-256h-842z" />
|
||||
<glyph unicode="F" horiz-adv-x="1124" d="M184 0v1462h838v-254h-533v-377h496v-253h-496v-578h-305z" />
|
||||
<glyph unicode="G" horiz-adv-x="1483" d="M119 733q0 354 202.5 552t561.5 198q225 0 434 -90l-103 -248q-160 80 -333 80q-201 0 -322 -135t-121 -363q0 -238 97.5 -363.5t283.5 -125.5q97 0 197 20v305h-277v258h580v-758q-141 -46 -265.5 -64.5t-254.5 -18.5q-331 0 -505.5 194.5t-174.5 558.5z" />
|
||||
<glyph unicode="H" horiz-adv-x="1567" d="M184 0v1462h310v-573h579v573h309v-1462h-309v631h-579v-631h-310z" />
|
||||
<glyph unicode="I" horiz-adv-x="678" d="M184 0v1462h310v-1462h-310z" />
|
||||
<glyph unicode="J" horiz-adv-x="678" d="M-152 -150q80 -20 146 -20q102 0 146 63.5t44 198.5v1370h310v-1368q0 -256 -117 -390t-346 -134q-105 0 -183 22v258z" />
|
||||
<glyph unicode="K" horiz-adv-x="1360" d="M184 0v1462h310v-669l122 172l396 497h344l-510 -647l514 -815h-352l-383 616l-131 -94v-522h-310z" />
|
||||
<glyph unicode="L" horiz-adv-x="1157" d="M184 0v1462h310v-1206h593v-256h-903z" />
|
||||
<glyph unicode="M" horiz-adv-x="1931" d="M184 0v1462h422l346 -1118h6l367 1118h422v-1462h-289v692q0 49 1.5 113t13.5 340h-9l-377 -1145h-284l-352 1147h-9q19 -350 19 -467v-680h-277z" />
|
||||
<glyph unicode="N" horiz-adv-x="1665" d="M184 0v1462h391l635 -1095h7q-15 285 -15 403v692h279v-1462h-394l-636 1106h-9q19 -293 19 -418v-688h-277z" />
|
||||
<glyph unicode="O" horiz-adv-x="1630" d="M119 735q0 365 180.5 557.5t517.5 192.5t515.5 -194t178.5 -558q0 -363 -180 -558t-516 -195t-516 195t-180 560zM444 733q0 -245 93 -369t278 -124q371 0 371 493q0 494 -369 494q-185 0 -279 -124.5t-94 -369.5z" />
|
||||
<glyph unicode="P" horiz-adv-x="1286" d="M184 0v1462h467q266 0 404.5 -114.5t138.5 -341.5q0 -236 -147.5 -361t-419.5 -125h-133v-520h-310zM494 774h102q143 0 214 56.5t71 164.5q0 109 -59.5 161t-186.5 52h-141v-434z" />
|
||||
<glyph unicode="Q" horiz-adv-x="1630" d="M119 735q0 365 180.5 557.5t517.5 192.5t515.5 -194t178.5 -558q0 -258 -91.5 -432.5t-268.5 -255.5l352 -393h-397l-268 328h-23q-336 0 -516 195t-180 560zM444 733q0 -245 93 -369t278 -124q371 0 371 493q0 494 -369 494q-185 0 -279 -124.5t-94 -369.5z" />
|
||||
<glyph unicode="R" horiz-adv-x="1352" d="M184 0v1462h426q298 0 441 -108.5t143 -329.5q0 -129 -71 -229.5t-201 -157.5q330 -493 430 -637h-344l-349 561h-165v-561h-310zM494 813h100q147 0 217 49t70 154q0 104 -71.5 148t-221.5 44h-94v-395z" />
|
||||
<glyph unicode="S" horiz-adv-x="1128" d="M94 68v288q148 -66 250.5 -93t187.5 -27q102 0 156.5 39t54.5 116q0 43 -24 76.5t-70.5 64.5t-189.5 99q-134 63 -201 121t-107 135t-40 180q0 194 131.5 305t363.5 111q114 0 217.5 -27t216.5 -76l-100 -241q-117 48 -193.5 67t-150.5 19q-88 0 -135 -41t-47 -107 q0 -41 19 -71.5t60.5 -59t196.5 -102.5q205 -98 281 -196.5t76 -241.5q0 -198 -142.5 -312t-396.5 -114q-234 0 -414 88z" />
|
||||
<glyph unicode="T" horiz-adv-x="1186" d="M41 1204v258h1104v-258h-397v-1204h-310v1204h-397z" />
|
||||
<glyph unicode="U" horiz-adv-x="1548" d="M174 520v942h309v-895q0 -169 68 -248t225 -79q152 0 220.5 79.5t68.5 249.5v893h309v-946q0 -162 -72.5 -284t-209.5 -187t-324 -65q-282 0 -438 144.5t-156 395.5z" />
|
||||
<glyph unicode="V" horiz-adv-x="1331" d="M0 1462h313l275 -870q23 -77 47.5 -179.5t30.5 -142.5q11 92 75 322l277 870h313l-497 -1462h-338z" />
|
||||
<glyph unicode="W" horiz-adv-x="1980" d="M0 1462h305l187 -798q49 -221 71 -383q6 57 27.5 176.5t40.5 185.5l213 819h293l213 -819q14 -55 35 -168t32 -194q10 78 32 194.5t40 188.5l186 798h305l-372 -1462h-353l-198 768q-11 41 -37.5 169.5t-30.5 172.5q-6 -54 -30 -173.5t-37 -170.5l-197 -766h-352z" />
|
||||
<glyph unicode="X" horiz-adv-x="1366" d="M0 0l485 754l-454 708h342l315 -526l309 526h334l-459 -725l494 -737h-354l-340 553l-340 -553h-332z" />
|
||||
<glyph unicode="Y" horiz-adv-x="1278" d="M0 1462h336l303 -602l305 602h334l-485 -893v-569h-308v559z" />
|
||||
<glyph unicode="Z" horiz-adv-x="1186" d="M49 0v201l701 1005h-682v256h1050v-200l-700 -1006h719v-256h-1088z" />
|
||||
<glyph unicode="[" horiz-adv-x="678" d="M143 -324v1786h484v-211h-224v-1364h224v-211h-484z" />
|
||||
<glyph unicode="\" horiz-adv-x="846" d="M12 1462h277l545 -1462h-277z" />
|
||||
<glyph unicode="]" horiz-adv-x="678" d="M51 -113h223v1364h-223v211h484v-1786h-484v211z" />
|
||||
<glyph unicode="^" horiz-adv-x="1090" d="M8 520l438 950h144l495 -950h-239l-322 643l-280 -643h-236z" />
|
||||
<glyph unicode="_" horiz-adv-x="842" d="M-4 -184h850v-140h-850v140z" />
|
||||
<glyph unicode="`" horiz-adv-x="1243" d="M332 1548v21h342q63 -101 235 -301v-27h-202q-63 44 -185 142.5t-190 164.5z" />
|
||||
<glyph unicode="a" horiz-adv-x="1237" d="M86 334q0 178 124.5 262.5t375.5 93.5l194 6v49q0 170 -174 170q-134 0 -315 -81l-101 206q193 101 428 101q225 0 345 -98t120 -298v-745h-213l-59 152h-8q-77 -97 -158.5 -134.5t-212.5 -37.5q-161 0 -253.5 92t-92.5 262zM399 332q0 -129 148 -129q106 0 169.5 61 t63.5 162v92l-118 -4q-133 -4 -198 -48t-65 -134z" />
|
||||
<glyph unicode="b" horiz-adv-x="1296" d="M160 0v1556h305v-362q0 -69 -12 -221h12q107 166 317 166q198 0 310 -154.5t112 -423.5q0 -277 -115.5 -429t-314.5 -152q-197 0 -309 143h-21l-51 -123h-233zM465 563q0 -180 53.5 -258t169.5 -78q94 0 149.5 86.5t55.5 251.5t-56 247.5t-153 82.5q-113 0 -165 -69.5 t-54 -229.5v-33z" />
|
||||
<glyph unicode="c" horiz-adv-x="1053" d="M92 553q0 285 142 435.5t407 150.5q194 0 348 -76l-90 -236q-72 29 -134 47.5t-124 18.5q-238 0 -238 -338q0 -328 238 -328q88 0 163 23.5t150 73.5v-261q-74 -47 -149.5 -65t-190.5 -18q-522 0 -522 573z" />
|
||||
<glyph unicode="d" horiz-adv-x="1296" d="M92 557q0 275 114.5 428.5t315.5 153.5q211 0 322 -164h10q-23 125 -23 223v358h306v-1556h-234l-59 145h-13q-104 -165 -317 -165q-197 0 -309.5 153t-112.5 424zM401 553q0 -165 57 -247.5t163 -82.5q117 0 171.5 68t59.5 231v33q0 180 -55.5 258t-180.5 78 q-102 0 -158.5 -86.5t-56.5 -251.5z" />
|
||||
<glyph unicode="e" horiz-adv-x="1210" d="M92 551q0 281 140.5 434.5t388.5 153.5q237 0 369 -135t132 -373v-148h-721q5 -130 77 -203t202 -73q101 0 191 21t188 67v-236q-80 -40 -171 -59.5t-222 -19.5q-270 0 -422 149t-152 422zM408 686h428q-2 113 -59 174.5t-154 61.5t-152 -61.5t-63 -174.5z" />
|
||||
<glyph unicode="f" horiz-adv-x="793" d="M41 889v147l168 82v82q0 191 94 279t301 88q158 0 281 -47l-78 -224q-92 29 -170 29q-65 0 -94 -38.5t-29 -98.5v-70h264v-229h-264v-889h-305v889h-168z" />
|
||||
<glyph unicode="g" horiz-adv-x="1157" d="M6 -182q0 101 63 169t185 97q-47 20 -82 65.5t-35 96.5q0 64 37 106.5t107 83.5q-88 38 -139.5 122t-51.5 198q0 183 119 283t340 100q47 0 111.5 -8.5t82.5 -12.5h390v-155l-175 -45q48 -75 48 -168q0 -180 -125.5 -280.5t-348.5 -100.5l-55 3l-45 5q-47 -36 -47 -80 q0 -66 168 -66h190q184 0 280.5 -79t96.5 -232q0 -196 -163.5 -304t-469.5 -108q-234 0 -357.5 81.5t-123.5 228.5zM270 -158q0 -63 60.5 -99t169.5 -36q164 0 257 45t93 123q0 63 -55 87t-170 24h-158q-84 0 -140.5 -39.5t-56.5 -104.5zM381 752q0 -91 41.5 -144t126.5 -53 q86 0 126 53t40 144q0 202 -166 202q-168 0 -168 -202z" />
|
||||
<glyph unicode="h" horiz-adv-x="1346" d="M160 0v1556h305v-317q0 -37 -7 -174l-7 -90h16q102 164 324 164q197 0 299 -106t102 -304v-729h-305v653q0 242 -180 242q-128 0 -185 -87t-57 -282v-526h-305z" />
|
||||
<glyph unicode="i" horiz-adv-x="625" d="M147 1407q0 149 166 149t166 -149q0 -71 -41.5 -110.5t-124.5 -39.5q-166 0 -166 150zM160 0v1118h305v-1118h-305z" />
|
||||
<glyph unicode="j" horiz-adv-x="625" d="M-131 -227q70 -19 143 -19q77 0 112.5 43t35.5 127v1194h305v-1239q0 -178 -103 -274.5t-292 -96.5q-117 0 -201 25v240zM147 1407q0 149 166 149t166 -149q0 -71 -41.5 -110.5t-124.5 -39.5q-166 0 -166 150z" />
|
||||
<glyph unicode="k" horiz-adv-x="1270" d="M160 0v1556h305v-694l-16 -254h4l133 170l313 340h344l-444 -485l471 -633h-352l-322 453l-131 -105v-348h-305z" />
|
||||
<glyph unicode="l" horiz-adv-x="625" d="M160 0v1556h305v-1556h-305z" />
|
||||
<glyph unicode="m" horiz-adv-x="2011" d="M160 0v1118h233l41 -143h17q45 77 130 120.5t195 43.5q251 0 340 -164h27q45 78 132.5 121t197.5 43q190 0 287.5 -97.5t97.5 -312.5v-729h-306v653q0 121 -40.5 181.5t-127.5 60.5q-112 0 -167.5 -80t-55.5 -254v-561h-305v653q0 121 -40.5 181.5t-127.5 60.5 q-117 0 -170 -86t-53 -283v-526h-305z" />
|
||||
<glyph unicode="n" horiz-adv-x="1346" d="M160 0v1118h233l41 -143h17q51 81 140.5 122.5t203.5 41.5q195 0 296 -105.5t101 -304.5v-729h-305v653q0 121 -43 181.5t-137 60.5q-128 0 -185 -85.5t-57 -283.5v-526h-305z" />
|
||||
<glyph unicode="o" horiz-adv-x="1268" d="M92 561q0 274 143 426t402 152q161 0 284 -70t189 -201t66 -307q0 -273 -144 -427t-401 -154q-161 0 -284 70.5t-189 202.5t-66 308zM403 561q0 -166 54.5 -251t177.5 -85q122 0 175.5 84.5t53.5 251.5q0 166 -54 249t-177 83q-122 0 -176 -82.5t-54 -249.5z" />
|
||||
<glyph unicode="p" horiz-adv-x="1296" d="M160 -492v1610h248l43 -145h14q107 166 317 166q198 0 310 -153t112 -425q0 -179 -52.5 -311t-149.5 -201t-228 -69q-197 0 -309 143h-16q16 -140 16 -162v-453h-305zM465 563q0 -180 53.5 -258t169.5 -78q205 0 205 338q0 165 -50.5 247.5t-158.5 82.5 q-113 0 -165 -69.5t-54 -229.5v-33z" />
|
||||
<glyph unicode="q" horiz-adv-x="1296" d="M92 557q0 274 114.5 428t313.5 154q106 0 185 -40t139 -124h8l27 143h258v-1610h-306v469q0 61 13 168h-13q-49 -81 -130 -123t-187 -42q-198 0 -310 152.5t-112 424.5zM403 553q0 -168 53.5 -251t166.5 -83q116 0 170 66.5t59 232.5v37q0 180 -55.5 258t-178.5 78 q-215 0 -215 -338z" />
|
||||
<glyph unicode="r" horiz-adv-x="930" d="M160 0v1118h231l45 -188h15q52 94 140.5 151.5t192.5 57.5q62 0 103 -9l-23 -286q-37 10 -90 10q-146 0 -227.5 -75t-81.5 -210v-569h-305z" />
|
||||
<glyph unicode="s" horiz-adv-x="1018" d="M92 827q0 149 115.5 230.5t327.5 81.5q202 0 393 -88l-92 -220q-84 36 -157 59t-149 23q-135 0 -135 -73q0 -41 43.5 -71t190.5 -89q131 -53 192 -99t90 -106t29 -143q0 -172 -119.5 -262t-357.5 -90q-122 0 -208 16.5t-161 48.5v252q85 -40 191.5 -67t187.5 -27 q166 0 166 96q0 36 -22 58.5t-76 51t-144 66.5q-129 54 -189.5 100t-88 105.5t-27.5 146.5z" />
|
||||
<glyph unicode="t" horiz-adv-x="889" d="M47 889v129l168 102l88 236h195v-238h313v-229h-313v-539q0 -65 36.5 -96t96.5 -31q80 0 192 35v-227q-114 -51 -280 -51q-183 0 -266.5 92.5t-83.5 277.5v539h-146z" />
|
||||
<glyph unicode="u" horiz-adv-x="1346" d="M154 389v729h305v-653q0 -121 43 -181.5t137 -60.5q128 0 185 85.5t57 283.5v526h305v-1118h-234l-41 143h-16q-49 -78 -139 -120.5t-205 -42.5q-197 0 -297 105.5t-100 303.5z" />
|
||||
<glyph unicode="v" horiz-adv-x="1165" d="M0 1118h319l216 -637q36 -121 45 -229h6q5 96 45 229l215 637h319l-426 -1118h-313z" />
|
||||
<glyph unicode="w" horiz-adv-x="1753" d="M20 1118h304l129 -495q31 -133 63 -367h6q4 76 35 241l16 85l138 536h336l131 -536q4 -22 12.5 -65t16.5 -91.5t14.5 -95t7.5 -74.5h6q9 72 32 197.5t33 169.5l134 495h299l-322 -1118h-332l-86 391l-116 494h-7l-204 -885h-328z" />
|
||||
<glyph unicode="x" horiz-adv-x="1184" d="M10 0l379 571l-360 547h346l217 -356l219 356h346l-364 -547l381 -571h-347l-235 383l-236 -383h-346z" />
|
||||
<glyph unicode="y" horiz-adv-x="1165" d="M0 1118h334l211 -629q27 -82 37 -194h6q11 103 43 194l207 629h327l-473 -1261q-65 -175 -185.5 -262t-281.5 -87q-79 0 -155 17v242q55 -13 120 -13q81 0 141.5 49.5t94.5 149.5l18 55z" />
|
||||
<glyph unicode="z" horiz-adv-x="999" d="M55 0v180l518 705h-487v233h834v-198l-504 -687h522v-233h-883z" />
|
||||
<glyph unicode="{" horiz-adv-x="807" d="M31 449v239q126 0 191 44t65 126v8v318q0 153 97 215.5t341 62.5v-225q-99 -3 -136.5 -38t-37.5 -103v-299q-6 -188 -234 -222v-12q234 -35 234 -212v-9v-299q0 -68 37 -103t137 -38v-226q-244 0 -341 62.5t-97 216.5v315q0 87 -65.5 133t-190.5 46z" />
|
||||
<glyph unicode="|" horiz-adv-x="1128" d="M455 -465v2015h219v-2015h-219z" />
|
||||
<glyph unicode="}" horiz-adv-x="807" d="M82 -98q99 2 136.5 36t37.5 105v299v11q0 86 59 139.5t174 70.5v12q-227 34 -233 222v299q0 70 -37 104t-137 37v225q167 0 262 -26.5t135.5 -84t40.5 -167.5v-318v-10q0 -84 61.5 -126t194.5 -42v-239q-125 0 -190.5 -41t-65.5 -138v-315q0 -112 -41 -169t-135.5 -83.5 t-261.5 -26.5v226z" />
|
||||
<glyph unicode="~" d="M88 551v231q103 109 256 109q73 0 137.5 -16t139.5 -48q129 -55 227 -55q53 0 116 32t117 89v-231q-101 -109 -256 -109q-66 0 -126 13t-150 50q-131 56 -227 56q-55 0 -117.5 -33.5t-116.5 -87.5z" />
|
||||
<glyph unicode="¢" d="M143 741q0 261 104.5 403t315.5 173v166h178v-158q166 -9 299 -74l-90 -235q-72 29 -134 47t-124 18q-121 0 -179 -83.5t-58 -254.5q0 -327 237 -327q82 0 148 15.5t166 60.5v-254q-127 -61 -265 -70v-188h-178v196q-420 59 -420 565z" />
|
||||
<glyph unicode="£" d="M82 0v248q103 44 141.5 101t38.5 157v145h-178v219h178v195q0 201 114.5 309.5t323.5 108.5q195 0 390 -82l-93 -230q-157 64 -272 64q-78 0 -120 -44.5t-42 -127.5v-193h375v-219h-375v-143q0 -170 -151 -248h718v-260h-1048z" />
|
||||
<glyph unicode="¥" d="M6 1462h316l262 -602l264 602h313l-383 -747h195v-178h-246v-138h246v-178h-246v-221h-287v221h-247v178h247v138h-247v178h190z" />
|
||||
<glyph unicode="©" horiz-adv-x="1704" d="M100 731q0 200 100 375t275 276t377 101q200 0 375 -100t276 -275t101 -377q0 -197 -97 -370t-272 -277t-383 -104q-207 0 -382 103.5t-272.5 276.5t-97.5 371zM242 731q0 -164 82 -305.5t224 -223t304 -81.5q164 0 305.5 82t223 224t81.5 304q0 164 -82 305.5t-224 223 t-304 81.5q-164 0 -305.5 -82t-223 -224t-81.5 -304zM461 733q0 220 110.5 342.5t309.5 122.5q149 0 305 -78l-74 -168q-113 58 -217 58q-97 0 -150 -74t-53 -205q0 -280 203 -280q57 0 123 15t123 44v-191q-120 -57 -252 -57q-204 0 -316 125t-112 346z" />
|
||||
<glyph unicode="­" horiz-adv-x="659" d="M61 424v250h537v-250h-537z" />
|
||||
<glyph unicode="®" horiz-adv-x="1704" d="M100 731q0 200 100 375t275 276t377 101q200 0 375 -100t276 -275t101 -377q0 -197 -97 -370t-272 -277t-383 -104q-207 0 -382 103.5t-272.5 276.5t-97.5 371zM242 731q0 -164 82 -305.5t224 -223t304 -81.5q164 0 305.5 82t223 224t81.5 304q0 164 -82 305.5t-224 223 t-304 81.5q-164 0 -305.5 -82t-223 -224t-81.5 -304zM543 272v916h264q181 0 265.5 -70t84.5 -213q0 -170 -143 -233l237 -400h-254l-178 338h-47v-338h-229zM772 778h31q66 0 94.5 28.5t28.5 94.5q0 65 -28 92t-97 27h-29v-242z" />
|
||||
<glyph unicode="´" horiz-adv-x="1243" d="M332 1241v27q172 200 235 301h342v-21q-52 -52 -177.5 -154.5t-196.5 -152.5h-203z" />
|
||||
<glyph unicode=" " horiz-adv-x="784" />
|
||||
<glyph unicode=" " horiz-adv-x="1569" />
|
||||
<glyph unicode=" " horiz-adv-x="784" />
|
||||
<glyph unicode=" " horiz-adv-x="1569" />
|
||||
<glyph unicode=" " horiz-adv-x="523" />
|
||||
<glyph unicode=" " horiz-adv-x="392" />
|
||||
<glyph unicode=" " horiz-adv-x="261" />
|
||||
<glyph unicode=" " horiz-adv-x="261" />
|
||||
<glyph unicode=" " horiz-adv-x="196" />
|
||||
<glyph unicode=" " horiz-adv-x="313" />
|
||||
<glyph unicode=" " horiz-adv-x="87" />
|
||||
<glyph unicode="‐" horiz-adv-x="659" d="M61 424v250h537v-250h-537z" />
|
||||
<glyph unicode="‑" horiz-adv-x="659" d="M61 424v250h537v-250h-537z" />
|
||||
<glyph unicode="‒" horiz-adv-x="659" d="M61 424v250h537v-250h-537z" />
|
||||
<glyph unicode="–" horiz-adv-x="1024" d="M82 436v230h860v-230h-860z" />
|
||||
<glyph unicode="—" horiz-adv-x="2048" d="M82 436v230h1884v-230h-1884z" />
|
||||
<glyph unicode="‘" horiz-adv-x="444" d="M25 983q22 91 72.5 228.5t103.5 250.5h219q-66 -267 -101 -501h-280z" />
|
||||
<glyph unicode="’" horiz-adv-x="444" d="M25 961q69 296 100 501h281l14 -22q-50 -197 -176 -479h-219z" />
|
||||
<glyph unicode="“" horiz-adv-x="911" d="M25 983q22 91 72.5 228.5t103.5 250.5h219q-66 -267 -101 -501h-280zM492 983q22 91 72.5 228.5t103.5 250.5h219q-66 -267 -101 -501h-280z" />
|
||||
<glyph unicode="”" horiz-adv-x="911" d="M25 961q69 296 100 501h281l14 -22q-50 -197 -176 -479h-219zM492 961q69 296 100 501h280l15 -22q-50 -197 -176 -479h-219z" />
|
||||
<glyph unicode="•" horiz-adv-x="770" d="M98 748q0 154 74 235.5t213 81.5q137 0 212 -82t75 -235q0 -152 -75.5 -235t-211.5 -83q-138 0 -212.5 83t-74.5 235z" />
|
||||
<glyph unicode="…" horiz-adv-x="1751" d="M117 143q0 84 45 127t131 43q83 0 128.5 -44t45.5 -126q0 -79 -46 -124.5t-128 -45.5q-84 0 -130 44.5t-46 125.5zM700 143q0 84 45 127t132 43q83 0 128.5 -44t45.5 -126q0 -79 -46 -124.5t-128 -45.5q-85 0 -131 44.5t-46 125.5zM1284 143q0 84 45 127t131 43 q83 0 128.5 -44t45.5 -126q0 -79 -46 -124.5t-128 -45.5q-84 0 -130 44.5t-46 125.5z" />
|
||||
<glyph unicode=" " horiz-adv-x="313" />
|
||||
<glyph unicode=" " horiz-adv-x="392" />
|
||||
<glyph unicode="€" d="M66 481v178h118q-4 23 -4 62l2 53h-116v176h133q37 242 199 382.5t405 140.5q188 0 352 -82l-98 -232q-69 31 -129 48.5t-125 17.5q-122 0 -201 -70.5t-102 -204.5h403v-176h-418l-2 -35v-47l2 -33h355v-178h-338q51 -243 321 -243q143 0 275 57v-256q-116 -59 -293 -59 q-245 0 -403 133t-199 368h-137z" />
|
||||
<glyph unicode="™" horiz-adv-x="1534" d="M16 1313v149h564v-149h-199v-572h-168v572h-197zM625 741v721h247l160 -510l170 510h240v-721h-168v408l4 121h-6l-174 -529h-142l-165 529h-7l4 -111v-418h-163z" />
|
||||
<glyph unicode="" horiz-adv-x="1120" d="M0 1120h1120v-1120h-1120v1120z" />
|
||||
</font>
|
||||
</defs></svg>
|
After Width: | Height: | Size: 25 KiB |
BIN
fonts/OpenSans-Bold-webfont.ttf
Normal file
BIN
fonts/OpenSans-Bold-webfont.woff
Normal file
BIN
fonts/OpenSans-BoldItalic-webfont.eot
Normal file
146
fonts/OpenSans-BoldItalic-webfont.svg
Normal file
@ -0,0 +1,146 @@
|
||||
<?xml version="1.0" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
|
||||
<svg xmlns="http://www.w3.org/2000/svg">
|
||||
<metadata>
|
||||
This is a custom SVG webfont generated by Font Squirrel.
|
||||
Copyright : Digitized data copyright 20102011 Google Corporation
|
||||
Foundry : Ascender Corporation
|
||||
Foundry URL : httpwwwascendercorpcom
|
||||
</metadata>
|
||||
<defs>
|
||||
<font id="OpenSansBoldItalic" horiz-adv-x="1128" >
|
||||
<font-face units-per-em="2048" ascent="1638" descent="-410" />
|
||||
<missing-glyph horiz-adv-x="532" />
|
||||
<glyph unicode=" " horiz-adv-x="532" />
|
||||
<glyph unicode="	" horiz-adv-x="532" />
|
||||
<glyph unicode=" " horiz-adv-x="532" />
|
||||
<glyph unicode="!" horiz-adv-x="586" d="M25 115q0 90 53.5 144t150.5 54q68 0 109 -38t41 -107q0 -87 -55 -141t-144 -54q-73 0 -114 37.5t-41 104.5zM150 485l157 977h340l-256 -977h-241z" />
|
||||
<glyph unicode=""" horiz-adv-x="928" d="M201 934l71 528h277l-152 -528h-196zM604 934l74 528h276l-151 -528h-199z" />
|
||||
<glyph unicode="#" horiz-adv-x="1323" d="M41 408l18 206h277l70 232h-252l18 209h289l119 407h217l-117 -407h199l116 407h215l-116 -407h239l-18 -209h-279l-69 -232h258l-19 -206h-297l-116 -408h-220l117 408h-194l-115 -408h-215l113 408h-238zM553 614h197l69 232h-196z" />
|
||||
<glyph unicode="$" d="M51 168v266q198 -107 404 -117l71 322q-163 61 -241 151t-78 214q0 173 127 279.5t350 121.5l35 151h139l-33 -151q166 -22 295 -90l-106 -232q-132 65 -242 74l-63 -299q131 -51 195 -99.5t97 -113t33 -149.5q0 -184 -125.5 -291.5t-367.5 -124.5l-39 -199h-140l44 201 q-209 12 -355 86zM502 1022q0 -79 80 -111l51 246q-62 -7 -96.5 -41t-34.5 -94zM594 322q63 9 102 45t39 98q0 46 -24.5 75.5t-59.5 43.5z" />
|
||||
<glyph unicode="%" horiz-adv-x="1753" d="M115 885q0 169 55.5 311.5t148.5 214.5t216 72q137 0 211.5 -80t74.5 -238q0 -166 -56 -310t-151 -217t-217 -73q-139 0 -210.5 83.5t-71.5 236.5zM231 0l1088 1462h235l-1083 -1462h-240zM360 868q0 -96 56 -96q65 0 112 131t47 275q0 96 -57 96q-63 0 -110.5 -128.5 t-47.5 -277.5zM973 283q0 177 53 322.5t148 219.5t219 74q137 0 211.5 -78.5t74.5 -230.5q0 -167 -54 -313.5t-148 -220.5t-215 -74q-144 0 -216.5 78.5t-72.5 222.5zM1219 285q0 -97 55 -97q41 0 77 55t59.5 154.5t23.5 196.5q0 96 -58 96q-39 0 -75 -56t-59 -154t-23 -195 z" />
|
||||
<glyph unicode="&" horiz-adv-x="1450" d="M68 358q0 145 78.5 248.5t273.5 200.5q-76 130 -76 258q0 195 117.5 307.5t316.5 112.5q169 0 266 -82.5t97 -224.5q0 -280 -365 -426l195 -263q44 57 80.5 121.5t78.5 173.5h300q-133 -313 -310 -497l205 -287h-350l-72 98q-175 -118 -403 -118q-209 0 -320.5 97.5 t-111.5 280.5zM383 387q0 -65 45.5 -108t116.5 -43q115 0 221 59l-225 328q-88 -51 -123 -104.5t-35 -131.5zM621 1085q0 -46 12 -92t29 -73q113 59 155.5 111t42.5 112q0 57 -30 82.5t-70 25.5q-66 0 -102.5 -46.5t-36.5 -119.5z" />
|
||||
<glyph unicode="'" horiz-adv-x="522" d="M201 934l71 528h277l-152 -528h-196z" />
|
||||
<glyph unicode="(" horiz-adv-x="694" d="M74 281q0 339 122.5 626.5t381.5 554.5h262q-255 -278 -377.5 -573.5t-122.5 -618.5q0 -308 117 -594h-234q-149 266 -149 605z" />
|
||||
<glyph unicode=")" horiz-adv-x="694" d="M-147 -324q499 545 499 1192q0 307 -116 594h233q149 -264 149 -604q0 -342 -124 -630.5t-379 -551.5h-262z" />
|
||||
<glyph unicode="*" horiz-adv-x="1116" d="M172 1141l86 237l338 -174l33 369l256 -51l-113 -353l387 29l-18 -254l-338 43l160 -336l-246 -73l-90 337l-197 -278l-207 164l275 248z" />
|
||||
<glyph unicode="+" d="M109 612v219h366v369h219v-369h367v-219h-367v-364h-219v364h-366z" />
|
||||
<glyph unicode="," horiz-adv-x="569" d="M-102 -264q74 167 194 502h285l8 -23q-118 -255 -262 -479h-225z" />
|
||||
<glyph unicode="-" horiz-adv-x="659" d="M41 424l53 250h524l-53 -250h-524z" />
|
||||
<glyph unicode="." horiz-adv-x="584" d="M25 115q0 90 53.5 144t150.5 54q68 0 109 -38t41 -107q0 -87 -55 -141t-144 -54q-73 0 -114 37.5t-41 104.5z" />
|
||||
<glyph unicode="/" horiz-adv-x="862" d="M-90 0l809 1462h295l-809 -1462h-295z" />
|
||||
<glyph unicode="0" d="M66 467q0 297 84 537t228 360.5t333 120.5q399 0 399 -473q0 -470 -168.5 -751t-472.5 -281q-198 0 -300.5 122t-102.5 365zM369 461q0 -115 27.5 -173.5t97.5 -58.5q81 0 150.5 106t116 301t46.5 386q0 111 -30.5 162t-92.5 51q-80 0 -149.5 -104t-117.5 -302t-48 -368z " />
|
||||
<glyph unicode="1" d="M182 1114l566 348h249l-309 -1462h-305l180 829q35 152 76 287q-9 -8 -61.5 -47t-262.5 -170z" />
|
||||
<glyph unicode="2" d="M-49 0l43 213l477 424q180 159 248.5 254.5t68.5 179.5q0 75 -41 114.5t-110 39.5q-66 0 -135.5 -33.5t-171.5 -118.5l-146 203q132 112 252 159.5t250 47.5q190 0 301 -98t111 -259q0 -107 -41 -201t-122.5 -188t-266.5 -245l-269 -222v-10h568l-54 -260h-962z" />
|
||||
<glyph unicode="3" d="M14 59v267q84 -50 182 -75.5t191 -25.5q158 0 243 63.5t85 176.5q0 172 -258 172h-138l46 221h73q167 0 263 62t96 172q0 67 -43 104t-121 37q-134 0 -287 -100l-127 204q124 81 232.5 113.5t246.5 32.5q190 0 298 -90.5t108 -243.5q0 -156 -94.5 -262t-261.5 -135v-4 q131 -26 198.5 -106.5t67.5 -201.5q0 -133 -74 -238t-212 -163.5t-327 -58.5q-239 0 -387 79z" />
|
||||
<glyph unicode="4" d="M-25 303l48 234l770 925h311l-195 -919h170l-51 -240h-170l-63 -303h-293l63 303h-590zM305 543h311l58 248q12 58 40 164t42 141h-6q-35 -63 -132 -181z" />
|
||||
<glyph unicode="5" d="M27 61v269q174 -99 352 -99q154 0 241 71t87 194q0 94 -57.5 141t-166.5 47q-102 0 -213 -33l-104 78l207 733h755l-55 -262h-489l-88 -293q72 15 127 15q183 0 289 -103t106 -287q0 -167 -71.5 -292t-208.5 -192.5t-330 -67.5q-117 0 -218.5 23t-162.5 58z" />
|
||||
<glyph unicode="6" d="M88 469q0 202 61 395.5t167.5 335t256.5 213.5t357 72q125 0 223 -27l-51 -246q-84 25 -191 25q-194 0 -313.5 -108t-185.5 -345h4q115 166 311 166q157 0 242.5 -97t85.5 -273q0 -169 -71 -313.5t-190.5 -215.5t-277.5 -71q-212 0 -320 127t-108 362zM383 422 q0 -91 40 -143t107 -52q99 0 161.5 94t62.5 236q0 71 -33.5 113.5t-102.5 42.5q-60 0 -114.5 -35.5t-87.5 -95.5t-33 -160z" />
|
||||
<glyph unicode="7" d="M78 0l737 1202h-629l56 260h975l-41 -194l-752 -1268h-346z" />
|
||||
<glyph unicode="8" d="M55 350q0 298 348 426q-165 132 -165 299q0 119 58 212.5t168 145.5t257 52q123 0 215.5 -42t141 -118t48.5 -174q0 -134 -80.5 -233.5t-230.5 -151.5q217 -141 217 -365q0 -122 -63.5 -218.5t-181 -149.5t-273.5 -53q-214 0 -336.5 100t-122.5 270zM352 383 q0 -81 50 -128.5t135 -47.5q93 0 147.5 53.5t54.5 138.5q0 73 -36.5 131.5t-120.5 112.5q-116 -45 -173 -107t-57 -153zM528 1094q0 -132 123 -201q185 72 185 221q0 68 -39.5 107t-102.5 39q-76 0 -121 -46.5t-45 -119.5z" />
|
||||
<glyph unicode="9" d="M86 12v256q111 -41 227 -41q121 0 207.5 49t144 138.5t99.5 257.5h-4q-111 -158 -295 -158q-163 0 -252.5 103.5t-89.5 285.5q0 166 73 305.5t196 208t286 68.5q203 0 308.5 -123t105.5 -361q0 -280 -99 -533t-264 -370.5t-403 -117.5q-128 0 -240 32zM424 928 q0 -87 37.5 -131.5t105.5 -44.5q60 0 111.5 36.5t82 100t30.5 158.5q0 84 -35.5 137t-110.5 53q-65 0 -115.5 -42t-78 -114t-27.5 -153z" />
|
||||
<glyph unicode=":" horiz-adv-x="584" d="M25 115q0 90 53.5 144t150.5 54q68 0 109 -38t41 -107q0 -87 -55 -141t-144 -54q-73 0 -114 37.5t-41 104.5zM207 940q0 92 55.5 145.5t149.5 53.5q68 0 108.5 -38.5t40.5 -107.5q0 -86 -54.5 -140t-144.5 -54q-72 0 -113.5 36.5t-41.5 104.5z" />
|
||||
<glyph unicode=";" horiz-adv-x="584" d="M-102 -264q74 167 194 502h285l8 -23q-118 -255 -262 -479h-225zM207 940q0 92 55.5 145.5t149.5 53.5q68 0 108.5 -38.5t40.5 -107.5q0 -86 -54.5 -140t-144.5 -54q-72 0 -113.5 36.5t-41.5 104.5z" />
|
||||
<glyph unicode="<" d="M109 641v143l952 496v-240l-643 -317l643 -281v-239z" />
|
||||
<glyph unicode="=" d="M109 418v219h952v-219h-952zM109 807v217h952v-217h-952z" />
|
||||
<glyph unicode=">" d="M109 203v239l643 281l-643 317v240l952 -496v-143z" />
|
||||
<glyph unicode="?" horiz-adv-x="940" d="M166 115q0 91 55 144.5t150 53.5q68 0 108.5 -38t40.5 -107q0 -87 -55 -141t-143 -54q-74 0 -115 38t-41 104zM178 1358q230 125 445 125q177 0 280 -87.5t103 -244.5q0 -83 -28.5 -149.5t-82.5 -123t-190 -147.5q-64 -43 -96.5 -73t-52.5 -64.5t-38 -108.5h-258l14 78 q19 103 73.5 177t172.5 155q124 84 157.5 127t33.5 96q0 119 -133 119q-50 0 -106.5 -16t-201.5 -84z" />
|
||||
<glyph unicode="@" horiz-adv-x="1753" d="M92 500q0 279 120.5 497t343 341.5t497.5 123.5q318 0 499 -163.5t181 -458.5q0 -173 -64 -321t-177.5 -231t-254.5 -83q-88 0 -144.5 38.5t-72.5 108.5h-6q-50 -77 -113 -112t-147 -35q-127 0 -198 79.5t-71 229.5q0 147 67.5 276.5t187.5 205t268 75.5q185 0 327 -55 l-106 -420q-11 -44 -19 -76.5t-8 -64.5q0 -68 58 -68q66 0 124 64t92.5 171t34.5 214q0 213 -123.5 325.5t-359.5 112.5q-203 0 -366.5 -94t-255 -266t-91.5 -392q0 -243 134 -380.5t376 -137.5q117 0 219.5 20t221.5 66v-186q-230 -90 -465 -90q-217 0 -378 85.5 t-246 241.5t-85 359zM713 526q0 -65 24.5 -102t69.5 -37q141 0 213 270l57 222q-36 10 -82 10q-82 0 -145.5 -51.5t-100 -137t-36.5 -174.5z" />
|
||||
<glyph unicode="A" horiz-adv-x="1286" d="M-123 0l766 1468h373l147 -1468h-297l-24 348h-473l-172 -348h-320zM494 608h333l-26 350q-10 131 -10 253v36q-44 -120 -109 -254z" />
|
||||
<glyph unicode="B" horiz-adv-x="1270" d="M53 0l309 1462h426q229 0 346 -81.5t117 -243.5q0 -150 -83 -247.5t-236 -129.5v-6q100 -26 159.5 -96.5t59.5 -180.5q0 -229 -153 -353t-423 -124h-522zM412 256h180q117 0 183.5 58t66.5 161q0 162 -183 162h-165zM545 883h149q121 0 181.5 48.5t60.5 139.5 q0 137 -170 137h-152z" />
|
||||
<glyph unicode="C" horiz-adv-x="1253" d="M123 553q0 262 104 482.5t278 335t400 114.5q125 0 222 -22.5t208 -82.5l-118 -250q-106 59 -175 78t-137 19q-132 0 -237.5 -81t-169.5 -238.5t-64 -338.5q0 -167 68.5 -248t218.5 -81q146 0 338 77v-260q-199 -77 -400 -77q-254 0 -395 149.5t-141 423.5z" />
|
||||
<glyph unicode="D" horiz-adv-x="1386" d="M53 0l309 1462h396q270 0 417.5 -143t147.5 -410q0 -280 -98 -486.5t-283.5 -314.5t-437.5 -108h-451zM412 256h106q148 0 258 76t172 223.5t62 337.5q0 154 -72.5 234.5t-208.5 80.5h-115z" />
|
||||
<glyph unicode="E" horiz-adv-x="1110" d="M53 0l309 1462h818l-54 -254h-512l-67 -321h477l-55 -254h-477l-80 -377h512l-54 -256h-817z" />
|
||||
<glyph unicode="F" horiz-adv-x="1087" d="M53 0l309 1462h814l-54 -254h-508l-79 -377h473l-56 -253h-473l-121 -578h-305z" />
|
||||
<glyph unicode="G" horiz-adv-x="1413" d="M123 549q0 268 107 484.5t301 334t448 117.5q218 0 410 -99l-115 -251q-74 40 -148 64t-161 24q-153 0 -273.5 -83t-189 -236.5t-68.5 -330.5q0 -172 72.5 -252.5t222.5 -80.5q76 0 170 24l66 299h-267l56 258h563l-162 -762q-134 -46 -248.5 -62.5t-242.5 -16.5 q-259 0 -400 147t-141 422z" />
|
||||
<glyph unicode="H" horiz-adv-x="1434" d="M53 0l309 1462h306l-121 -573h471l121 573h305l-309 -1462h-306l134 631h-471l-134 -631h-305z" />
|
||||
<glyph unicode="I" horiz-adv-x="659" d="M53 0l312 1462h305l-312 -1462h-305z" />
|
||||
<glyph unicode="J" horiz-adv-x="678" d="M-322 -150q88 -20 164 -20q99 0 160.5 60.5t89.5 191.5l293 1380h305l-303 -1423q-52 -245 -175.5 -357t-346.5 -112q-94 0 -187 27v253z" />
|
||||
<glyph unicode="K" horiz-adv-x="1255" d="M53 0l309 1462h306l-152 -702l158 205l409 497h361l-594 -700l291 -762h-338l-211 592l-125 -70l-109 -522h-305z" />
|
||||
<glyph unicode="L" horiz-adv-x="1061" d="M53 0l309 1462h306l-256 -1206h512l-54 -256h-817z" />
|
||||
<glyph unicode="M" horiz-adv-x="1802" d="M53 0l309 1462h404l68 -1093h4l551 1093h423l-309 -1462h-280l145 692q53 247 105 441h-5l-569 -1133h-281l-61 1133h-4q-11 -88 -38 -231t-187 -902h-275z" />
|
||||
<glyph unicode="N" horiz-adv-x="1546" d="M53 0l309 1462h357l340 -1077h4q12 76 39 217t180 860h274l-309 -1462h-342l-356 1106h-6l-4 -32q-32 -216 -66 -386l-145 -688h-275z" />
|
||||
<glyph unicode="O" horiz-adv-x="1495" d="M123 537q0 265 99 487.5t273 341.5t402 119q255 0 395 -144t140 -403q0 -283 -99 -506.5t-271 -337.5t-396 -114q-256 0 -399.5 147.5t-143.5 409.5zM434 537q0 -147 66.5 -222t187.5 -75t220.5 87t155.5 246t56 357q0 142 -65 219.5t-183 77.5q-121 0 -222 -91.5 t-158.5 -251.5t-57.5 -347z" />
|
||||
<glyph unicode="P" horiz-adv-x="1188" d="M53 0l309 1462h338q242 0 366 -106.5t124 -319.5q0 -241 -169.5 -378.5t-467.5 -137.5h-86l-109 -520h-305zM522 774h56q142 0 223.5 69t81.5 185q0 180 -195 180h-74z" />
|
||||
<glyph unicode="Q" horiz-adv-x="1495" d="M123 537q0 265 99 487.5t273 341.5t402 119q255 0 395 -144t140 -403q0 -316 -122.5 -555.5t-334.5 -337.5l254 -393h-359l-178 328h-26q-256 0 -399.5 147.5t-143.5 409.5zM434 537q0 -147 66.5 -222t187.5 -75t220.5 87t155.5 246t56 357q0 142 -65 219.5t-183 77.5 q-121 0 -222 -91.5t-158.5 -251.5t-57.5 -347z" />
|
||||
<glyph unicode="R" horiz-adv-x="1247" d="M53 0l309 1462h359q237 0 356 -102t119 -299q0 -158 -83 -271.5t-239 -168.5l261 -621h-332l-207 561h-119l-119 -561h-305zM530 813h78q131 0 204 57t73 174q0 82 -47.5 123t-149.5 41h-74z" />
|
||||
<glyph unicode="S" horiz-adv-x="1085" d="M41 70v274q193 -108 358 -108q112 0 175 42.5t63 116.5q0 43 -13.5 75.5t-38.5 60.5t-124 102q-138 99 -194 196t-56 209q0 129 62 230.5t176.5 158t263.5 56.5q217 0 397 -99l-109 -233q-156 74 -288 74q-83 0 -136 -45t-53 -119q0 -61 33 -106.5t148 -120.5 q121 -80 181 -176.5t60 -225.5q0 -209 -148 -330.5t-401 -121.5q-221 0 -356 90z" />
|
||||
<glyph unicode="T" horiz-adv-x="1087" d="M168 1204l55 258h1010l-55 -258h-353l-254 -1204h-305l254 1204h-352z" />
|
||||
<glyph unicode="U" horiz-adv-x="1415" d="M141 401q0 72 15 138l196 923h305l-194 -919q-17 -74 -17 -125q0 -178 189 -178q123 0 195 76.5t104 228.5l194 917h306l-201 -946q-57 -266 -218 -401t-419 -135q-212 0 -333.5 113.5t-121.5 307.5z" />
|
||||
<glyph unicode="V" horiz-adv-x="1208" d="M184 1462h295l51 -880q4 -45 4 -133q-2 -103 -6 -150h7q78 221 110 283l432 880h316l-748 -1462h-334z" />
|
||||
<glyph unicode="W" horiz-adv-x="1831" d="M184 1462h287l6 -798q0 -52 -4 -173t-10 -174h6q22 64 67 180.5t60 145.5l369 819h270l21 -873q0 -146 -9 -272h6q43 129 131 349l330 796h309l-647 -1462h-346l-22 721l-2 139q0 88 4 158h-4q-46 -146 -115 -299l-324 -719h-338z" />
|
||||
<glyph unicode="X" horiz-adv-x="1241" d="M-117 0l576 764l-238 698h320l153 -518l363 518h344l-545 -725l268 -737h-331l-172 543l-396 -543h-342z" />
|
||||
<glyph unicode="Y" horiz-adv-x="1155" d="M186 1462h312l129 -592l374 592h342l-618 -903l-119 -559h-303l119 559z" />
|
||||
<glyph unicode="Z" horiz-adv-x="1098" d="M-61 0l38 201l777 1005h-543l53 256h936l-41 -202l-782 -1004h596l-53 -256h-981z" />
|
||||
<glyph unicode="[" horiz-adv-x="678" d="M-37 -324l381 1786h473l-45 -211h-215l-291 -1364h215l-45 -211h-473z" />
|
||||
<glyph unicode="\" horiz-adv-x="862" d="M221 1462h260l224 -1462h-267z" />
|
||||
<glyph unicode="]" horiz-adv-x="678" d="M-137 -324l45 211h213l291 1364h-215l45 211h473l-381 -1786h-471z" />
|
||||
<glyph unicode="^" horiz-adv-x="1081" d="M20 520l619 950h147l277 -950h-223l-174 633l-402 -633h-244z" />
|
||||
<glyph unicode="_" horiz-adv-x="819" d="M-186 -324l30 140h822l-31 -140h-821z" />
|
||||
<glyph unicode="`" horiz-adv-x="1135" d="M508 1548v21h311q36 -148 115 -303v-25h-184q-71 69 -138.5 153.5t-103.5 153.5z" />
|
||||
<glyph unicode="a" horiz-adv-x="1217" d="M90 385q0 198 72 377.5t189 278t257 98.5q97 0 167.5 -42t109.5 -122h8l57 143h232l-238 -1118h-229l14 145h-4q-134 -165 -319 -165q-147 0 -231.5 106.5t-84.5 298.5zM395 399q0 -88 33.5 -132t95.5 -44q69 0 133 67t103 181.5t39 259.5q0 71 -38.5 117.5t-101.5 46.5 q-68 0 -129.5 -72t-98 -190t-36.5 -234z" />
|
||||
<glyph unicode="b" horiz-adv-x="1219" d="M37 0l330 1556h301l-62 -288q-41 -182 -84 -299h8q78 98 142.5 134t140.5 36q146 0 230.5 -108t84.5 -298t-68 -367.5t-187 -281.5t-263 -104q-194 0 -276 163h-8l-58 -143h-231zM420 399q0 -80 37 -128t102 -48q67 0 128 69t98.5 189.5t37.5 237.5q0 176 -131 176 q-68 0 -130 -65t-102 -180.5t-40 -250.5z" />
|
||||
<glyph unicode="c" horiz-adv-x="989" d="M90 391q0 212 74.5 385.5t209.5 268t308 94.5q182 0 328 -72l-92 -229q-54 23 -106 40t-118 17q-85 0 -153.5 -64t-107 -175.5t-38.5 -239.5q0 -96 45.5 -144.5t126.5 -48.5q76 0 141 23.5t134 58.5v-246q-152 -79 -336 -79q-201 0 -308.5 107.5t-107.5 303.5z" />
|
||||
<glyph unicode="d" horiz-adv-x="1217" d="M90 387q0 196 71.5 374.5t188.5 278t258 99.5q82 0 141.5 -37t112.5 -127h8l2 28q6 110 25 195l76 358h301l-330 -1556h-229l14 145h-4q-71 -87 -148.5 -126t-170.5 -39q-147 0 -231.5 107t-84.5 300zM395 399q0 -176 137 -176q66 0 128.5 68.5t100.5 182.5t38 245 q0 80 -37.5 128t-102.5 48q-68 0 -129.5 -72t-98 -190t-36.5 -234z" />
|
||||
<glyph unicode="e" horiz-adv-x="1141" d="M90 412q0 207 82.5 377.5t223.5 260t319 89.5q177 0 276 -81.5t99 -223.5q0 -187 -167 -288.5t-477 -101.5h-51l-2 -21v-20q0 -91 51.5 -143.5t147.5 -52.5q87 0 158 19t172 67v-227q-172 -86 -390 -86q-210 0 -326 113t-116 319zM428 647h45q155 0 241.5 48.5 t86.5 131.5q0 95 -105 95q-88 0 -166 -80t-102 -195z" />
|
||||
<glyph unicode="f" horiz-adv-x="764" d="M-219 -225q61 -21 115 -21q61 0 107 40t65 130l204 965h-163l30 145l183 84l18 84q41 190 138.5 277.5t273.5 87.5q131 0 235 -49l-80 -224q-69 31 -133 31q-57 0 -92 -40t-47 -105l-12 -62h219l-49 -229h-220l-215 -1010q-77 -371 -403 -371q-104 0 -174 25v242z" />
|
||||
<glyph unicode="g" horiz-adv-x="1108" d="M-115 -209q0 102 68.5 175.5t214.5 121.5q-74 47 -74 133q0 71 44.5 122.5t146.5 98.5q-65 49 -96 112t-31 153q0 199 125.5 315.5t341.5 116.5q83 0 166 -23h395l-35 -166l-174 -41q16 -52 16 -118q0 -195 -121 -308.5t-329 -113.5q-59 0 -99 10q-84 -27 -84 -78 q0 -34 30 -49t89 -23l137 -18q163 -21 237.5 -84.5t74.5 -183.5q0 -211 -156 -323t-446 -112q-208 0 -324.5 75.5t-116.5 207.5zM150 -172q0 -115 194 -115q151 0 228 45t77 127q0 39 -32.5 60t-137.5 35l-114 14q-106 -14 -160.5 -57t-54.5 -109zM442 680q0 -119 103 -119 q75 0 121.5 76.5t46.5 193.5t-99 117q-77 0 -124.5 -76.5t-47.5 -191.5z" />
|
||||
<glyph unicode="h" horiz-adv-x="1237" d="M37 0l330 1556h301q-39 -181 -60 -278t-86 -309h8q62 77 138 123.5t176 46.5q138 0 213.5 -83.5t75.5 -238.5q0 -73 -23 -180l-133 -637h-301l137 653q16 68 16 119q0 123 -108 123q-92 0 -167 -114t-118 -318l-98 -463h-301z" />
|
||||
<glyph unicode="i" horiz-adv-x="608" d="M37 0l237 1118h301l-237 -1118h-301zM322 1380q0 87 47.5 131.5t134.5 44.5q73 0 111 -31t38 -89q0 -80 -44 -129.5t-136 -49.5q-151 0 -151 123z" />
|
||||
<glyph unicode="j" horiz-adv-x="608" d="M-264 -225q61 -21 114 -21q137 0 173 170l253 1194h302l-265 -1239q-77 -371 -403 -371q-104 0 -174 25v242zM324 1380q0 87 47.5 131.5t134.5 44.5q73 0 111 -31t38 -89q0 -80 -44 -129.5t-136 -49.5q-151 0 -151 123z" />
|
||||
<glyph unicode="k" horiz-adv-x="1163" d="M37 0l330 1556h301l-148 -694q-8 -41 -29 -117l-28 -102h4l453 475h344l-498 -504l285 -614h-336l-183 420l-120 -72l-74 -348h-301z" />
|
||||
<glyph unicode="l" horiz-adv-x="608" d="M37 0l330 1556h301l-330 -1556h-301z" />
|
||||
<glyph unicode="m" horiz-adv-x="1853" d="M37 0l237 1118h230l-21 -207h6q146 228 355 228q219 0 262 -228h6q68 110 160.5 169t197.5 59q136 0 207.5 -85t71.5 -237q0 -76 -23 -180l-133 -637h-301l138 653q16 68 16 119q0 123 -98 123q-92 0 -166.5 -112t-118.5 -318l-96 -465h-301l137 653q16 68 16 119 q0 123 -98 123q-92 0 -167 -114t-118 -318l-98 -463h-301z" />
|
||||
<glyph unicode="n" horiz-adv-x="1237" d="M37 0l237 1118h230l-21 -207h6q146 228 355 228q138 0 213.5 -83.5t75.5 -238.5q0 -73 -23 -180l-133 -637h-301l137 653q16 68 16 119q0 123 -108 123q-92 0 -167 -114t-118 -318l-98 -463h-301z" />
|
||||
<glyph unicode="o" horiz-adv-x="1198" d="M90 410q0 213 71.5 379.5t206.5 258t316 91.5q196 0 310 -118t114 -325q0 -211 -70.5 -374t-203.5 -252.5t-316 -89.5q-195 0 -311.5 117.5t-116.5 312.5zM393 410q0 -185 150 -185q75 0 135 61.5t93.5 171t33.5 238.5q0 197 -143 197q-75 0 -134.5 -61t-97 -179 t-37.5 -243z" />
|
||||
<glyph unicode="p" horiz-adv-x="1219" d="M-68 -492l342 1610h230l-17 -170h9q138 191 317 191q146 0 230.5 -107.5t84.5 -300.5q0 -191 -68.5 -367.5t-187.5 -280t-262 -103.5q-83 0 -143 37t-111 126h-8q-12 -159 -43 -295l-72 -340h-301zM420 399q0 -80 37 -128t102 -48q67 0 128 69t98.5 189.5t37.5 237.5 q0 176 -131 176q-68 0 -131.5 -67.5t-102 -180t-38.5 -248.5z" />
|
||||
<glyph unicode="q" horiz-adv-x="1217" d="M90 385q0 198 72 377.5t189 278t257 98.5q86 0 152.5 -37.5t124.5 -126.5h8l57 143h232l-342 -1610h-301q47 218 73 337.5t84 304.5h-8q-72 -94 -143 -132t-154 -38q-88 0 -156 47.5t-106.5 138.5t-38.5 219zM395 399q0 -88 36.5 -132t103.5 -44q64 0 127.5 70t100 181 t36.5 245q0 80 -37.5 128t-102.5 48q-68 0 -129.5 -72t-98 -190t-36.5 -234z" />
|
||||
<glyph unicode="r" horiz-adv-x="862" d="M37 0l237 1118h230l-21 -207h6q147 228 353 228q59 0 96 -11l-66 -290q-45 16 -100 16q-116 0 -203.5 -91.5t-124.5 -262.5l-106 -500h-301z" />
|
||||
<glyph unicode="s" horiz-adv-x="969" d="M23 45v248q157 -90 319 -90q80 0 131 32.5t51 88.5q0 43 -37 77t-131 86q-121 68 -169 135.5t-48 159.5q0 170 110.5 263.5t315.5 93.5q201 0 363 -95l-99 -215q-140 84 -258 84q-57 0 -92 -25.5t-35 -68.5q0 -39 32 -68.5t120 -74.5q123 -63 178 -137t55 -170 q0 -188 -124.5 -288.5t-346.5 -100.5q-107 0 -186.5 15t-148.5 50z" />
|
||||
<glyph unicode="t" horiz-adv-x="840" d="M94 889l29 147l196 84l132 236h194l-49 -238h283l-50 -229h-282l-115 -539q-6 -30 -6 -53q0 -74 88 -74q65 0 162 35v-225q-111 -53 -266 -53q-150 0 -220.5 63t-70.5 195q0 50 12 112l115 539h-152z" />
|
||||
<glyph unicode="u" horiz-adv-x="1237" d="M111 301q0 93 24 213l127 604h301l-137 -653q-16 -68 -16 -119q0 -123 108 -123q92 0 167 114t118 318l98 463h301l-237 -1118h-230l21 207h-6q-145 -227 -355 -227q-138 0 -211 82.5t-73 238.5z" />
|
||||
<glyph unicode="v" horiz-adv-x="1049" d="M102 1118h295l45 -586q7 -133 7 -231h6q55 153 92 223l297 594h323l-604 -1118h-323z" />
|
||||
<glyph unicode="w" horiz-adv-x="1614" d="M125 1118h281l4 -495l-4 -167l-7 -171h4q6 20 14 41.5t51 136.5t46 119l231 536h328v-536q0 -142 -10 -297h6l28 80q73 208 95 258l219 495h307l-530 -1118h-330l-6 520q0 155 10 340h-6q-62 -178 -123 -319l-233 -541h-324z" />
|
||||
<glyph unicode="x" horiz-adv-x="1087" d="M-100 0l479 573l-225 545h321l115 -334l244 334h354l-467 -561l244 -557h-326l-125 342l-264 -342h-350z" />
|
||||
<glyph unicode="y" horiz-adv-x="1063" d="M-141 -233q68 -13 116 -13q84 0 147.5 48t117.5 149l26 49l-164 1118h295l56 -518q14 -122 14 -293h6q20 51 44 119.5t65 153.5l260 538h327l-680 -1278q-177 -332 -483 -332q-90 0 -147 19v240z" />
|
||||
<glyph unicode="z" horiz-adv-x="932" d="M-47 0l35 180l575 705h-397l51 233h750l-43 -200l-566 -685h439l-49 -233h-795z" />
|
||||
<glyph unicode="{" horiz-adv-x="727" d="M-8 459l45 229q122 0 192.5 41.5t92.5 138.5l61 285q38 170 131 239.5t270 69.5h84l-49 -225q-90 -2 -130.5 -34.5t-55.5 -106.5l-66 -297q-45 -207 -276 -236v-8q85 -26 126.5 -82.5t41.5 -134.5q0 -44 -15 -113l-36 -178q-7 -28 -7 -51q0 -54 33.5 -74t91.5 -20v-226 h-53q-167 0 -253.5 63.5t-86.5 184.5q0 57 14 125l39 184q15 69 15 86q0 140 -209 140z" />
|
||||
<glyph unicode="|" d="M455 -465v2015h219v-2015h-219z" />
|
||||
<glyph unicode="}" horiz-adv-x="727" d="M-100 -98q93 3 137 35.5t59 105.5l66 297q25 111 95 166t181 69v9q-168 51 -168 217q0 43 15 112l37 179q6 30 6 51q0 54 -36.5 74t-109.5 20l41 225h33q340 0 340 -248q0 -56 -14 -124l-39 -185q-15 -69 -15 -86q0 -139 209 -139l-45 -229q-122 0 -192.5 -42t-91.5 -139 l-62 -284q-37 -170 -130.5 -240t-270.5 -70h-45v226z" />
|
||||
<glyph unicode="~" d="M109 551v231q101 109 256 109q64 0 117 -14t139 -50q64 -27 111 -41t95 -14q51 0 112 30.5t122 90.5v-231q-103 -109 -256 -109q-59 0 -109 11.5t-147 51.5q-89 38 -127 47t-80 9q-54 0 -116.5 -33t-116.5 -88z" />
|
||||
<glyph unicode="¢" d="M164 584q0 193 62.5 355t178 262.5t267.5 123.5l33 158h188l-35 -158q118 -14 225 -65l-92 -230q-53 23 -105 40t-118 17q-133 0 -216 -143t-83 -336q0 -96 45 -144t127 -48q75 0 140 23.5t134 58.5v-246q-136 -71 -299 -80l-41 -192h-188l49 210q-134 36 -203 136 t-69 258z" />
|
||||
<glyph unicode="£" d="M-12 0l49 246q196 48 244 264l22 104h-192l45 220h192l49 247q41 197 162 300.5t313 103.5q195 0 369 -86l-113 -232q-141 68 -237 68q-75 0 -123 -39.5t-68 -132.5l-47 -229h299l-45 -220h-299l-18 -84q-42 -195 -209 -270h655l-55 -260h-993z" />
|
||||
<glyph unicode="¥" d="M88 221l37 178h252l29 138h-252l39 178h196l-192 747h297l114 -590l371 590h311l-506 -747h203l-39 -178h-252l-28 -138h252l-37 -178h-252l-47 -221h-291l47 221h-252z" />
|
||||
<glyph unicode="©" horiz-adv-x="1704" d="M125 731q0 200 100 375t275 276t377 101q199 0 373.5 -99t276 -275.5t101.5 -377.5q0 -199 -98.5 -373t-272.5 -276t-380 -102q-207 0 -382 103.5t-272.5 276.5t-97.5 371zM266 731q0 -164 81.5 -305t224 -223t305.5 -82q167 0 308 83t221.5 223.5t80.5 303.5 t-80.5 303.5t-222 223.5t-307.5 83q-164 0 -306.5 -82.5t-223.5 -223.5t-81 -304zM485 721q0 225 117.5 351t325.5 126q142 0 284 -72l-75 -174q-114 58 -205 58q-111 0 -163 -73t-52 -214q0 -134 55.5 -203t159.5 -69q43 0 108.5 15.5t124.5 43.5v-191q-131 -57 -262 -57 q-196 0 -307 122.5t-111 336.5z" />
|
||||
<glyph unicode="­" horiz-adv-x="659" d="M41 424l53 250h524l-53 -250h-524z" />
|
||||
<glyph unicode="®" horiz-adv-x="1704" d="M125 731q0 200 100 375t275 276t377 101q199 0 373.5 -99t276 -275.5t101.5 -377.5q0 -199 -98.5 -373t-272.5 -276t-380 -102q-207 0 -382 103.5t-272.5 276.5t-97.5 371zM266 731q0 -164 81.5 -305t224 -223t305.5 -82q167 0 308 83t221.5 223.5t80.5 303.5 t-80.5 303.5t-222 223.5t-307.5 83q-164 0 -306.5 -82.5t-223.5 -223.5t-81 -304zM571 293v874h308q173 0 265.5 -67.5t92.5 -200.5q0 -86 -44 -149.5t-130 -96.5l197 -360h-254l-138 297h-67v-297h-230zM801 758h51q72 0 113 31t41 92q0 59 -35.5 88.5t-116.5 29.5h-53 v-241z" />
|
||||
<glyph unicode="´" horiz-adv-x="1135" d="M483 1241v25q79 88 222 303h335v-17q-46 -56 -154 -152.5t-194 -158.5h-209z" />
|
||||
<glyph unicode=" " horiz-adv-x="786" />
|
||||
<glyph unicode=" " horiz-adv-x="1573" />
|
||||
<glyph unicode=" " horiz-adv-x="786" />
|
||||
<glyph unicode=" " horiz-adv-x="1573" />
|
||||
<glyph unicode=" " horiz-adv-x="524" />
|
||||
<glyph unicode=" " horiz-adv-x="393" />
|
||||
<glyph unicode=" " horiz-adv-x="262" />
|
||||
<glyph unicode=" " horiz-adv-x="262" />
|
||||
<glyph unicode=" " horiz-adv-x="196" />
|
||||
<glyph unicode=" " horiz-adv-x="314" />
|
||||
<glyph unicode=" " horiz-adv-x="87" />
|
||||
<glyph unicode="‐" horiz-adv-x="659" d="M41 424l53 250h524l-53 -250h-524z" />
|
||||
<glyph unicode="‑" horiz-adv-x="659" d="M41 424l53 250h524l-53 -250h-524z" />
|
||||
<glyph unicode="‒" horiz-adv-x="659" d="M41 424l53 250h524l-53 -250h-524z" />
|
||||
<glyph unicode="–" horiz-adv-x="983" d="M41 436l49 230h852l-49 -230h-852z" />
|
||||
<glyph unicode="—" horiz-adv-x="1966" d="M41 436l49 230h1835l-49 -230h-1835z" />
|
||||
<glyph unicode="‘" horiz-adv-x="440" d="M115 983q103 227 262 479h225q-91 -213 -194 -501h-285z" />
|
||||
<glyph unicode="’" horiz-adv-x="440" d="M106 961q89 206 195 501h285l8 -22q-103 -227 -262 -479h-226z" />
|
||||
<glyph unicode="“" horiz-adv-x="887" d="M115 983q103 227 262 479h225q-91 -213 -194 -501h-285zM561 983q103 227 262 479h226q-97 -227 -195 -501h-285z" />
|
||||
<glyph unicode="”" horiz-adv-x="887" d="M106 961q89 206 195 501h285l8 -22q-103 -227 -262 -479h-226zM553 961q23 53 46.5 111t148.5 390h284l8 -22q-103 -227 -262 -479h-225z" />
|
||||
<glyph unicode="•" horiz-adv-x="739" d="M104 686q0 106 42.5 194t120 136.5t182.5 48.5q120 0 182.5 -67t62.5 -191q0 -177 -91.5 -277t-248.5 -100q-117 0 -183.5 67t-66.5 189z" />
|
||||
<glyph unicode="…" horiz-adv-x="1706" d="M25 115q0 90 53.5 144t150.5 54q68 0 109 -38t41 -107q0 -87 -55 -141t-144 -54q-73 0 -114 37.5t-41 104.5zM586 115q0 90 53.5 144t150.5 54q68 0 109 -38t41 -107q0 -87 -55 -141t-144 -54q-73 0 -114 37.5t-41 104.5zM1147 115q0 90 53.5 144t150.5 54q68 0 109 -38 t41 -107q0 -87 -55 -141t-144 -54q-73 0 -114 37.5t-41 104.5z" />
|
||||
<glyph unicode=" " horiz-adv-x="314" />
|
||||
<glyph unicode=" " horiz-adv-x="393" />
|
||||
<glyph unicode="€" d="M41 481l37 178h127q9 67 22 115h-125l39 176h135q87 252 250.5 393.5t374.5 141.5q100 0 179 -23t165 -80l-125 -223q-87 49 -131 63.5t-90 14.5q-97 0 -176 -74.5t-135 -212.5h348l-39 -176h-360q-11 -34 -25 -115h299l-37 -178h-280q0 -120 44.5 -181.5t147.5 -61.5 q133 0 283 63v-258q-126 -63 -330 -63q-446 0 -446 501h-152z" />
|
||||
<glyph unicode="™" horiz-adv-x="1534" d="M106 1313v149h564v-149h-199v-572h-168v572h-197zM715 741v721h248l159 -510l170 510h240v-721h-168v408l4 121h-6l-174 -529h-141l-166 529h-7l5 -111v-418h-164z" />
|
||||
<glyph unicode="" horiz-adv-x="1120" d="M0 1120h1120v-1120h-1120v1120z" />
|
||||
</font>
|
||||
</defs></svg>
|
After Width: | Height: | Size: 26 KiB |
BIN
fonts/OpenSans-BoldItalic-webfont.ttf
Normal file
BIN
fonts/OpenSans-BoldItalic-webfont.woff
Normal file
BIN
fonts/OpenSans-Italic-webfont.eot
Normal file
146
fonts/OpenSans-Italic-webfont.svg
Normal file
@ -0,0 +1,146 @@
|
||||
<?xml version="1.0" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
|
||||
<svg xmlns="http://www.w3.org/2000/svg">
|
||||
<metadata>
|
||||
This is a custom SVG webfont generated by Font Squirrel.
|
||||
Copyright : Digitized data copyright 20102011 Google Corporation
|
||||
Foundry : Ascender Corporation
|
||||
Foundry URL : httpwwwascendercorpcom
|
||||
</metadata>
|
||||
<defs>
|
||||
<font id="OpenSansItalic" horiz-adv-x="1128" >
|
||||
<font-face units-per-em="2048" ascent="1638" descent="-410" />
|
||||
<missing-glyph horiz-adv-x="532" />
|
||||
<glyph unicode=" " horiz-adv-x="532" />
|
||||
<glyph unicode="	" horiz-adv-x="532" />
|
||||
<glyph unicode=" " horiz-adv-x="532" />
|
||||
<glyph unicode="!" horiz-adv-x="530" d="M43 78q0 76 39.5 120t107.5 44q45 0 73 -27.5t28 -81.5q0 -68 -39 -115t-105 -47q-49 0 -76.5 28t-27.5 79zM172 403q49 307 176 1059h207l-274 -1059h-109z" />
|
||||
<glyph unicode=""" horiz-adv-x="791" d="M225 934l72 528h188l-153 -528h-107zM573 934l72 528h189l-154 -528h-107z" />
|
||||
<glyph unicode="#" horiz-adv-x="1323" d="M63 430l13 129h284l101 340h-277l13 127h301l123 436h139l-125 -436h305l127 436h133l-125 -436h264l-12 -127h-291l-98 -340h285l-13 -129h-309l-125 -430h-139l129 430h-303l-127 -430h-133l121 430h-261zM500 559h303l96 340h-303z" />
|
||||
<glyph unicode="$" d="M72 176v154q82 -41 175.5 -63.5t166.5 -22.5l98 452q-139 49 -201.5 123.5t-62.5 188.5q0 159 108 255t299 113l39 176h133l-39 -178q159 -12 283 -76l-63 -135q-121 63 -248 72l-94 -440q149 -55 212.5 -125t63.5 -178q0 -162 -112.5 -263t-309.5 -123l-49 -225h-133 l49 223q-195 14 -315 72zM401 1010q0 -53 34.5 -97.5t107.5 -70.5l84 393q-108 -11 -167 -69t-59 -156zM549 250q107 13 170 75t63 154q0 54 -33 96t-114 74z" />
|
||||
<glyph unicode="%" horiz-adv-x="1624" d="M168 860q0 166 50.5 318.5t136.5 228.5t200 76q116 0 176 -72t60 -205q0 -108 -32 -237.5t-82.5 -217.5t-120.5 -137t-157 -49q-109 0 -170 75t-61 220zM231 0l1086 1462h151l-1085 -1462h-152zM307 864q0 -172 107 -172q52 0 94 39.5t73.5 114t50.5 175t19 171.5 q0 166 -108 166q-66 0 -119 -63t-85 -187.5t-32 -243.5zM909 274q0 166 50.5 318.5t136.5 228.5t200 76q116 0 176 -71.5t60 -204.5q0 -107 -31.5 -236t-82 -217.5t-121 -138t-156.5 -49.5q-110 0 -171 74.5t-61 219.5zM1049 279q0 -173 106 -173q65 0 117 65t86.5 198.5 t34.5 236.5q0 166 -109 166q-67 0 -119.5 -64.5t-84 -188.5t-31.5 -240z" />
|
||||
<glyph unicode="&" horiz-adv-x="1372" d="M66 342q0 148 90 257.5t303 211.5q-103 165 -103 309q0 164 106 264.5t281 100.5q149 0 236.5 -79t87.5 -212q0 -78 -32.5 -137t-87.5 -108t-127.5 -90t-153.5 -83l278 -389q127 110 199 295h168q-101 -236 -283 -412l203 -270h-201l-117 166q-120 -100 -230 -143 t-247 -43q-168 0 -269 96t-101 266zM229 354q0 -106 66.5 -170.5t175.5 -64.5q87 0 168 33t195 124l-306 433q-128 -67 -184 -116t-85.5 -107.5t-29.5 -131.5zM516 1118q0 -120 82 -235q139 71 191 110t83 85t31 104q0 77 -42.5 121.5t-123.5 44.5q-105 0 -163 -60t-58 -170 z" />
|
||||
<glyph unicode="'" horiz-adv-x="444" d="M225 934l72 528h188l-153 -528h-107z" />
|
||||
<glyph unicode="(" horiz-adv-x="584" d="M82 272q0 339 120 627t384 563h157q-246 -270 -371.5 -570t-125.5 -618q0 -339 114 -598h-131q-147 266 -147 596z" />
|
||||
<glyph unicode=")" horiz-adv-x="584" d="M-160 -324q496 551 496 1188q0 341 -113 598h131q146 -269 146 -598q0 -341 -121.5 -629.5t-382.5 -558.5h-156z" />
|
||||
<glyph unicode="*" horiz-adv-x="1130" d="M215 1194l55 154l371 -185l41 400l172 -35l-123 -383l422 18l-8 -157l-393 47l180 -383l-166 -52l-113 406l-258 -344l-116 121l309 284z" />
|
||||
<glyph unicode="+" d="M127 651v142h389v391h141v-391h390v-142h-390v-387h-141v387h-389z" />
|
||||
<glyph unicode="," horiz-adv-x="492" d="M-100 -264q126 286 204 502h187l8 -23q-113 -235 -270 -479h-129z" />
|
||||
<glyph unicode="-" horiz-adv-x="639" d="M55 469l35 158h479l-34 -158h-480z" />
|
||||
<glyph unicode="." horiz-adv-x="518" d="M43 74q0 77 40.5 122.5t111.5 45.5q43 0 69.5 -26t26.5 -79q0 -71 -40 -118.5t-108 -47.5q-46 0 -73 26t-27 77z" />
|
||||
<glyph unicode="/" horiz-adv-x="717" d="M-94 0l813 1462h174l-813 -1462h-174z" />
|
||||
<glyph unicode="0" d="M121 477q0 270 82 514.5t216.5 369t307.5 124.5q365 0 365 -471q0 -295 -78.5 -539t-214 -369.5t-314.5 -125.5q-176 0 -270 127.5t-94 369.5zM293 479q0 -172 50 -264t161 -92q115 0 209 114t150.5 328t56.5 453q0 323 -203 323q-113 0 -209 -115.5t-155.5 -323 t-59.5 -423.5z" />
|
||||
<glyph unicode="1" d="M303 1178l449 284h149l-313 -1462h-172l196 913q59 261 88 359q-50 -53 -139 -111l-178 -110z" />
|
||||
<glyph unicode="2" d="M12 0l31 147l465 420q102 93 176.5 163.5t123 133t72 124t23.5 136.5q0 99 -60 157t-163 58q-77 0 -150.5 -28.5t-162.5 -96.5l-82 115q191 154 413 154q176 0 278.5 -88.5t102.5 -243.5q0 -111 -39.5 -204t-131 -197t-294.5 -281l-352 -307v-8h678l-29 -154h-899z" />
|
||||
<glyph unicode="3" d="M47 59v164q94 -49 199 -75.5t190 -26.5q162 0 252 79.5t90 217.5q0 131 -79 198.5t-220 67.5h-131l31 143h139q165 0 274 87t109 227q0 92 -58 146t-157 54q-80 0 -157 -27t-175 -93l-80 118q195 144 424 144q179 0 277 -87t98 -237q0 -156 -101 -264.5t-280 -140.5v-9 q124 -23 195 -106.5t71 -208.5q0 -133 -62 -234.5t-181 -158.5t-283 -57q-210 0 -385 79z" />
|
||||
<glyph unicode="4" d="M16 334l29 158l834 978h196l-207 -983h232l-33 -153h-233l-72 -334h-164l74 334h-656zM219 487h486q46 220 78 373t116 445h-8q-17 -29 -66.5 -96.5t-72.5 -96.5z" />
|
||||
<glyph unicode="5" d="M80 59v164q164 -102 334 -102q191 0 298 96t107 268q0 126 -73.5 199.5t-204.5 73.5q-48 0 -97 -6.5t-139 -30.5l-74 57l197 684h668l-33 -153h-522l-127 -439q87 23 184 23q182 0 289.5 -104.5t107.5 -282.5q0 -161 -73 -283t-204 -182.5t-308 -60.5q-193 0 -330 79z " />
|
||||
<glyph unicode="6" d="M133 424q0 209 60.5 415t163.5 351.5t246 219t327 73.5q111 0 184 -23l-35 -145q-68 22 -170 22q-212 0 -356.5 -149t-212.5 -443h8q59 79 146.5 126t193.5 47q154 0 244 -98.5t90 -270.5q0 -161 -66.5 -294.5t-180.5 -204t-261 -70.5q-182 0 -281.5 115t-99.5 329z M299 416q0 -137 60.5 -216t172.5 -79q94 0 167.5 54t114 149t40.5 208q0 248 -221 248q-66 0 -128 -28.5t-110 -76t-72 -104.5t-24 -155z" />
|
||||
<glyph unicode="7" d="M174 0l768 1313h-719l31 149h891l-27 -139l-764 -1323h-180z" />
|
||||
<glyph unicode="8" d="M96 346q0 148 95 256t296 184q-95 69 -135.5 144.5t-40.5 171.5q0 111 54.5 198.5t153.5 136t222 48.5q174 0 271.5 -86.5t97.5 -235.5q0 -129 -78 -225t-266 -176q127 -78 180 -165t53 -202q0 -122 -60 -217.5t-172.5 -146.5t-264.5 -51q-190 0 -298 98.5t-108 267.5z M270 354q0 -107 69 -170t181 -63q139 0 222 74t83 196q0 99 -52 174t-165 135q-185 -60 -261.5 -143.5t-76.5 -202.5zM479 1100q0 -82 39 -144t127 -116q161 60 228 131.5t67 173.5q0 90 -57.5 143t-153.5 53q-114 0 -182 -65.5t-68 -175.5z" />
|
||||
<glyph unicode="9" d="M98 14v158q134 -47 246 -47q202 0 327 141t189 441h-10q-51 -75 -132.5 -118.5t-180.5 -43.5q-169 0 -261 98.5t-92 288.5q0 153 64.5 280.5t180 199t259.5 71.5q180 0 279.5 -114.5t99.5 -334.5q0 -194 -56 -406.5t-147.5 -360t-221.5 -217.5t-302 -70q-136 0 -242 34z M350 938q0 -124 54.5 -190t162.5 -66q76 0 140 28.5t108.5 81.5t65 114t20.5 151q0 131 -59 207.5t-160 76.5q-150 0 -241 -113t-91 -290z" />
|
||||
<glyph unicode=":" horiz-adv-x="518" d="M43 74q0 77 40.5 122.5t111.5 45.5q43 0 69.5 -26t26.5 -79q0 -71 -40 -118.5t-108 -47.5q-46 0 -73 26t-27 77zM203 956q0 77 40 122.5t111 45.5q97 0 97 -104q0 -73 -41.5 -119.5t-106.5 -46.5q-46 0 -73 26.5t-27 75.5z" />
|
||||
<glyph unicode=";" horiz-adv-x="518" d="M-100 -264q126 286 204 502h187l8 -23q-113 -235 -270 -479h-129zM203 956q0 77 40 122.5t111 45.5q97 0 97 -104q0 -73 -41.5 -119.5t-106.5 -46.5q-46 0 -73 26.5t-27 75.5z" />
|
||||
<glyph unicode="<" d="M121 664v98l919 479v-149l-747 -371l747 -328v-151z" />
|
||||
<glyph unicode="=" d="M127 444v142h920v-142h-920zM127 858v139h920v-139h-920z" />
|
||||
<glyph unicode=">" d="M121 242v151l745 328l-745 371v149l919 -479v-98z" />
|
||||
<glyph unicode="?" horiz-adv-x="874" d="M158 74q0 77 40 122.5t111 45.5q44 0 70.5 -26t26.5 -79q0 -73 -41.5 -119.5t-106.5 -46.5q-46 0 -73 26t-27 77zM197 1382q92 51 192 76t182 25q167 0 259 -84t92 -238q0 -123 -65.5 -226.5t-225.5 -223.5q-125 -91 -169 -147.5t-67 -160.5h-135q22 130 72.5 213.5 t165.5 174.5q128 100 168 144t63 94t23 112q0 93 -51.5 143.5t-147.5 50.5q-81 0 -155 -25.5t-140 -56.5z" />
|
||||
<glyph unicode="@" horiz-adv-x="1735" d="M111 504q0 261 126.5 485.5t343.5 347.5t486 123q191 0 329 -75.5t210.5 -213.5t72.5 -319q0 -179 -55 -324t-155 -227t-222 -82q-197 0 -213 184h-8q-111 -184 -291 -184q-115 0 -180.5 75.5t-65.5 209.5q0 157 68 284t188.5 199t260.5 72q65 0 127.5 -12t150.5 -48 q-64 -242 -98 -368t-31 -172q0 -117 102 -117q78 0 141.5 67t100.5 183.5t37 243.5q0 239 -128 367t-370 128q-228 0 -406.5 -107t-277 -295.5t-98.5 -416.5q0 -270 143.5 -418.5t409.5 -148.5q197 0 420 86v-127q-219 -90 -443 -90q-314 0 -494.5 184.5t-180.5 505.5z M639 518q0 -93 33 -134.5t98 -41.5q187 0 272 315l70 258q-63 23 -127 23q-94 0 -174 -55t-126 -153t-46 -212z" />
|
||||
<glyph unicode="A" horiz-adv-x="1137" d="M-117 0l799 1462h174l184 -1462h-170l-57 465h-496l-245 -465h-189zM401 621h394l-35 299q-24 179 -29 350q-37 -88 -80.5 -175t-249.5 -474z" />
|
||||
<glyph unicode="B" horiz-adv-x="1225" d="M86 0l309 1462h375q432 0 432 -336q0 -141 -87 -238t-245 -126v-10q115 -32 176.5 -110.5t61.5 -188.5q0 -212 -152 -332.5t-407 -120.5h-463zM287 145h266q181 0 278 80.5t97 227.5q0 116 -74.5 177.5t-214.5 61.5h-236zM434 836h248q156 0 249 73t93 199 q0 104 -66.5 155.5t-209.5 51.5h-211z" />
|
||||
<glyph unicode="C" horiz-adv-x="1198" d="M150 537q0 261 105.5 485.5t283.5 342.5t403 118q197 0 348 -80l-69 -141q-138 69 -279 69q-174 0 -311.5 -97t-218 -284.5t-80.5 -408.5q0 -187 97.5 -298.5t268.5 -111.5q139 0 322 57v-149q-86 -31 -164 -45t-188 -14q-242 0 -380 149.5t-138 407.5z" />
|
||||
<glyph unicode="D" horiz-adv-x="1364" d="M86 0l309 1462h342q276 0 419.5 -149.5t143.5 -435.5q0 -261 -105 -461t-300 -308t-457 -108h-352zM287 147h162q202 0 355 91.5t234.5 258.5t81.5 382t-103 325.5t-302 110.5h-178z" />
|
||||
<glyph unicode="E" horiz-adv-x="1047" d="M86 0l309 1462h735l-32 -153h-566l-98 -469h527l-29 -152h-529l-114 -536h565l-33 -152h-735z" />
|
||||
<glyph unicode="F" horiz-adv-x="967" d="M86 0l309 1462h735l-30 -153h-568l-110 -533h528l-32 -153h-529l-131 -623h-172z" />
|
||||
<glyph unicode="G" horiz-adv-x="1386" d="M150 528q0 269 101.5 489.5t281.5 343t399 122.5q117 0 219.5 -20t206.5 -64l-66 -152q-77 34 -165.5 59t-194.5 25q-169 0 -307.5 -101.5t-215.5 -283.5t-77 -407q0 -190 102.5 -299t286.5 -109q154 0 260 39l96 444h-289l33 152h459l-154 -711q-216 -75 -419 -75 q-264 0 -410.5 144.5t-146.5 403.5z" />
|
||||
<glyph unicode="H" horiz-adv-x="1389" d="M86 0l309 1462h170l-131 -622h660l133 622h168l-310 -1462h-167l143 688h-660l-145 -688h-170z" />
|
||||
<glyph unicode="I" horiz-adv-x="559" d="M86 0l311 1462h168l-311 -1462h-168z" />
|
||||
<glyph unicode="J" horiz-adv-x="547" d="M-319 -360l6 147q69 -20 145 -20q100 0 165.5 62.5t90.5 182.5l307 1450h170l-309 -1468q-79 -379 -422 -379q-105 0 -153 25z" />
|
||||
<glyph unicode="K" horiz-adv-x="1141" d="M86 0l309 1462h170l-151 -710l700 710h209l-639 -637l350 -825h-186q-72 181 -146.5 359.5t-146.5 361.5l-174 -131l-125 -590h-170z" />
|
||||
<glyph unicode="L" horiz-adv-x="971" d="M86 0l309 1462h170l-276 -1308h565l-33 -154h-735z" />
|
||||
<glyph unicode="M" horiz-adv-x="1714" d="M84 0l309 1462h244l149 -1204h9l659 1204h266l-303 -1462h-174q126 590 193 905.5t94 392.5h-6l-717 -1298h-131l-166 1296h-8q-7 -72 -28.5 -197.5t-37.5 -199.5l-190 -899h-162z" />
|
||||
<glyph unicode="N" horiz-adv-x="1438" d="M84 0l309 1462h180l459 -1220h6q30 224 72 405l174 815h164l-309 -1462h-181l-460 1223h-6q-32 -221 -74 -418l-172 -805h-162z" />
|
||||
<glyph unicode="O" horiz-adv-x="1475" d="M150 549q0 264 96 482t263.5 336t377.5 118q244 0 384 -154t140 -424q0 -269 -88 -481.5t-252 -329t-379 -116.5q-256 0 -399 149.5t-143 419.5zM332 553q0 -199 98 -310.5t266 -111.5q152 0 272.5 97.5t190.5 279.5t70 403q0 199 -94 310.5t-261 111.5q-157 0 -281 -101 t-192.5 -281t-68.5 -398z" />
|
||||
<glyph unicode="P" horiz-adv-x="1159" d="M86 0l309 1462h330q214 0 324 -94.5t110 -282.5q0 -248 -164 -379t-481 -131h-135l-123 -575h-170zM410 721h133q216 0 328 91t112 267q0 125 -69.5 180.5t-213.5 55.5h-163z" />
|
||||
<glyph unicode="Q" horiz-adv-x="1475" d="M150 549q0 264 96 482t263.5 336t377.5 118q244 0 384 -154t140 -424q0 -333 -139 -576t-375 -321l274 -358h-219l-227 330l-17 -2h-16q-256 0 -399 149.5t-143 419.5zM332 553q0 -199 98 -310.5t266 -111.5q158 0 279 100t187.5 280.5t66.5 399.5q0 199 -94 310.5 t-261 111.5q-157 0 -281 -101t-192.5 -281t-68.5 -398z" />
|
||||
<glyph unicode="R" horiz-adv-x="1165" d="M86 0l309 1462h320q446 0 446 -366q0 -348 -368 -449l239 -647h-186l-209 608h-252l-129 -608h-170zM416 754h168q193 0 297 85t104 244q0 121 -67.5 175.5t-219.5 54.5h-166q-102 -494 -116 -559z" />
|
||||
<glyph unicode="S" horiz-adv-x="1028" d="M39 43v170q162 -84 340 -84q162 0 257 75.5t95 207.5q0 78 -52.5 137.5t-195.5 140.5q-151 85 -209.5 170t-58.5 201q0 187 132 304.5t347 117.5q99 0 184.5 -19t180.5 -65l-66 -150q-66 38 -148 60t-151 22q-134 0 -215.5 -69.5t-81.5 -188.5q0 -54 17 -92.5t54 -72.5 t142 -95q147 -88 198.5 -138t78 -110.5t26.5 -140.5q0 -211 -140.5 -327.5t-395.5 -116.5q-106 0 -186.5 14.5t-151.5 48.5z" />
|
||||
<glyph unicode="T" horiz-adv-x="1020" d="M186 1311l33 151h985l-30 -151h-408l-279 -1311h-172l277 1311h-406z" />
|
||||
<glyph unicode="U" horiz-adv-x="1384" d="M164 383q0 81 24 201l189 878h170l-191 -891q-22 -106 -22 -188q0 -117 73 -184.5t218 -67.5q172 0 267.5 87.5t139.5 289.5l205 954h170l-205 -966q-55 -263 -197.5 -389.5t-388.5 -126.5q-230 0 -341 104t-111 299z" />
|
||||
<glyph unicode="V" horiz-adv-x="1122" d="M188 1462h170l97 -930q20 -196 20 -335h4q61 144 162 338l479 927h191l-781 -1462h-180z" />
|
||||
<glyph unicode="W" horiz-adv-x="1745" d="M223 1462h170l31 -901l2 -88q0 -98 -10 -258h6q89 243 156 383l405 864h178l43 -860q9 -153 9 -304l-1 -83h9q75 224 131 354l387 893h182l-664 -1462h-170l-49 965q-8 136 -8 282h-6q-25 -72 -61 -154.5t-504 -1092.5h-174z" />
|
||||
<glyph unicode="X" horiz-adv-x="1063" d="M-104 0l596 776l-263 686h172l203 -563l443 563h186l-555 -694l278 -768h-180l-213 641l-481 -641h-186z" />
|
||||
<glyph unicode="Y" horiz-adv-x="1030" d="M188 1462h170l179 -747l489 747h193l-627 -921l-113 -541h-172l119 549z" />
|
||||
<glyph unicode="Z" horiz-adv-x="1087" d="M-16 0l28 137l924 1170h-655l32 155h858l-26 -139l-924 -1169h697l-33 -154h-901z" />
|
||||
<glyph unicode="[" horiz-adv-x="586" d="M-16 -324l381 1786h387l-31 -141h-227l-318 -1503h227l-32 -142h-387z" />
|
||||
<glyph unicode="\" horiz-adv-x="717" d="M221 1462h154l217 -1462h-154z" />
|
||||
<glyph unicode="]" horiz-adv-x="586" d="M-150 -324l31 142h225l320 1503h-227l30 141h389l-380 -1786h-388z" />
|
||||
<glyph unicode="^" horiz-adv-x="1059" d="M53 553l598 920h109l266 -920h-145l-201 747l-467 -747h-160z" />
|
||||
<glyph unicode="_" horiz-adv-x="807" d="M-188 -324l30 140h811l-30 -140h-811z" />
|
||||
<glyph unicode="`" horiz-adv-x="1135" d="M575 1548v21h181q43 -136 147 -303v-25h-104q-61 61 -128.5 154t-95.5 153z" />
|
||||
<glyph unicode="a" horiz-adv-x="1157" d="M98 350q0 208 71 386t196 279t274 101q92 0 164 -49.5t112 -142.5h11l67 172h127l-233 -1096h-133l26 209h-8q-179 -229 -377 -229q-139 0 -218 99t-79 271zM270 346q0 -114 47 -170.5t132 -56.5q97 0 193 92.5t156 241t60 297.5q0 103 -56 164t-147 61 q-104 0 -193.5 -86t-140.5 -233t-51 -310z" />
|
||||
<glyph unicode="b" horiz-adv-x="1182" d="M59 0l330 1556h168q-51 -242 -78.5 -370.5t-75.5 -300.5h9q93 118 183.5 173.5t186.5 55.5q141 0 220 -99t79 -272q0 -209 -68.5 -386.5t-191 -277t-276.5 -99.5q-97 0 -170.5 51t-110.5 139h-10l-70 -170h-125zM319 346q0 -110 55.5 -168.5t160.5 -58.5q99 0 184.5 81 t137.5 230.5t52 317.5q0 227 -178 227q-96 0 -195.5 -95t-158 -239t-58.5 -295z" />
|
||||
<glyph unicode="c" horiz-adv-x="922" d="M98 389q0 200 74 369t204.5 263.5t293.5 94.5q137 0 268 -51l-47 -141q-120 51 -219 51q-112 0 -204.5 -76.5t-145 -213t-52.5 -296.5q0 -128 66.5 -199t183.5 -71q72 0 136 20t126 47v-143q-124 -63 -276 -63q-194 0 -301 107t-107 302z" />
|
||||
<glyph unicode="d" horiz-adv-x="1182" d="M98 350q0 214 72 392t194.5 275t274.5 97q194 0 281 -190h10q17 155 45 274l78 358h166l-330 -1556h-139l22 209h-8q-101 -125 -189 -177t-182 -52q-139 0 -217 98t-78 272zM270 346q0 -227 179 -227q94 0 194 93.5t158.5 239t58.5 296.5q0 111 -54 169t-157 58 q-101 0 -187.5 -82.5t-139 -232t-52.5 -314.5z" />
|
||||
<glyph unicode="e" horiz-adv-x="1010" d="M98 391q0 188 74.5 360.5t197.5 268.5t271 96q153 0 230 -66.5t77 -185.5q0 -180 -166 -282.5t-475 -102.5h-33l-4 -80q0 -131 61.5 -204.5t190.5 -73.5q63 0 129.5 18t165.5 66v-146q-94 -44 -166 -61.5t-159 -17.5q-184 0 -289 109t-105 302zM299 618h12 q228 0 349.5 59.5t121.5 172.5q0 53 -36.5 88t-114.5 35q-103 0 -193.5 -94t-138.5 -261z" />
|
||||
<glyph unicode="f" horiz-adv-x="641" d="M-229 -330q64 -22 112 -22q76 0 117 62t66 177l227 1082h-193l13 67l206 66l23 100q46 200 127.5 282.5t241.5 82.5q40 0 98 -11.5t90 -25.5l-43 -129q-76 29 -137 29q-87 0 -133.5 -48.5t-75.5 -177.5l-25 -108h238l-25 -127h-237l-232 -1098q-39 -189 -120 -276 t-213 -87q-69 0 -125 21v141z" />
|
||||
<glyph unicode="g" horiz-adv-x="1026" d="M-127 -211q0 105 72 182t233 131q-78 41 -78 121q0 69 51 118.5t142 92.5q-63 32 -103 94.5t-40 145.5q0 194 119.5 318t305.5 124q78 0 154 -20h371l-25 -107l-211 -24q41 -62 41 -158q0 -191 -116.5 -304.5t-311.5 -113.5q-55 0 -84 8q-139 -53 -139 -131 q0 -41 33 -54.5t96 -21.5l117 -14q181 -22 262.5 -88t81.5 -194q0 -184 -146 -285t-411 -101q-194 0 -304 73.5t-110 207.5zM35 -195q0 -77 65 -122t193 -45q182 0 284.5 63.5t102.5 179.5q0 62 -54 98t-184 50l-159 16q-120 -25 -184 -88t-64 -152zM313 680 q0 -85 45 -129.5t125 -44.5q79 0 138 42t90.5 115.5t31.5 159.5q0 82 -44 125t-126 43q-78 0 -136.5 -40.5t-91 -113t-32.5 -157.5z" />
|
||||
<glyph unicode="h" horiz-adv-x="1182" d="M59 0l330 1556h168q-18 -82 -34.5 -159t-34 -156.5t-38 -166.5t-47.5 -189h11q94 123 185.5 176t191.5 53q131 0 202.5 -72t71.5 -204q0 -62 -23 -166q-39 -193 -145 -672h-168l148 692q18 94 18 135q0 148 -147 148q-89 0 -173.5 -59t-149 -171.5t-97.5 -271.5 l-101 -473h-168z" />
|
||||
<glyph unicode="i" horiz-adv-x="520" d="M59 0l234 1096h168l-234 -1096h-168zM340 1376q0 56 32 91.5t83 35.5q88 0 88 -90q0 -55 -33.5 -93t-77.5 -38q-40 0 -66 24.5t-26 69.5z" />
|
||||
<glyph unicode="j" horiz-adv-x="520" d="M-258 -330q61 -22 119 -22q125 0 168 205l264 1243h166l-266 -1258q-36 -171 -114.5 -250.5t-213.5 -79.5q-69 0 -123 21v141zM340 1376q0 56 32 91.5t83 35.5q86 0 86 -90q0 -55 -33.5 -93t-77.5 -38q-38 0 -64 24.5t-26 69.5z" />
|
||||
<glyph unicode="k" horiz-adv-x="999" d="M57 0l330 1556h170l-129 -602q-57 -266 -102 -395h4l526 537h201l-469 -467l295 -629h-187l-235 524l-152 -123l-82 -401h-170z" />
|
||||
<glyph unicode="l" horiz-adv-x="520" d="M57 0l332 1556h168l-332 -1556h-168z" />
|
||||
<glyph unicode="m" horiz-adv-x="1786" d="M59 0l234 1096h139l-22 -203h10q87 119 173.5 171t178.5 52q113 0 174 -65t72 -181h8q86 125 183 185.5t196 60.5q127 0 196.5 -68t69.5 -198q0 -68 -22 -178l-144 -672h-170l148 692q20 104 20 146q0 62 -34.5 99.5t-108.5 37.5q-81 0 -160 -58t-138.5 -164.5 t-90.5 -252.5l-107 -500h-168l148 692q18 94 18 135q0 70 -31 109t-106 39q-84 0 -163.5 -60t-140 -171.5t-93.5 -268.5l-101 -475h-168z" />
|
||||
<glyph unicode="n" horiz-adv-x="1182" d="M59 0l234 1096h139l-22 -203h10q96 122 185.5 172.5t185.5 50.5q127 0 200.5 -69.5t73.5 -194.5q0 -79 -23 -180l-143 -672h-170l148 692q20 104 20 144q0 63 -35.5 101t-113.5 38q-89 0 -173.5 -60t-149 -171t-97.5 -269l-101 -475h-168z" />
|
||||
<glyph unicode="o" horiz-adv-x="1149" d="M98 406q0 190 73 357.5t197 257t275 89.5q190 0 300 -112.5t110 -309.5q0 -188 -72 -355t-195 -258t-278 -91q-192 0 -301 113t-109 309zM270 397q0 -131 63.5 -202.5t182.5 -71.5q104 0 187 73t129.5 207.5t46.5 307.5q0 115 -62.5 186.5t-169.5 71.5q-109 0 -195.5 -74 t-134 -205.5t-47.5 -292.5z" />
|
||||
<glyph unicode="p" horiz-adv-x="1182" d="M-43 -492l336 1588h139l-26 -209h8q179 227 372 227q137 0 216 -97.5t79 -273.5q0 -212 -69 -389t-191 -275.5t-276 -98.5q-97 0 -170 50t-113 140h-10l-4 -38q-3 -25 -10.5 -70t-114.5 -554h-166zM319 346q0 -110 55.5 -168.5t160.5 -58.5q99 0 184.5 81t137.5 230.5 t52 317.5q0 227 -178 227q-96 0 -195.5 -95t-158 -239t-58.5 -295z" />
|
||||
<glyph unicode="q" horiz-adv-x="1182" d="M98 350q0 212 72.5 392t196 277t274.5 97q94 0 165.5 -50.5t108.5 -141.5h13l67 172h125l-336 -1588h-166l101 480q9 45 57 221h-8q-95 -121 -185 -175t-186 -54q-140 0 -219.5 97.5t-79.5 272.5zM270 346q0 -227 179 -227q92 0 190 92t158.5 237t60.5 300 q0 105 -54.5 166t-152.5 61q-101 0 -189 -84.5t-140 -233t-52 -311.5z" />
|
||||
<glyph unicode="r" horiz-adv-x="811" d="M59 0l234 1096h139l-22 -203h10q72 95 119 136.5t98.5 64t114.5 22.5q69 0 120 -14l-36 -150q-53 13 -105 13q-91 0 -170.5 -60t-139 -166.5t-87.5 -236.5l-107 -502h-168z" />
|
||||
<glyph unicode="s" horiz-adv-x="877" d="M8 49v158q70 -42 151 -65t150 -23q126 0 190 50t64 128q0 57 -35 96t-151 107q-130 73 -184 143t-54 166q0 138 101 222.5t266 84.5q171 0 330 -74l-54 -137l-56 25q-101 43 -220 43q-93 0 -146 -43.5t-53 -112.5q0 -56 35.5 -96t146.5 -103q107 -60 153.5 -103 t69.5 -92.5t23 -111.5q0 -156 -110.5 -243.5t-311.5 -87.5q-169 0 -305 69z" />
|
||||
<glyph unicode="t" horiz-adv-x="664" d="M90 969l14 73l185 78l125 228h98l-55 -252h274l-26 -127h-273l-129 -604q-18 -87 -18 -132q0 -56 29 -86t81 -30q55 0 144 26v-129q-34 -14 -84 -24t-80 -10q-125 0 -191.5 59.5t-66.5 177.5q0 66 18 150l127 602h-172z" />
|
||||
<glyph unicode="u" horiz-adv-x="1182" d="M113 248q0 62 22 172l146 676h170l-150 -695q-18 -89 -18 -139q0 -143 147 -143q88 0 173 60t150 172t99 270l100 475h166l-231 -1096h-139l22 203h-12q-98 -125 -187 -174t-184 -49q-128 0 -201 69.5t-73 198.5z" />
|
||||
<glyph unicode="v" horiz-adv-x="946" d="M98 1096h168l64 -613q24 -258 24 -362h6q127 275 179 371l325 604h178l-591 -1096h-228z" />
|
||||
<glyph unicode="w" horiz-adv-x="1468" d="M117 1096h164l18 -594v-88q0 -147 -8 -269h6q47 124 137 322l295 629h182l37 -594q6 -168 6 -262v-53l-2 -42h6q28 86 83 218.5t323 732.5h178l-506 -1096h-205l-32 602q-4 94 -4 172v156h-9l-50 -118l-83 -189l-291 -623h-202z" />
|
||||
<glyph unicode="x" horiz-adv-x="979" d="M-74 0l475 565l-239 531h170l174 -412l330 412h194l-455 -539l252 -557h-168l-192 434l-346 -434h-195z" />
|
||||
<glyph unicode="y" horiz-adv-x="946" d="M-197 -336q63 -18 131 -18q82 0 140.5 50.5t113.5 149.5l76 136l-166 1114h168l74 -545q10 -69 19.5 -203.5t9.5 -216.5h6q35 87 87 200t77 156l325 609h178l-696 -1282q-93 -172 -184 -239t-219 -67q-72 0 -140 21v135z" />
|
||||
<glyph unicode="z" horiz-adv-x="909" d="M-29 0l23 117l694 854h-479l27 125h657l-29 -140l-680 -831h531l-25 -125h-719z" />
|
||||
<glyph unicode="{" horiz-adv-x="715" d="M27 514l32 143q118 0 189.5 43.5t93.5 147.5l68 326q34 160 117.5 224t254.5 64h33l-31 -141q-105 0 -151 -36.5t-66 -123.5l-71 -321q-28 -123 -91 -184t-167 -78v-5q151 -41 151 -213q0 -59 -18 -131l-47 -211q-15 -58 -15 -98q0 -53 36.5 -77.5t119.5 -24.5v-142h-23 q-141 0 -216.5 52.5t-75.5 171.5q0 52 20 141q33 146 51.5 227.5t14.5 102.5q0 143 -209 143z" />
|
||||
<glyph unicode="|" d="M541 -496v2052h139v-2052h-139z" />
|
||||
<glyph unicode="}" horiz-adv-x="715" d="M-74 -182q115 0 167 36t71 123l72 322q25 117 88 179.5t170 80.5v6q-150 42 -150 211q0 59 18 131l50 213q14 65 14 99q0 53 -40.5 77.5t-139.5 24.5l28 141h11q144 0 220.5 -52.5t76.5 -170.5q0 -48 -21 -141l-49 -219q-16 -68 -16 -111q0 -143 209 -143l-33 -144 q-119 0 -190 -43t-93 -147l-67 -326q-36 -164 -119 -226.5t-264 -62.5h-13v142z" />
|
||||
<glyph unicode="~" d="M115 592v151q98 109 243 109q69 0 127 -14.5t144 -51.5q64 -27 112.5 -41t98.5 -14q55 0 119.5 33t115.5 88v-150q-100 -110 -244 -110q-72 0 -135 16.5t-135 48.5q-75 32 -120 44t-93 12q-54 0 -118.5 -34.5t-114.5 -86.5z" />
|
||||
<glyph unicode="¢" d="M225 590q0 185 63.5 344t178.5 258.5t260 120.5l35 170h123l-37 -168q119 -9 217 -49l-47 -142q-109 52 -219 52q-112 0 -204.5 -76.5t-145 -213t-52.5 -296.5q0 -125 66 -198t184 -73q72 0 136 20t126 48v-143q-123 -62 -286 -66l-41 -198h-125l43 215 q-132 34 -203.5 137.5t-71.5 257.5z" />
|
||||
<glyph unicode="£" d="M-23 0l27 141q205 46 258 289l47 221h-200l26 127h201l76 350q75 353 430 353q184 0 336 -86l-66 -133q-146 79 -278 79q-213 0 -263 -237l-69 -326h370l-26 -127h-371l-47 -219q-22 -98 -66 -166.5t-124 -111.5h725l-33 -154h-953z" />
|
||||
<glyph unicode="¥" d="M127 266l29 133h290l33 160h-291l29 133h225l-202 770h163l179 -747l491 747h187l-533 -770h231l-28 -133h-297l-33 -160h297l-29 -133h-295l-57 -266h-154l56 266h-291z" />
|
||||
<glyph unicode="©" horiz-adv-x="1704" d="M139 731q0 200 100 375t275 276t377 101q197 0 370 -97t277 -272t104 -383q0 -204 -100.5 -376.5t-273 -273.5t-377.5 -101q-207 0 -382 103.5t-272.5 276.5t-97.5 371zM244 731q0 -173 87 -323.5t237.5 -237t322.5 -86.5q174 0 323 87t236.5 235.5t87.5 324.5 q0 174 -87 323t-235.5 236.5t-324.5 87.5q-174 0 -323 -87t-236.5 -235.5t-87.5 -324.5zM520 733q0 208 110 330.5t300 122.5q130 0 248 -60l-60 -120q-106 53 -190 53q-125 0 -191.5 -87t-66.5 -241q0 -169 65 -249.5t193 -80.5q82 0 211 43v-122q-66 -28 -113 -38 t-104 -10q-192 0 -297 119.5t-105 339.5z" />
|
||||
<glyph unicode="­" horiz-adv-x="639" d="M55 469l35 158h479l-34 -158h-480z" />
|
||||
<glyph unicode="®" horiz-adv-x="1704" d="M139 731q0 200 100 375t275 276t377 101q197 0 370 -97t277 -272t104 -383q0 -204 -100.5 -376.5t-273 -273.5t-377.5 -101q-207 0 -382 103.5t-272.5 276.5t-97.5 371zM244 731q0 -173 87 -323.5t237.5 -237t322.5 -86.5q174 0 323 87t236.5 235.5t87.5 324.5 q0 174 -87 323t-235.5 236.5t-324.5 87.5q-174 0 -323 -87t-236.5 -235.5t-87.5 -324.5zM645 291v880h229q163 0 241.5 -63t78.5 -193q0 -78 -47.5 -141t-132.5 -98l227 -385h-149l-207 352h-113v-352h-127zM772 762h92q195 0 195 149q0 76 -47.5 107t-149.5 31h-90v-287z " />
|
||||
<glyph unicode="´" horiz-adv-x="1135" d="M532 1241v27q56 60 125.5 151.5t106.5 149.5h190v-21q-38 -49 -140 -151t-177 -156h-105z" />
|
||||
<glyph unicode=" " horiz-adv-x="784" />
|
||||
<glyph unicode=" " horiz-adv-x="1569" />
|
||||
<glyph unicode=" " horiz-adv-x="784" />
|
||||
<glyph unicode=" " horiz-adv-x="1569" />
|
||||
<glyph unicode=" " horiz-adv-x="523" />
|
||||
<glyph unicode=" " horiz-adv-x="392" />
|
||||
<glyph unicode=" " horiz-adv-x="261" />
|
||||
<glyph unicode=" " horiz-adv-x="261" />
|
||||
<glyph unicode=" " horiz-adv-x="196" />
|
||||
<glyph unicode=" " horiz-adv-x="313" />
|
||||
<glyph unicode=" " horiz-adv-x="87" />
|
||||
<glyph unicode="‐" horiz-adv-x="639" d="M55 469l35 158h479l-34 -158h-480z" />
|
||||
<glyph unicode="‑" horiz-adv-x="639" d="M55 469l35 158h479l-34 -158h-480z" />
|
||||
<glyph unicode="‒" horiz-adv-x="639" d="M55 469l35 158h479l-34 -158h-480z" />
|
||||
<glyph unicode="–" horiz-adv-x="983" d="M55 469l35 160h823l-34 -160h-824z" />
|
||||
<glyph unicode="—" horiz-adv-x="1966" d="M55 469l35 160h1806l-34 -160h-1807z" />
|
||||
<glyph unicode="‘" horiz-adv-x="348" d="M123 983q98 211 270 479h127q-147 -345 -203 -501h-188z" />
|
||||
<glyph unicode="’" horiz-adv-x="348" d="M125 961q134 298 203 501h188l8 -22q-40 -91 -111 -218.5t-159 -260.5h-129z" />
|
||||
<glyph unicode="“" horiz-adv-x="719" d="M123 983q98 211 270 479h127q-147 -345 -203 -501h-188zM492 983q80 181 272 479h127q-162 -379 -203 -501h-188z" />
|
||||
<glyph unicode="”" horiz-adv-x="719" d="M125 961q134 298 203 501h188l8 -22q-40 -91 -111 -218.5t-159 -260.5h-129zM494 961q57 126 115.5 272.5t86.5 228.5h189l10 -22q-94 -206 -274 -479h-127z" />
|
||||
<glyph unicode="•" horiz-adv-x="774" d="M199 684q0 145 73.5 231t198.5 86q92 0 139 -49t47 -141q0 -141 -74 -230t-202 -89q-89 0 -135.5 49.5t-46.5 142.5z" />
|
||||
<glyph unicode="…" horiz-adv-x="1563" d="M563 74q0 77 40.5 122.5t111.5 45.5q43 0 69.5 -26t26.5 -79q0 -71 -40 -118.5t-108 -47.5q-46 0 -73 26t-27 77zM1085 74q0 77 40.5 122.5t111.5 45.5q43 0 69.5 -26t26.5 -79q0 -71 -40 -118.5t-108 -47.5q-46 0 -73 26t-27 77zM43 74q0 77 40.5 122.5t111.5 45.5 q43 0 69.5 -26t26.5 -79q0 -71 -40 -118.5t-108 -47.5q-46 0 -73 26t-27 77z" />
|
||||
<glyph unicode=" " horiz-adv-x="313" />
|
||||
<glyph unicode=" " horiz-adv-x="392" />
|
||||
<glyph unicode="€" d="M63 504l27 131h154q8 80 30 164h-151l27 133h159q97 267 259.5 408t369.5 141q89 0 160 -21.5t141 -70.5l-80 -138q-113 78 -231 78q-140 0 -254 -99t-189 -298h426l-26 -133h-441q-21 -65 -32 -164h381l-29 -131h-361q0 -373 297 -373q123 0 256 55v-147 q-127 -59 -278 -59q-212 0 -328.5 133.5t-116.5 378.5v12h-170z" />
|
||||
<glyph unicode="™" horiz-adv-x="1534" d="M121 1358v104h516v-104h-199v-617h-121v617h-196zM705 741v721h180l182 -557l193 557h170v-721h-121v430q0 73 4 121h-6l-197 -551h-96l-189 551h-6q4 -52 4 -121v-430h-118z" />
|
||||
<glyph unicode="" horiz-adv-x="1095" d="M0 1095h1095v-1095h-1095v1095z" />
|
||||
</font>
|
||||
</defs></svg>
|
After Width: | Height: | Size: 27 KiB |
BIN
fonts/OpenSans-Italic-webfont.ttf
Normal file
BIN
fonts/OpenSans-Italic-webfont.woff
Normal file
BIN
fonts/OpenSans-Light-webfont.eot
Normal file
146
fonts/OpenSans-Light-webfont.svg
Normal file
@ -0,0 +1,146 @@
|
||||
<?xml version="1.0" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
|
||||
<svg xmlns="http://www.w3.org/2000/svg">
|
||||
<metadata>
|
||||
This is a custom SVG webfont generated by Font Squirrel.
|
||||
Copyright : Digitized data copyright 20102011 Google Corporation
|
||||
Foundry : Ascender Corporation
|
||||
Foundry URL : httpwwwascendercorpcom
|
||||
</metadata>
|
||||
<defs>
|
||||
<font id="OpenSansLight" horiz-adv-x="1169" >
|
||||
<font-face units-per-em="2048" ascent="1638" descent="-410" />
|
||||
<missing-glyph horiz-adv-x="532" />
|
||||
<glyph unicode=" " horiz-adv-x="532" />
|
||||
<glyph unicode="	" horiz-adv-x="532" />
|
||||
<glyph unicode=" " horiz-adv-x="532" />
|
||||
<glyph unicode="!" horiz-adv-x="492" d="M164 78q0 98 80 98q82 0 82 -98t-82 -98q-80 0 -80 98zM186 1462h119l-29 -1085h-61z" />
|
||||
<glyph unicode=""" horiz-adv-x="723" d="M133 1462h127l-33 -528h-61zM463 1462h127l-33 -528h-61z" />
|
||||
<glyph unicode="#" horiz-adv-x="1323" d="M55 451v79h299l76 398h-297v80h311l86 454h91l-89 -454h365l88 454h86l-88 -454h285v-80h-301l-76 -398h303v-79h-320l-86 -451h-90l88 451h-360l-86 -451h-88l86 451h-283zM440 530h363l78 398h-363z" />
|
||||
<glyph unicode="$" d="M164 186v103q75 -36 179.5 -61t193.5 -25v508q-145 44 -215 88t-102 104t-32 146q0 124 94.5 208.5t254.5 104.5v192h81v-190q197 -9 351 -72l-33 -90q-141 62 -318 72v-486q213 -66 293 -144t80 -204q0 -133 -99 -217t-274 -106v-236h-81v232q-92 2 -200.5 22.5 t-172.5 50.5zM297 1049q0 -86 57 -141t183 -93v453q-119 -16 -179.5 -76t-60.5 -143zM618 209q122 13 192.5 75t70.5 160q0 85 -63 140.5t-200 95.5v-471z" />
|
||||
<glyph unicode="%" horiz-adv-x="1653" d="M113 1026q0 223 72 340t212 117q139 0 215 -120.5t76 -336.5q0 -226 -75 -343.5t-216 -117.5q-133 0 -208.5 120.5t-75.5 340.5zM211 1026q0 -186 45 -279.5t141 -93.5q193 0 193 373q0 184 -49.5 276.5t-143.5 92.5q-96 0 -141 -92.5t-45 -276.5zM373 0l811 1462h96 l-811 -1462h-96zM965 438q0 225 73.5 341t212.5 116q137 0 213 -120t76 -337q0 -226 -74 -343.5t-215 -117.5q-136 0 -211 121.5t-75 339.5zM1063 438q0 -185 45 -277.5t141 -92.5q193 0 193 370q0 369 -193 369q-96 0 -141 -91.5t-45 -277.5z" />
|
||||
<glyph unicode="&" horiz-adv-x="1460" d="M123 371q0 138 73.5 235t274.5 205l-75 82q-66 71 -98 139t-32 142q0 143 95.5 227t256.5 84q155 0 245.5 -81t90.5 -224q0 -105 -70 -192.5t-253 -194.5l452 -457q61 72 104 157t75 201h96q-63 -246 -209 -426l266 -268h-135l-193 197q-92 -90 -164 -131.5t-157.5 -63.5 t-194.5 -22q-209 0 -328.5 103t-119.5 288zM227 375q0 -143 93 -224t258 -81q128 0 234.5 43.5t209.5 146.5l-483 485q-136 -72 -196.5 -122.5t-88 -109.5t-27.5 -138zM373 1176q0 -79 40 -146t152 -174q159 85 221 159t62 169q0 94 -62 152.5t-168 58.5q-114 0 -179.5 -58 t-65.5 -161z" />
|
||||
<glyph unicode="'" horiz-adv-x="393" d="M133 1462h127l-33 -528h-61z" />
|
||||
<glyph unicode="(" horiz-adv-x="557" d="M82 561q0 265 77.5 496t223.5 405h113q-148 -182 -227 -412.5t-79 -486.5q0 -483 304 -887h-111q-147 170 -224 397t-77 488z" />
|
||||
<glyph unicode=")" horiz-adv-x="557" d="M61 1462h113q147 -175 224 -406.5t77 -494.5t-77.5 -490t-223.5 -395h-111q304 404 304 887q0 257 -79 487.5t-227 411.5z" />
|
||||
<glyph unicode="*" horiz-adv-x="1128" d="M104 1124l19 131l401 -104l-39 405h146l-37 -405l405 104l21 -131l-395 -39l247 -340l-124 -71l-191 379l-180 -379l-125 71l242 340z" />
|
||||
<glyph unicode="+" d="M111 682v82h432v434h82v-434h434v-82h-434v-432h-82v432h-432z" />
|
||||
<glyph unicode="," horiz-adv-x="440" d="M68 -264q77 275 110 502h117l12 -21q-75 -265 -174 -481h-65z" />
|
||||
<glyph unicode="-" horiz-adv-x="659" d="M92 512v82h475v-82h-475z" />
|
||||
<glyph unicode="." horiz-adv-x="487" d="M162 78q0 98 80 98q82 0 82 -98t-82 -98q-80 0 -80 98z" />
|
||||
<glyph unicode="/" horiz-adv-x="698" d="M25 0l544 1462h105l-545 -1462h-104z" />
|
||||
<glyph unicode="0" d="M115 735q0 382 115.5 566t351.5 184q231 0 352 -190.5t121 -559.5q0 -385 -117.5 -570t-355.5 -185q-229 0 -348 190.5t-119 564.5zM223 735q0 -340 89 -502.5t270 -162.5q189 0 275.5 168t86.5 497q0 324 -86.5 492t-275.5 168t-274 -168t-85 -492z" />
|
||||
<glyph unicode="1" d="M199 1165l397 297h86v-1462h-98v1065q0 145 12 301q-15 -15 -31 -29t-309 -243z" />
|
||||
<glyph unicode="2" d="M113 0v88l389 406q164 170 230 260t97 172t31 172q0 131 -86 213t-223 82q-183 0 -350 -133l-54 69q183 154 406 154q191 0 300.5 -102t109.5 -281q0 -145 -73.5 -280.5t-268.5 -334.5l-375 -385v-4h782v-96h-915z" />
|
||||
<glyph unicode="3" d="M94 63v99q84 -44 188.5 -69t196.5 -25q221 0 332 89.5t111 252.5q0 145 -113.5 223t-333.5 78h-158v96h160q182 0 288.5 86.5t106.5 234.5q0 122 -86.5 195.5t-226.5 73.5q-109 0 -199 -30.5t-202 -104.5l-49 67q85 71 205 112.5t243 41.5q202 0 312 -95.5t110 -269.5 q0 -136 -85.5 -229t-229.5 -119v-6q176 -22 268 -112t92 -242q0 -205 -139.5 -317.5t-401.5 -112.5q-223 0 -389 83z" />
|
||||
<glyph unicode="4" d="M43 373v67l725 1030h121v-1011h252v-86h-252v-373h-94v373h-752zM162 459h633v418q0 302 14 507h-8q-20 -37 -123 -188z" />
|
||||
<glyph unicode="5" d="M143 63v103q108 -55 192 -76.5t179 -21.5q192 0 308 101.5t116 274.5q0 163 -113 256t-307 93q-130 0 -272 -39l-60 39l58 669h704v-96h-610l-45 -516q156 29 244 29q234 0 368.5 -113t134.5 -311q0 -225 -140 -350t-386 -125q-109 0 -207 21.5t-164 61.5z" />
|
||||
<glyph unicode="6" d="M131 623q0 285 77.5 479.5t220 288.5t343.5 94q94 0 172 -23v-88q-73 27 -176 27q-247 0 -384.5 -178t-154.5 -518h13q76 98 174 148t207 50q205 0 320.5 -117t115.5 -323q0 -224 -121.5 -353.5t-327.5 -129.5q-222 0 -350.5 169.5t-128.5 473.5zM240 504 q0 -111 49.5 -213.5t134 -162.5t186.5 -60q164 0 255 103t91 294q0 168 -90 262t-245 94q-102 0 -189.5 -45t-139.5 -119.5t-52 -152.5z" />
|
||||
<glyph unicode="7" d="M109 1366v96h946v-73l-604 -1389h-117l602 1366h-827z" />
|
||||
<glyph unicode="8" d="M121 375q0 131 83 230t257 169q-161 76 -227 160.5t-66 202.5q0 105 53 184.5t148.5 122.5t212.5 43q186 0 299.5 -95t113.5 -257q0 -112 -70.5 -198t-228.5 -159q192 -79 270 -173t78 -228q0 -181 -126.5 -289t-339.5 -108q-221 0 -339 101t-118 294zM223 360 q0 -138 93.5 -214t261.5 -76q164 0 264 80.5t100 218.5q0 124 -78.5 201.5t-302.5 162.5q-184 -71 -261 -157t-77 -216zM268 1137q0 -70 31.5 -123.5t91 -97t199.5 -101.5q163 63 234 139t71 183q0 120 -84.5 190t-230.5 70q-141 0 -226.5 -69.5t-85.5 -190.5z" />
|
||||
<glyph unicode="9" d="M111 993q0 220 124.5 356t323.5 136q144 0 252 -75.5t166.5 -221.5t58.5 -346q0 -288 -75.5 -482t-220 -287t-349.5 -93q-104 0 -192 26v86q43 -14 103.5 -21.5t92.5 -7.5q247 0 387 178.5t156 520.5h-12q-73 -96 -174 -147.5t-211 -51.5q-203 0 -316.5 112t-113.5 318z M213 999q0 -174 87 -264t249 -90q101 0 188.5 45t139 119.5t51.5 151.5q0 117 -46.5 219t-130 159.5t-192.5 57.5q-158 0 -252 -106.5t-94 -291.5z" />
|
||||
<glyph unicode=":" horiz-adv-x="487" d="M162 78q0 98 80 98q82 0 82 -98t-82 -98q-80 0 -80 98zM162 971q0 98 80 98q82 0 82 -98q0 -53 -23.5 -76t-58.5 -23q-34 0 -57 23t-23 76z" />
|
||||
<glyph unicode=";" horiz-adv-x="487" d="M76 -264q29 97 62 245.5t48 256.5h117l12 -21q-75 -265 -174 -481h-65zM162 971q0 98 80 98q82 0 82 -98q0 -53 -23.5 -76t-58.5 -23q-34 0 -57 23t-23 76z" />
|
||||
<glyph unicode="<" d="M111 682v61l948 474v-95l-823 -405l823 -355v-96z" />
|
||||
<glyph unicode="=" d="M111 477v82h948v-82h-948zM111 885v82h948v-82h-948z" />
|
||||
<glyph unicode=">" d="M111 266v96l823 355l-823 405v95l948 -474v-61z" />
|
||||
<glyph unicode="?" horiz-adv-x="862" d="M57 1403q110 48 184.5 64t153.5 16q183 0 288 -98.5t105 -270.5q0 -68 -18 -119t-50.5 -94.5t-78.5 -84t-102 -87.5q-64 -54 -98.5 -98.5t-50 -93.5t-15.5 -146v-14h-82v37q0 123 37.5 201t138.5 167l91 79q72 61 103 121t31 138q0 127 -83.5 202t-219.5 75 q-79 0 -148 -17.5t-149 -56.5zM260 78q0 98 80 98q82 0 82 -98t-82 -98q-80 0 -80 98z" />
|
||||
<glyph unicode="@" horiz-adv-x="1815" d="M113 561q0 256 108.5 460.5t307 317.5t448.5 113q215 0 380.5 -89t255 -254.5t89.5 -383.5q0 -228 -90.5 -366t-245.5 -138q-89 0 -144.5 54t-64.5 147h-4q-43 -100 -124 -150.5t-189 -50.5q-148 0 -229 96.5t-81 270.5q0 202 120.5 330.5t314.5 128.5q138 0 286 -41 l-22 -464v-30q0 -104 35 -156.5t116 -52.5q103 0 168.5 116.5t65.5 303.5q0 194 -79 340t-225.5 224.5t-334.5 78.5q-230 0 -405.5 -99.5t-270 -281.5t-94.5 -418q0 -322 167 -497.5t474 -175.5q93 0 188.5 18t231.5 70v-99q-203 -80 -414 -80q-349 0 -544 200.5t-195 557.5 zM633 590q0 -143 55 -215t174 -72q255 0 273 346l16 291q-79 27 -193 27q-149 0 -237 -102.5t-88 -274.5z" />
|
||||
<glyph unicode="A" horiz-adv-x="1229" d="M0 0l588 1468h65l576 -1468h-115l-203 516h-594l-204 -516h-113zM354 608h523l-199 527q-25 62 -60 172q-27 -96 -59 -174z" />
|
||||
<glyph unicode="B" horiz-adv-x="1284" d="M207 0v1462h401q271 0 398 -92t127 -278q0 -127 -77.5 -211.5t-226.5 -108.5v-6q175 -26 257.5 -110.5t82.5 -235.5q0 -202 -134 -311t-380 -109h-448zM309 90h344q406 0 406 330q0 301 -428 301h-322v-631zM309 811h322q206 0 299.5 68.5t93.5 214.5t-105.5 212 t-314.5 66h-295v-561z" />
|
||||
<glyph unicode="C" horiz-adv-x="1272" d="M129 735q0 223 84.5 393t243 262.5t368.5 92.5q214 0 383 -80l-41 -92q-160 80 -336 80q-275 0 -433 -176t-158 -482q0 -313 149 -486t426 -173q184 0 338 47v-90q-145 -51 -362 -51q-308 0 -485 199t-177 556z" />
|
||||
<glyph unicode="D" horiz-adv-x="1446" d="M207 0v1462h395q350 0 532.5 -183t182.5 -534q0 -368 -193 -556.5t-567 -188.5h-350zM309 90h242q655 0 655 651q0 314 -159.5 472.5t-468.5 158.5h-269v-1282z" />
|
||||
<glyph unicode="E" horiz-adv-x="1130" d="M207 0v1462h799v-94h-697v-553h658v-94h-658v-627h697v-94h-799z" />
|
||||
<glyph unicode="F" horiz-adv-x="1028" d="M207 0v1462h801v-94h-699v-620h660v-95h-660v-653h-102z" />
|
||||
<glyph unicode="G" horiz-adv-x="1481" d="M129 729q0 223 91.5 395.5t262 266.5t391.5 94q239 0 429 -88l-41 -92q-190 88 -394 88q-289 0 -458.5 -178.5t-169.5 -481.5q0 -330 161 -496.5t473 -166.5q202 0 343 57v514h-435v96h539v-667q-212 -90 -477 -90q-346 0 -530.5 195.5t-184.5 553.5z" />
|
||||
<glyph unicode="H" horiz-adv-x="1473" d="M207 0v1462h102v-649h854v649h103v-1462h-103v719h-854v-719h-102z" />
|
||||
<glyph unicode="I" horiz-adv-x="516" d="M207 0v1462h102v-1462h-102z" />
|
||||
<glyph unicode="J" horiz-adv-x="506" d="M-184 -254q78 -20 149 -20q242 0 242 264v1472h102v-1462q0 -369 -342 -369q-92 0 -151 27v88z" />
|
||||
<glyph unicode="K" horiz-adv-x="1190" d="M207 0v1462h102v-760l162 162l573 598h130l-599 -618l615 -844h-125l-561 772l-195 -172v-600h-102z" />
|
||||
<glyph unicode="L" horiz-adv-x="1051" d="M207 0v1462h102v-1366h697v-96h-799z" />
|
||||
<glyph unicode="M" horiz-adv-x="1767" d="M207 0v1462h158l518 -1286h6l518 1286h154v-1462h-103v1108q0 116 12 240h-8l-547 -1348h-65l-545 1350h-8q8 -124 8 -254v-1096h-98z" />
|
||||
<glyph unicode="N" horiz-adv-x="1477" d="M207 0v1462h102l865 -1296h6q-9 180 -9 342v954h99v-1462h-103l-866 1298h-8q12 -232 12 -350v-948h-98z" />
|
||||
<glyph unicode="O" horiz-adv-x="1565" d="M129 735q0 349 175.5 549.5t479.5 200.5q306 0 479 -201.5t173 -550.5q0 -348 -174 -550.5t-480 -202.5q-305 0 -479 202.5t-174 552.5zM240 733q0 -314 140 -485.5t402 -171.5q264 0 403.5 170t139.5 487q0 316 -139.5 484.5t-401.5 168.5q-261 0 -402.5 -170 t-141.5 -483z" />
|
||||
<glyph unicode="P" horiz-adv-x="1198" d="M207 0v1462h358q522 0 522 -420q0 -212 -144 -325t-408 -113h-226v-604h-102zM309 692h201q247 0 357 81.5t110 264.5q0 169 -104 250.5t-322 81.5h-242v-678z" />
|
||||
<glyph unicode="Q" horiz-adv-x="1565" d="M129 735q0 349 175.5 549.5t479.5 200.5q306 0 479 -201.5t173 -550.5q0 -294 -126 -486.5t-349 -246.5l333 -348h-166l-282 330l-33 -2h-31q-305 0 -479 202.5t-174 552.5zM240 733q0 -314 140 -485.5t402 -171.5q264 0 403.5 170t139.5 487q0 316 -139.5 484.5 t-401.5 168.5q-261 0 -402.5 -170t-141.5 -483z" />
|
||||
<glyph unicode="R" horiz-adv-x="1217" d="M207 0v1462h348q272 0 402 -100.5t130 -302.5q0 -147 -77.5 -248t-235.5 -145l397 -666h-122l-377 637h-363v-637h-102zM309 725h279q185 0 287 82.5t102 243.5q0 167 -100 243t-326 76h-242v-645z" />
|
||||
<glyph unicode="S" horiz-adv-x="1116" d="M111 39v102q158 -67 403 -67q180 0 285.5 82.5t105.5 216.5q0 83 -35 137.5t-114 99.5t-232 97q-224 77 -309.5 166.5t-85.5 238.5q0 164 128.5 267.5t330.5 103.5q206 0 387 -78l-37 -88q-182 76 -348 76q-162 0 -258 -75t-96 -204q0 -81 29.5 -133t96.5 -93.5 t230 -99.5q171 -59 257 -114.5t125.5 -126t39.5 -170.5q0 -183 -134.5 -290t-357.5 -107q-268 0 -411 59z" />
|
||||
<glyph unicode="T" horiz-adv-x="1073" d="M10 1366v96h1053v-96h-475v-1366h-103v1366h-475z" />
|
||||
<glyph unicode="U" horiz-adv-x="1473" d="M190 520v942h103v-946q0 -211 117 -328.5t331 -117.5q209 0 324 115.5t115 320.5v956h102v-946q0 -252 -146 -394t-407 -142q-254 0 -396.5 142.5t-142.5 397.5z" />
|
||||
<glyph unicode="V" horiz-adv-x="1182" d="M0 1462h109l368 -995q84 -225 113 -338q20 75 79 233l402 1100h111l-547 -1462h-90z" />
|
||||
<glyph unicode="W" horiz-adv-x="1827" d="M51 1462h107l256 -942q15 -57 28 -105.5t23.5 -91t19 -82t15.5 -79.5q24 136 102 413l250 887h113l293 -1018q51 -176 73 -284q13 72 33.5 153t308.5 1149h103l-404 -1462h-84l-321 1128q-40 139 -60 228q-16 -87 -45.5 -200t-322.5 -1156h-86z" />
|
||||
<glyph unicode="X" horiz-adv-x="1102" d="M0 0l492 762l-447 700h115l395 -626l401 626h109l-453 -698l490 -764h-117l-432 682l-440 -682h-113z" />
|
||||
<glyph unicode="Y" horiz-adv-x="1081" d="M0 1462h117l426 -800l428 800h110l-487 -897v-565h-105v557z" />
|
||||
<glyph unicode="Z" horiz-adv-x="1180" d="M82 0v76l856 1290h-817v96h954v-76l-858 -1290h881v-96h-1016z" />
|
||||
<glyph unicode="[" horiz-adv-x="653" d="M174 -324v1786h428v-94h-330v-1597h330v-95h-428z" />
|
||||
<glyph unicode="\" horiz-adv-x="698" d="M25 1462h102l547 -1462h-103z" />
|
||||
<glyph unicode="]" horiz-adv-x="653" d="M51 -229h330v1597h-330v94h428v-1786h-428v95z" />
|
||||
<glyph unicode="^" d="M88 561l465 912h68l460 -912h-100l-395 791l-398 -791h-100z" />
|
||||
<glyph unicode="_" horiz-adv-x="842" d="M-4 -184h850v-82h-850v82z" />
|
||||
<glyph unicode="`" horiz-adv-x="1182" d="M393 1552v17h142q26 -48 98.5 -142t142.5 -170v-16h-69q-96 79 -188.5 171.5t-125.5 139.5z" />
|
||||
<glyph unicode="a" horiz-adv-x="1085" d="M98 289q0 159 132.5 247t383.5 93l207 6v72q0 155 -63 234t-203 79q-151 0 -313 -84l-37 86q179 84 354 84q179 0 267.5 -93t88.5 -290v-723h-73l-25 172h-8q-82 -105 -168.5 -148.5t-204.5 -43.5q-160 0 -249 82t-89 227zM203 285q0 -102 62.5 -158.5t176.5 -56.5 q174 0 274.5 99.5t100.5 276.5v107l-190 -8q-229 -11 -326.5 -71.5t-97.5 -188.5z" />
|
||||
<glyph unicode="b" horiz-adv-x="1219" d="M182 0v1556h99v-391q0 -88 -4 -162l-3 -85h7q62 98 149.5 144t210.5 46q228 0 343.5 -143.5t115.5 -419.5q0 -271 -121.5 -418t-341.5 -147q-116 0 -209 48t-147 136h-9l-28 -164h-62zM281 528q0 -246 86.5 -353t269.5 -107q178 0 268 124.5t90 354.5q0 471 -356 471 q-192 0 -275 -110t-83 -363v-17z" />
|
||||
<glyph unicode="c" horiz-adv-x="973" d="M119 537q0 270 137 420.5t375 150.5q141 0 270 -49l-27 -88q-141 47 -245 47q-200 0 -303 -123.5t-103 -355.5q0 -220 103 -344.5t288 -124.5q148 0 275 53v-92q-104 -51 -273 -51q-233 0 -365 147t-132 410z" />
|
||||
<glyph unicode="d" horiz-adv-x="1219" d="M119 528q0 282 118 431t343 149q118 0 204 -43t154 -147h6q-6 126 -6 247v391h98v-1556h-65l-25 166h-8q-124 -186 -356 -186q-225 0 -344 140t-119 408zM223 530q0 -462 359 -462q184 0 270 107t86 353v17q0 252 -84.5 362.5t-273.5 110.5q-178 0 -267.5 -125 t-89.5 -363z" />
|
||||
<glyph unicode="e" horiz-adv-x="1124" d="M119 535q0 260 128 416.5t345 156.5q192 0 303 -134t111 -364v-80h-783q2 -224 104.5 -342t293.5 -118q93 0 163.5 13t178.5 56v-90q-92 -40 -170 -54.5t-172 -14.5q-237 0 -369.5 146t-132.5 409zM229 618h672q0 189 -82 295.5t-227 106.5q-157 0 -252 -103.5 t-111 -298.5z" />
|
||||
<glyph unicode="f" horiz-adv-x="614" d="M29 1001v58l202 37v84q0 200 73.5 293.5t240.5 93.5q90 0 180 -27l-23 -86q-80 25 -159 25q-116 0 -164.5 -68.5t-48.5 -222.5v-101h256v-86h-256v-1001h-99v1001h-202z" />
|
||||
<glyph unicode="g" horiz-adv-x="1071" d="M45 -193q0 112 69.5 186t188.5 101q-49 21 -78.5 59.5t-29.5 88.5q0 109 139 192q-95 39 -148 122.5t-53 191.5q0 163 103.5 261.5t279.5 98.5q107 0 166 -21h348v-69l-225 -14q90 -112 90 -246q0 -157 -104.5 -254.5t-280.5 -97.5q-74 0 -104 6q-59 -31 -90 -73t-31 -89 q0 -52 39.5 -76t132.5 -24h190q177 0 271 -71.5t94 -211.5q0 -172 -139.5 -265.5t-397.5 -93.5q-205 0 -317.5 79t-112.5 220zM150 -184q0 -224 333 -224q428 0 428 273q0 98 -67 142t-217 44h-178q-299 0 -299 -235zM233 748q0 -126 76.5 -195.5t204.5 -69.5 q136 0 208.5 69t72.5 200q0 139 -74.5 208.5t-208.5 69.5q-130 0 -204.5 -74.5t-74.5 -207.5z" />
|
||||
<glyph unicode="h" horiz-adv-x="1208" d="M182 0v1556h99v-495l-5 -139h7q61 98 154 142t231 44q370 0 370 -397v-711h-98v705q0 164 -69 238.5t-214 74.5q-195 0 -285.5 -98.5t-90.5 -319.5v-600h-99z" />
|
||||
<glyph unicode="i" horiz-adv-x="463" d="M168 1389q0 96 63 96q31 0 48.5 -25t17.5 -71q0 -45 -17.5 -71t-48.5 -26q-63 0 -63 97zM182 0v1087h99v-1087h-99z" />
|
||||
<glyph unicode="j" horiz-adv-x="463" d="M-98 -381q69 -20 129 -20q151 0 151 176v1312h99v-1298q0 -135 -63.5 -208t-180.5 -73q-80 0 -135 25v86zM168 1389q0 96 63 96q31 0 48.5 -25t17.5 -71q0 -45 -17.5 -71t-48.5 -26q-63 0 -63 97z" />
|
||||
<glyph unicode="k" horiz-adv-x="991" d="M182 0v1556h99v-780l-7 -299h5l555 610h120l-428 -464l465 -623h-119l-413 549l-178 -162v-387h-99z" />
|
||||
<glyph unicode="l" horiz-adv-x="463" d="M182 0v1556h99v-1556h-99z" />
|
||||
<glyph unicode="m" horiz-adv-x="1808" d="M182 0v1087h82l21 -149h6q45 81 128 125.5t183 44.5q257 0 330 -193h4q53 93 142.5 143t203.5 50q178 0 267 -95t89 -302v-711h-98v713q0 159 -62 232t-190 73q-167 0 -247 -92t-80 -289v-637h-101v743q0 275 -252 275q-171 0 -249 -99.5t-78 -318.5v-600h-99z" />
|
||||
<glyph unicode="n" horiz-adv-x="1208" d="M182 0v1087h84l19 -149h6q106 170 377 170q370 0 370 -397v-711h-98v705q0 164 -69 238.5t-214 74.5q-195 0 -285.5 -98.5t-90.5 -319.5v-600h-99z" />
|
||||
<glyph unicode="o" horiz-adv-x="1200" d="M119 545q0 266 129 414.5t354 148.5q224 0 351.5 -150.5t127.5 -412.5q0 -266 -129 -415.5t-356 -149.5q-143 0 -252 69t-167 198t-58 298zM223 545q0 -224 98.5 -349.5t278.5 -125.5t278.5 125.5t98.5 349.5q0 225 -99.5 349t-279.5 124t-277.5 -123.5t-97.5 -349.5z " />
|
||||
<glyph unicode="p" horiz-adv-x="1219" d="M182 -492v1579h84l19 -155h6q112 176 358 176q220 0 335.5 -144.5t115.5 -420.5q0 -268 -121.5 -415.5t-331.5 -147.5q-251 0 -366 188h-7l3 -84q4 -74 4 -162v-414h-99zM281 541q0 -255 85.5 -364t278.5 -109q167 0 258.5 124t91.5 347q0 479 -346 479 q-190 0 -279 -104.5t-89 -340.5v-32z" />
|
||||
<glyph unicode="q" horiz-adv-x="1219" d="M119 532q0 275 118 425.5t338 150.5q236 0 353 -174h6l18 153h84v-1579h-98v414q0 122 6 248h-6q-118 -190 -369 -190q-214 0 -332 142t-118 410zM223 530q0 -229 89.5 -345.5t258.5 -116.5q198 0 282.5 109t84.5 366v12q0 245 -85 354t-271 109q-176 0 -267.5 -124 t-91.5 -364z" />
|
||||
<glyph unicode="r" horiz-adv-x="797" d="M182 0v1087h84l10 -196h7q67 120 143 168.5t184 48.5q69 0 148 -14l-19 -95q-68 17 -141 17q-139 0 -228 -118t-89 -298v-600h-99z" />
|
||||
<glyph unicode="s" horiz-adv-x="954" d="M84 47v107q164 -82 346 -82q161 0 244.5 53.5t83.5 142.5q0 82 -66.5 138t-218.5 110q-163 59 -229 101.5t-99.5 96t-33.5 130.5q0 122 102.5 193t286.5 71q176 0 334 -66l-37 -90q-160 66 -297 66q-133 0 -211 -44t-78 -122q0 -85 60.5 -136t236.5 -114 q147 -53 214 -95.5t100.5 -96.5t33.5 -127q0 -146 -111 -224.5t-315 -78.5q-218 0 -346 67z" />
|
||||
<glyph unicode="t" horiz-adv-x="686" d="M25 1001v58l161 45l50 246h51v-263h319v-86h-319v-688q0 -125 44 -185t138 -60t164 16v-80q-72 -24 -166 -24q-144 0 -212.5 77t-68.5 242v702h-161z" />
|
||||
<glyph unicode="u" horiz-adv-x="1208" d="M170 377v710h98v-704q0 -164 69 -238.5t214 -74.5q194 0 285.5 98t91.5 319v600h98v-1087h-84l-18 150h-6q-106 -170 -377 -170q-371 0 -371 397z" />
|
||||
<glyph unicode="v" horiz-adv-x="940" d="M0 1087h102l281 -739q56 -142 84 -248h6q41 136 84 250l281 737h102l-420 -1087h-100z" />
|
||||
<glyph unicode="w" horiz-adv-x="1481" d="M31 1087h106l174 -630q61 -234 80 -344h6q59 234 86 311l224 663h90l213 -661q72 -235 88 -311h6q8 65 80 348l166 624h100l-295 -1087h-104l-238 727q-23 74 -59 217h-6l-21 -74l-45 -145l-242 -725h-98z" />
|
||||
<glyph unicode="x" horiz-adv-x="1020" d="M55 0l394 559l-379 528h114l324 -458l321 458h109l-373 -528l400 -559h-115l-342 485l-344 -485h-109z" />
|
||||
<glyph unicode="y" horiz-adv-x="940" d="M0 1087h102l230 -610q105 -281 133 -379h6q42 129 137 385l230 604h102l-487 -1263q-59 -154 -99 -208t-93.5 -81t-129.5 -27q-57 0 -127 21v86q58 -16 125 -16q51 0 90 24t70.5 74.5t73 160t53.5 142.5z" />
|
||||
<glyph unicode="z" horiz-adv-x="944" d="M82 0v63l645 936h-598v88h727v-63l-649 -936h651v-88h-776z" />
|
||||
<glyph unicode="{" horiz-adv-x="723" d="M61 528v80q122 2 176 51t54 148v350q0 299 360 305v-90q-138 -5 -200 -58t-62 -157v-305q0 -130 -44 -194t-142 -85v-8q97 -20 141.5 -83.5t44.5 -186.5v-322q0 -102 59.5 -152.5t202.5 -53.5v-91q-195 0 -277.5 75t-82.5 231v337q0 205 -230 209z" />
|
||||
<glyph unicode="|" horiz-adv-x="1108" d="M508 -506v2067h92v-2067h-92z" />
|
||||
<glyph unicode="}" horiz-adv-x="723" d="M72 -233q141 2 201.5 52.5t60.5 153.5v322q0 123 44.5 186.5t141.5 83.5v8q-97 20 -141.5 84t-44.5 195v305q0 103 -61.5 156.5t-200.5 58.5v90q174 0 267 -77.5t93 -227.5v-350q0 -100 54.5 -148.5t175.5 -50.5v-80q-230 -4 -230 -209v-337q0 -155 -82.5 -230.5 t-277.5 -75.5v91z" />
|
||||
<glyph unicode="~" d="M111 625v94q108 110 233 110q61 0 115 -13.5t155 -57.5q126 -58 220 -58q56 0 109.5 30.5t115.5 94.5v-96q-48 -49 -104.5 -81t-129.5 -32q-116 0 -270 72q-124 57 -221 57q-49 0 -108 -30.5t-115 -89.5z" />
|
||||
<glyph unicode="¢" d="M211 745q0 232 102.5 381.5t288.5 182.5v174h82v-166h14q131 0 275 -55l-31 -84q-134 51 -237 51q-187 0 -288.5 -122.5t-101.5 -358.5q0 -225 100.5 -349.5t280.5 -124.5q131 0 267 58v-92q-110 -56 -267 -56h-12v-204h-82v210q-186 30 -288.5 175t-102.5 380z" />
|
||||
<glyph unicode="£" d="M78 0v84q110 21 171.5 110t61.5 224v258h-211v82h211v297q0 204 98 315t281 111q175 0 330 -68l-35 -86q-157 66 -295 66q-141 0 -209.5 -81t-68.5 -253v-301h411v-82h-411v-256q0 -116 -35 -196t-113 -128h809v-96h-995z" />
|
||||
<glyph unicode="¥" d="M43 1462h117l426 -796l428 796h110l-432 -788h283v-82h-338v-205h338v-82h-338v-305h-105v305h-337v82h337v205h-337v82h278z" />
|
||||
<glyph unicode="©" horiz-adv-x="1704" d="M100 731q0 200 100 375t275 276t377 101q200 0 375 -100t276 -275t101 -377q0 -197 -97 -370t-272 -277t-383 -104q-207 0 -382 103.5t-272.5 276.5t-97.5 371zM193 731q0 -178 88.5 -329.5t240.5 -240.5t330 -89t329.5 88.5t240.5 240.5t89 330q0 174 -85.5 325 t-239 243t-334.5 92q-176 0 -328.5 -88.5t-241.5 -242.5t-89 -329zM489 725q0 208 111 332.5t297 124.5q119 0 227 -52l-37 -83q-98 45 -190 45q-142 0 -222.5 -94.5t-80.5 -264.5q0 -186 74.5 -275t220.5 -89q84 0 198 43v-88q-102 -45 -208 -45q-187 0 -288.5 115 t-101.5 331z" />
|
||||
<glyph unicode="­" horiz-adv-x="659" d="M92 512v82h475v-82h-475z" />
|
||||
<glyph unicode="®" horiz-adv-x="1704" d="M100 731q0 200 100 375t275 276t377 101q200 0 375 -100t276 -275t101 -377q0 -197 -97 -370t-272 -277t-383 -104q-207 0 -382 103.5t-272.5 276.5t-97.5 371zM193 731q0 -178 88.5 -329.5t240.5 -240.5t330 -89t329.5 88.5t240.5 240.5t89 330q0 174 -85.5 325 t-239 243t-334.5 92q-176 0 -328.5 -88.5t-241.5 -242.5t-89 -329zM608 291v880h211q143 0 222 -62t79 -191q0 -79 -38.5 -139.5t-110.5 -94.5l237 -393h-121l-210 360h-168v-360h-101zM709 731h112q91 0 143 46.5t52 135.5q0 172 -197 172h-110v-354z" />
|
||||
<glyph unicode="´" horiz-adv-x="1182" d="M393 1241v16q73 79 144.5 171.5t97.5 140.5h141v-17q-36 -52 -122.5 -138t-190.5 -173h-70z" />
|
||||
<glyph unicode=" " horiz-adv-x="784" />
|
||||
<glyph unicode=" " horiz-adv-x="1569" />
|
||||
<glyph unicode=" " horiz-adv-x="784" />
|
||||
<glyph unicode=" " horiz-adv-x="1569" />
|
||||
<glyph unicode=" " horiz-adv-x="523" />
|
||||
<glyph unicode=" " horiz-adv-x="392" />
|
||||
<glyph unicode=" " horiz-adv-x="261" />
|
||||
<glyph unicode=" " horiz-adv-x="261" />
|
||||
<glyph unicode=" " horiz-adv-x="196" />
|
||||
<glyph unicode=" " horiz-adv-x="313" />
|
||||
<glyph unicode=" " horiz-adv-x="87" />
|
||||
<glyph unicode="‐" horiz-adv-x="659" d="M92 512v82h475v-82h-475z" />
|
||||
<glyph unicode="‑" horiz-adv-x="659" d="M92 512v82h475v-82h-475z" />
|
||||
<glyph unicode="‒" horiz-adv-x="659" d="M92 512v82h475v-82h-475z" />
|
||||
<glyph unicode="–" horiz-adv-x="1024" d="M82 512v82h860v-82h-860z" />
|
||||
<glyph unicode="—" horiz-adv-x="2048" d="M82 512v82h1884v-82h-1884z" />
|
||||
<glyph unicode="‘" horiz-adv-x="297" d="M29 981q32 112 81.5 251t92.5 230h65q-30 -101 -64.5 -257t-45.5 -244h-117z" />
|
||||
<glyph unicode="’" horiz-adv-x="297" d="M29 961q29 96 61 241.5t49 259.5h117l12 -20q-75 -265 -174 -481h-65z" />
|
||||
<glyph unicode="“" horiz-adv-x="614" d="M29 981q32 112 81.5 251t92.5 230h65q-30 -101 -64.5 -257t-45.5 -244h-117zM346 981q34 120 83 255t91 226h66q-30 -98 -63 -248.5t-48 -252.5h-117z" />
|
||||
<glyph unicode="”" horiz-adv-x="614" d="M29 961q29 96 61 241.5t49 259.5h117l12 -20q-75 -265 -174 -481h-65zM346 961q30 98 63 248.5t48 252.5h116l13 -20q-36 -128 -85 -261t-89 -220h-66z" />
|
||||
<glyph unicode="•" horiz-adv-x="770" d="M231 748q0 89 40.5 134.5t113.5 45.5t113.5 -47t40.5 -133q0 -85 -41 -133t-113 -48t-113 47t-41 134z" />
|
||||
<glyph unicode="…" horiz-adv-x="1466" d="M162 78q0 98 80 98q82 0 82 -98t-82 -98q-80 0 -80 98zM651 78q0 98 80 98q82 0 82 -98t-82 -98q-80 0 -80 98zM1141 78q0 98 80 98q82 0 82 -98t-82 -98q-80 0 -80 98z" />
|
||||
<glyph unicode=" " horiz-adv-x="313" />
|
||||
<glyph unicode=" " horiz-adv-x="392" />
|
||||
<glyph unicode="€" d="M74 528v82h172q-4 38 -4 113l4 102h-172v82h184q39 272 183 425t362 153q88 0 161 -17t148 -57l-39 -86q-132 72 -270 72q-174 0 -288 -125.5t-155 -364.5h502v-82h-510l-4 -104v-24q0 -65 4 -87h449v-82h-443q30 -217 147.5 -338.5t301.5 -121.5q148 0 287 65v-94 q-81 -34 -150.5 -46.5t-140.5 -12.5q-228 0 -367.5 140t-181.5 408h-180z" />
|
||||
<glyph unicode="™" horiz-adv-x="1485" d="M10 1384v78h522v-78h-219v-643h-86v643h-217zM608 741v721h125l221 -606l224 606h125v-721h-86v398l4 207h-7l-227 -605h-74l-221 609h-6l4 -201v-408h-82z" />
|
||||
<glyph unicode="" horiz-adv-x="1085" d="M0 1085h1085v-1085h-1085v1085z" />
|
||||
</font>
|
||||
</defs></svg>
|
After Width: | Height: | Size: 24 KiB |
BIN
fonts/OpenSans-Light-webfont.ttf
Normal file
BIN
fonts/OpenSans-Light-webfont.woff
Normal file
BIN
fonts/OpenSans-LightItalic-webfont.eot
Normal file
146
fonts/OpenSans-LightItalic-webfont.svg
Normal file
@ -0,0 +1,146 @@
|
||||
<?xml version="1.0" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
|
||||
<svg xmlns="http://www.w3.org/2000/svg">
|
||||
<metadata>
|
||||
This is a custom SVG webfont generated by Font Squirrel.
|
||||
Copyright : Digitized data copyright 20102011 Google Corporation
|
||||
Foundry : Ascender Corporation
|
||||
Foundry URL : httpwwwascendercorpcom
|
||||
</metadata>
|
||||
<defs>
|
||||
<font id="OpenSansLightItalic" horiz-adv-x="1128" >
|
||||
<font-face units-per-em="2048" ascent="1638" descent="-410" />
|
||||
<missing-glyph horiz-adv-x="532" />
|
||||
<glyph unicode=" " horiz-adv-x="532" />
|
||||
<glyph unicode="	" horiz-adv-x="532" />
|
||||
<glyph unicode=" " horiz-adv-x="532" />
|
||||
<glyph unicode="!" horiz-adv-x="502" d="M80 57q0 56 25 88.5t69 32.5q66 0 66 -72q0 -53 -25 -87.5t-68 -34.5q-67 0 -67 73zM186 377l203 1085h119l-260 -1085h-62z" />
|
||||
<glyph unicode=""" horiz-adv-x="721" d="M248 934l80 528h127l-146 -528h-61zM578 934l79 528h127l-145 -528h-61z" />
|
||||
<glyph unicode="#" horiz-adv-x="1323" d="M82 451l8 79h299l119 398h-297l8 80h311l134 454h90l-136 -454h365l135 454h86l-135 -454h285l-8 -80h-302l-118 -398h303l-8 -79h-320l-133 -451h-90l135 451h-360l-134 -451h-88l134 451h-283zM475 530h363l120 398h-362z" />
|
||||
<glyph unicode="$" d="M141 182v94q65 -34 153.5 -53.5t160.5 -19.5l110 512q-110 53 -153 91t-66.5 87.5t-23.5 116.5q0 155 105.5 250.5t272.5 99.5l41 192h80l-41 -192q149 -5 277 -68l-35 -78q-110 61 -256 70l-109 -514q124 -60 172.5 -99.5t73.5 -88.5t25 -115q0 -151 -110.5 -243 t-297.5 -103l-53 -240h-82l51 240q-79 2 -158 18t-137 43zM410 1018q0 -78 37 -128.5t137 -96.5l102 491q-134 -9 -205 -80t-71 -186zM537 203q142 7 223.5 74.5t81.5 183.5q0 76 -48 129.5t-157 97.5z" />
|
||||
<glyph unicode="%" horiz-adv-x="1556" d="M145 862q0 160 52 312t138 229.5t193 77.5q232 0 232 -283q0 -175 -50 -327t-136 -230t-197 -78q-112 0 -172 75.5t-60 223.5zM213 0l1135 1462h110l-1139 -1462h-106zM231 868q0 -115 41 -173t113 -58q84 0 148.5 72t102.5 204t38 277q0 109 -36 163t-114 54 q-79 0 -145 -71.5t-107 -203t-41 -264.5zM905 276q0 160 52 312t138 229.5t193 77.5q121 0 176.5 -71.5t55.5 -211.5q0 -175 -50 -327t-136 -230t-197 -78q-112 0 -172 75.5t-60 223.5zM991 283q0 -116 41 -174t113 -58q130 0 209.5 166.5t79.5 386.5q0 109 -36 163t-114 54 q-80 0 -146.5 -72.5t-106.5 -202.5t-40 -263z" />
|
||||
<glyph unicode="&" horiz-adv-x="1331" d="M78 324q0 162 99 277.5t325 215.5l-41 67q-78 128 -78 251q0 157 101 253.5t264 96.5q145 0 227 -76.5t82 -206.5q0 -85 -41 -154t-121 -128t-256 -138l330 -463q73 75 135.5 176.5t91.5 186.5h111q-102 -247 -285 -436l184 -246h-123l-131 184q-121 -108 -242 -156 t-266 -48q-167 0 -266.5 94t-99.5 250zM176 328q0 -119 78 -192t211 -73q108 0 211.5 42.5t222.5 146.5l-352 493q-164 -79 -232 -134.5t-103.5 -124t-35.5 -158.5zM485 1135q0 -132 109 -281q203 89 279.5 163.5t76.5 182.5q0 91 -56.5 143t-145.5 52q-125 0 -194 -68 t-69 -192z" />
|
||||
<glyph unicode="'" horiz-adv-x="403" d="M254 934l80 528h127l-146 -528h-61z" />
|
||||
<glyph unicode="(" horiz-adv-x="526" d="M104 270q0 343 122 633t382 559h105q-259 -276 -384.5 -568t-125.5 -618q0 -317 127 -600h-80q-146 262 -146 594z" />
|
||||
<glyph unicode=")" horiz-adv-x="526" d="M-156 -324q257 274 383.5 566.5t126.5 619.5q0 148 -28.5 294t-98.5 306h80q146 -262 146 -594q0 -345 -123.5 -636t-380.5 -556h-105z" />
|
||||
<glyph unicode="*" horiz-adv-x="1137" d="M233 1217l39 102l394 -168l47 408l121 -19l-109 -405l438 8l-8 -107l-416 29l181 -401l-115 -37l-135 417l-285 -348l-78 78l318 318z" />
|
||||
<glyph unicode="+" d="M162 672v100h401v404h101v-404h401v-100h-401v-400h-101v400h-401z" />
|
||||
<glyph unicode="," horiz-adv-x="451" d="M-90 -264q79 132 141 271t88 231h111l8 -23q-34 -92 -114 -233.5t-160 -245.5h-74z" />
|
||||
<glyph unicode="-" horiz-adv-x="629" d="M82 502l18 90h457l-16 -90h-459z" />
|
||||
<glyph unicode="." horiz-adv-x="485" d="M82 55q0 56 25 88.5t69 32.5q66 0 66 -72q0 -53 -25 -87.5t-67 -34.5q-68 0 -68 73z" />
|
||||
<glyph unicode="/" horiz-adv-x="641" d="M-100 0l815 1462h112l-817 -1462h-110z" />
|
||||
<glyph unicode="0" d="M139 494q0 186 44.5 381.5t124 334t187 207t240.5 68.5q340 0 340 -469q0 -201 -41 -405t-116.5 -346t-183.5 -213.5t-242 -71.5q-176 0 -264.5 126.5t-88.5 387.5zM242 504q0 -222 62.5 -329t197.5 -107q139 0 244 112t166 337t61 489q0 199 -59.5 295t-190.5 96 q-134 0 -241.5 -113t-173.5 -329t-66 -451z" />
|
||||
<glyph unicode="1" d="M354 1204l406 258h90l-313 -1462h-105l225 1055q19 92 74 293q-42 -36 -75.5 -61t-249.5 -161z" />
|
||||
<glyph unicode="2" d="M39 0l22 104l449 402q198 177 284 276.5t126.5 186.5t40.5 180q0 112 -66 178t-197 66q-176 0 -333 -129l-54 73q180 146 394 146q173 0 268.5 -85t95.5 -237q0 -110 -43.5 -208.5t-141.5 -211.5t-311 -303l-383 -338v-4h736l-17 -96h-870z" />
|
||||
<glyph unicode="3" d="M55 53v101q172 -86 344 -86q197 0 303.5 89.5t106.5 252.5q0 145 -89 223t-247 78h-117l21 96h110q209 0 333 95.5t124 258.5q0 114 -63.5 175t-188.5 61q-167 0 -344 -131l-49 75q84 67 188 104.5t218 37.5q161 0 252.5 -82.5t91.5 -226.5q0 -162 -106 -275t-286 -143 v-4q117 -24 185.5 -115.5t68.5 -226.5q0 -134 -64 -233t-179.5 -148t-274.5 -49q-96 0 -184.5 20.5t-153.5 52.5z" />
|
||||
<glyph unicode="4" d="M23 371l20 96l881 1010h118l-215 -1018h265l-21 -88h-264l-80 -371h-96l80 371h-688zM150 459h579q79 369 119 558.5t86 354.5h-4q-66 -91 -129 -166z" />
|
||||
<glyph unicode="5" d="M88 51v107q170 -90 340 -90q208 0 328.5 114.5t120.5 313.5q0 140 -85 219.5t-225 79.5q-133 0 -243 -41l-66 49l193 659h624l-18 -96h-541l-149 -516q98 29 215 29q188 0 292.5 -102t104.5 -279q0 -237 -148 -377.5t-407 -140.5q-84 0 -177.5 20t-158.5 51z" />
|
||||
<glyph unicode="6" d="M170 428q0 283 105 544.5t269.5 385t383.5 123.5q123 0 182 -21l-18 -90q-86 23 -170 23q-233 0 -393.5 -174t-233.5 -502h8q68 94 164 143t211 49q161 0 250.5 -100.5t89.5 -282.5q0 -156 -60 -281t-171 -195t-257 -70q-171 0 -265.5 119t-94.5 329zM270 414 q0 -164 72.5 -255t200.5 -91q112 0 196.5 58.5t130 162t45.5 229.5q0 146 -67 224.5t-195 78.5q-81 0 -154 -31.5t-129 -87t-78 -115t-22 -173.5z" />
|
||||
<glyph unicode="7" d="M244 0l796 1366h-766l23 96h858l-20 -110l-779 -1352h-112z" />
|
||||
<glyph unicode="8" d="M98 326q0 159 100.5 268.5t321.5 187.5q-100 72 -144 152t-44 180q0 159 114 265t291 106q163 0 258 -85t95 -229q0 -138 -84 -234.5t-285 -172.5q130 -78 190 -170.5t60 -208.5t-58 -208t-165.5 -144.5t-260.5 -52.5q-178 0 -283.5 92.5t-105.5 253.5zM201 340 q0 -136 77.5 -206.5t219.5 -70.5q168 0 270 91t102 233q0 104 -62 189t-198 157q-218 -73 -313.5 -167.5t-95.5 -225.5zM428 1114q0 -91 41.5 -159t157.5 -142q192 62 279 144t87 206q0 109 -70.5 172.5t-195.5 63.5q-130 0 -214.5 -82t-84.5 -203z" />
|
||||
<glyph unicode="9" d="M115 2v90q87 -29 192 -29q474 0 627 674h-8q-140 -192 -367 -192q-162 0 -255 105t-93 284q0 155 59.5 281t170.5 196t257 70q174 0 267.5 -115.5t93.5 -333.5q0 -288 -101.5 -548t-263.5 -382t-393 -122q-114 0 -186 22zM313 942q0 -145 67.5 -225t192.5 -80 q83 0 157.5 32.5t129 87.5t76.5 114t22 176q0 166 -71 256t-201 90q-112 0 -197.5 -58.5t-130.5 -162.5t-45 -230z" />
|
||||
<glyph unicode=":" horiz-adv-x="485" d="M102 55q0 56 25.5 88.5t69.5 32.5q65 0 65 -72q0 -55 -25.5 -88.5t-66.5 -33.5q-68 0 -68 73zM260 989q0 57 25.5 89t68.5 32q66 0 66 -72q0 -55 -25 -89t-67 -34q-68 0 -68 74z" />
|
||||
<glyph unicode=";" horiz-adv-x="485" d="M-53 -264q79 132 141 271t88 231h111l8 -23q-35 -96 -118.5 -242t-156.5 -237h-73zM266 989q0 57 25.5 89t68.5 32q66 0 66 -72q0 -55 -25 -89t-67 -34q-68 0 -68 74z" />
|
||||
<glyph unicode="<" d="M137 676v74l914 471v-103l-801 -399l801 -350v-107z" />
|
||||
<glyph unicode="=" d="M168 461v98h903v-98h-903zM168 885v100h903v-100h-903z" />
|
||||
<glyph unicode=">" d="M170 262v107l801 350l-801 399v103l915 -471v-74z" />
|
||||
<glyph unicode="?" horiz-adv-x="799" d="M170 59q0 56 25 88.5t69 32.5q66 0 66 -71q0 -54 -24.5 -88.5t-67.5 -34.5q-68 0 -68 73zM182 1376q85 49 171.5 78t187.5 29q159 0 250.5 -84.5t91.5 -229.5q0 -127 -66 -234t-231 -226q-85 -61 -132.5 -108.5t-73 -95t-46.5 -143.5h-92l6 29q29 132 82 206.5t157 147.5 q118 84 175 145.5t86.5 127.5t29.5 141q0 108 -67.5 170t-182.5 62q-139 0 -307 -101z" />
|
||||
<glyph unicode="@" horiz-adv-x="1724" d="M125 508q0 276 121.5 493.5t337 337t473.5 119.5q189 0 330.5 -72.5t221 -213t79.5 -314.5q0 -179 -56 -323.5t-154.5 -227t-211.5 -82.5q-98 0 -154.5 55t-56.5 144h-4q-54 -97 -132.5 -148t-168.5 -51q-112 0 -178 73t-66 202q0 156 63 283t178 198.5t261 71.5 q122 0 252 -52l-84 -315q-39 -140 -39 -221q0 -71 34.5 -111.5t100.5 -40.5q86 0 160 73.5t117.5 198t43.5 251.5q0 156 -65 277t-187 188t-292 67q-235 0 -424.5 -108.5t-295.5 -304t-106 -439.5q0 -288 155 -449t435 -161q207 0 420 82v-90q-210 -82 -428 -82 q-203 0 -357.5 82.5t-238.5 239t-84 370.5zM610 506q0 -92 40.5 -142.5t113.5 -50.5q101 0 180.5 89t124.5 255l78 289q-66 23 -139 23q-113 0 -204.5 -59t-142.5 -165.5t-51 -238.5z" />
|
||||
<glyph unicode="A" horiz-adv-x="1059" d="M-111 0l822 1468h67l201 -1468h-105l-69 520h-512l-287 -520h-117zM344 612h449l-39 291q-31 242 -39 402q-30 -63 -64.5 -130t-306.5 -563z" />
|
||||
<glyph unicode="B" horiz-adv-x="1202" d="M102 0l310 1462h379q190 0 290.5 -84t100.5 -241q0 -153 -90 -249t-254 -124v-4q125 -31 188.5 -113.5t63.5 -204.5q0 -205 -140.5 -323.5t-390.5 -118.5h-457zM223 90h342q201 0 309.5 87.5t108.5 256.5q0 145 -90 216t-275 71h-260zM377 811h278q206 0 313 81t107 238 q0 119 -78 180.5t-229 61.5h-272z" />
|
||||
<glyph unicode="C" horiz-adv-x="1169" d="M170 535q0 266 104.5 488t284.5 341t402 119q177 0 307 -68l-45 -90q-55 30 -124.5 47t-137.5 17q-197 0 -351.5 -104.5t-245 -304.5t-90.5 -441q0 -225 110.5 -346t317.5 -121q140 0 304 51v-94q-156 -49 -316 -49q-252 0 -386 145t-134 410z" />
|
||||
<glyph unicode="D" horiz-adv-x="1350" d="M102 0l310 1462h305q282 0 426.5 -147.5t144.5 -435.5q0 -253 -109.5 -461.5t-300.5 -313t-446 -104.5h-330zM221 90h209q226 0 394.5 94.5t261 275.5t92.5 412q0 498 -476 498h-206z" />
|
||||
<glyph unicode="E" horiz-adv-x="1067" d="M102 0l310 1462h727l-21 -94h-624l-117 -553h590l-21 -94h-588l-135 -627h627l-21 -94h-727z" />
|
||||
<glyph unicode="F" horiz-adv-x="981" d="M102 0l310 1462h708l-20 -94h-604l-134 -620h570l-21 -95h-569l-137 -653h-103z" />
|
||||
<glyph unicode="G" horiz-adv-x="1374" d="M170 547q0 265 105 483.5t283.5 335.5t395.5 117q113 0 203 -19t184 -59l-38 -94q-110 46 -189.5 62t-167.5 16q-184 0 -339 -107.5t-244 -301.5t-89 -433q0 -229 114.5 -352t326.5 -123q155 0 309 47l117 526h-303l18 90h406l-150 -682q-211 -73 -405 -73 q-257 0 -397 146t-140 421z" />
|
||||
<glyph unicode="H" horiz-adv-x="1366" d="M102 0l310 1462h102l-139 -649h760l137 649h100l-309 -1462h-100l151 719h-760l-149 -719h-103z" />
|
||||
<glyph unicode="I" horiz-adv-x="504" d="M102 0l310 1462h98l-309 -1462h-99z" />
|
||||
<glyph unicode="J" horiz-adv-x="477" d="M-324 -336l11 92q57 -20 137 -20q213 0 262 241l309 1485h105l-314 -1491q-35 -170 -125 -250.5t-241 -80.5q-48 0 -88 8t-56 16z" />
|
||||
<glyph unicode="K" horiz-adv-x="1122" d="M102 0l310 1462h102l-158 -723l133 121l680 602h138l-699 -610l371 -852h-111l-342 788l-190 -153l-131 -635h-103z" />
|
||||
<glyph unicode="L" horiz-adv-x="938" d="M102 0l310 1462h102l-289 -1366h621l-23 -96h-721z" />
|
||||
<glyph unicode="M" horiz-adv-x="1669" d="M109 0l309 1462h143l205 -1257h6l733 1257h150l-301 -1462h-101l191 901q79 369 100 447h-6l-780 -1348h-51l-222 1348h-6q-20 -154 -78 -426l-196 -922h-96z" />
|
||||
<glyph unicode="N" horiz-adv-x="1372" d="M102 0l310 1462h80l522 -1294h8q23 176 74 416l188 878h94l-309 -1462h-86l-516 1284h-8q-23 -149 -48 -273t-214 -1011h-95z" />
|
||||
<glyph unicode="O" horiz-adv-x="1464" d="M172 559q0 262 93 477.5t255 331t373 115.5q247 0 378.5 -148.5t131.5 -423.5q0 -255 -94 -481.5t-252 -338t-365 -111.5q-250 0 -385 149t-135 430zM276 573q0 -245 109.5 -373t319.5 -128q169 0 300 98.5t210 300t79 430.5q0 240 -104.5 364t-310.5 124 q-174 0 -308.5 -101t-214.5 -298t-80 -417z" />
|
||||
<glyph unicode="P" horiz-adv-x="1145" d="M102 0l310 1462h315q202 0 310 -92.5t108 -267.5q0 -500 -610 -500h-201l-129 -602h-103zM350 694h191q252 0 373.5 96.5t121.5 305.5q0 274 -329 274h-211z" />
|
||||
<glyph unicode="Q" horiz-adv-x="1464" d="M172 559q0 262 93 477.5t255 331t373 115.5q247 0 378.5 -148.5t131.5 -423.5q0 -216 -70 -418t-186.5 -324t-274.5 -167l267 -350h-142l-231 332l-74 -4q-250 0 -385 149t-135 430zM276 573q0 -245 109.5 -373t319.5 -128q169 0 300 98.5t210 300t79 430.5 q0 240 -104.5 364t-310.5 124q-174 0 -308.5 -101t-214.5 -298t-80 -417z" />
|
||||
<glyph unicode="R" horiz-adv-x="1145" d="M102 0l310 1462h303q430 0 430 -360q0 -182 -103.5 -303t-281.5 -152q201 -591 221 -647h-111l-211 633h-323l-131 -633h-103zM358 725h252q208 0 317 95.5t109 281.5q0 268 -329 268h-211z" />
|
||||
<glyph unicode="S" horiz-adv-x="1020" d="M37 55v109q163 -92 348 -92q188 0 295.5 86.5t107.5 232.5q0 61 -17 104.5t-52.5 78.5t-91 68t-131.5 75q-150 76 -209.5 164t-59.5 206t59 207.5t165 139t237 49.5q99 0 180 -17.5t168 -60.5l-32 -94q-66 40 -151.5 63t-164.5 23q-163 0 -259.5 -82.5t-96.5 -218.5 q0 -103 49 -170t182 -133q154 -79 213.5 -130t89 -113t29.5 -147q0 -126 -65.5 -224.5t-179.5 -148.5t-269 -50q-88 0 -172.5 17t-171.5 58z" />
|
||||
<glyph unicode="T" horiz-adv-x="985" d="M193 1368l20 94h973l-19 -94h-440l-289 -1368h-102l289 1368h-432z" />
|
||||
<glyph unicode="U" horiz-adv-x="1370" d="M176 381q0 83 27 201l186 880h103l-193 -899q-20 -89 -20 -184q0 -309 342 -309q195 0 307.5 96.5t158.5 318.5l207 977h101l-207 -977q-58 -270 -197 -387.5t-375 -117.5q-440 0 -440 401z" />
|
||||
<glyph unicode="V" horiz-adv-x="1079" d="M201 1462h100l117 -950q26 -217 35 -365h4q51 111 124 247l572 1068h117l-799 -1462h-88z" />
|
||||
<glyph unicode="W" horiz-adv-x="1702" d="M238 1462h100l47 -1031l4 -165l-2 -86h6q85 226 170 398l434 884h105l61 -878q19 -266 19 -410h6q30 86 61.5 163t493.5 1125h108q-169 -365 -330.5 -731t-328.5 -731h-78l-78 1075q-11 142 -11 219l1 47h-8q-27 -76 -62 -153.5t-563 -1187.5h-82z" />
|
||||
<glyph unicode="X" horiz-adv-x="971" d="M-135 0l608 766l-272 696h106l240 -626l483 626h119l-555 -719l285 -743h-107l-254 678l-526 -678h-127z" />
|
||||
<glyph unicode="Y" horiz-adv-x="965" d="M193 1462h100l201 -817l544 817h117l-631 -932l-108 -530h-105l119 545z" />
|
||||
<glyph unicode="Z" d="M-12 0l22 92l1069 1276h-764l23 94h887l-19 -88l-1069 -1280h799l-23 -94h-925z" />
|
||||
<glyph unicode="[" horiz-adv-x="537" d="M-57 -324l376 1786h429l-19 -90h-330l-340 -1605h330l-20 -91h-426z" />
|
||||
<glyph unicode="\" horiz-adv-x="641" d="M209 1462h86l242 -1462h-82z" />
|
||||
<glyph unicode="]" horiz-adv-x="537" d="M-176 -324l18 91h330l340 1605h-330l21 90h426l-377 -1786h-428z" />
|
||||
<glyph unicode="^" horiz-adv-x="1047" d="M70 569l587 906h91l260 -906h-105l-217 809l-500 -809h-116z" />
|
||||
<glyph unicode="_" horiz-adv-x="801" d="M-182 -291l18 86h807l-18 -86h-807z" />
|
||||
<glyph unicode="`" horiz-adv-x="1135" d="M487 1548v21h115q46 -129 164 -303v-25h-66q-50 52 -114 144.5t-99 162.5z" />
|
||||
<glyph unicode="a" horiz-adv-x="1133" d="M102 354q0 197 75 376t200.5 276.5t277.5 97.5q232 0 279 -219h6l59 202h80l-229 -1087h-82l45 274h-6q-84 -142 -187 -218t-237 -76q-281 0 -281 374zM205 365q0 -152 50 -223.5t151 -71.5q89 0 177.5 62t159 166t107.5 230t37 213q0 79 -26 141.5t-77 99t-127 36.5 q-124 0 -224 -82t-164 -245.5t-64 -325.5z" />
|
||||
<glyph unicode="b" horiz-adv-x="1151" d="M76 0l327 1556h95q-131 -628 -162 -751h6q93 156 199 229.5t231 73.5q281 0 281 -375q0 -203 -76 -380t-201 -273t-276 -96q-113 0 -186 59t-97 166h-6l-55 -209h-80zM268 346q0 -129 64 -202.5t166 -73.5q124 0 224 83t164 245t64 325q0 152 -49 223.5t-151 71.5 q-91 0 -180 -61.5t-160.5 -169.5t-106.5 -235t-35 -206z" />
|
||||
<glyph unicode="c" horiz-adv-x="887" d="M102 397q0 193 73.5 361.5t198.5 257t290 88.5q134 0 241 -43l-28 -90q-107 47 -218 47q-129 0 -232.5 -77t-162.5 -222t-59 -320q0 -158 73.5 -243.5t208.5 -85.5q71 0 131.5 13t131.5 46v-92q-116 -57 -273 -57q-174 0 -274.5 110.5t-100.5 306.5z" />
|
||||
<glyph unicode="d" horiz-adv-x="1133" d="M102 354q0 193 71.5 370t197.5 278.5t284 101.5q230 0 279 -219h4q12 66 143 671h99l-330 -1556h-82l45 274h-6q-173 -294 -424 -294q-281 0 -281 374zM205 365q0 -295 201 -295q89 0 178.5 62.5t160 168t106.5 231t36 209.5q0 126 -61.5 201.5t-168.5 75.5 q-124 0 -224 -83t-164 -242.5t-64 -327.5z" />
|
||||
<glyph unicode="e" horiz-adv-x="928" d="M102 395q0 181 71 347t195.5 264t274.5 98q114 0 182 -61t68 -166q0 -181 -163.5 -276t-485.5 -95h-33q-6 -44 -6 -98q0 -165 74 -251.5t213 -86.5q132 0 276 73v-94q-140 -69 -299 -69q-173 0 -270 109.5t-97 305.5zM225 594h49q517 0 517 270q0 67 -43.5 110.5 t-116.5 43.5q-131 0 -243.5 -115.5t-162.5 -308.5z" />
|
||||
<glyph unicode="f" horiz-adv-x="578" d="M-233 -383q53 -16 100 -16q88 0 134 53t75 186l246 1166h-205l14 67l205 14l35 160q35 168 116.5 244t227.5 76q73 0 166 -31l-25 -80q-87 27 -147 27q-96 0 -153.5 -53.5t-84.5 -178.5l-35 -164h248l-16 -81h-248l-252 -1190q-33 -161 -104 -234.5t-195 -73.5 q-48 0 -102 19v90z" />
|
||||
<glyph unicode="g" horiz-adv-x="1040" d="M-88 -217q0 236 309 334q-78 42 -78 123q0 123 191 202q-71 36 -110.5 105.5t-39.5 157.5q0 111 53.5 204t148 146t206.5 53q69 0 147 -21h361l-17 -79l-243 -11q26 -28 43.5 -84t17.5 -114q0 -109 -54.5 -206.5t-148 -145.5t-213.5 -48q-63 0 -77 9q-80 -33 -124 -73 t-44 -81t31.5 -64.5t113.5 -31.5l121 -11q346 -31 346 -264q0 -112 -65 -197.5t-187 -131.5t-291 -46q-186 0 -291.5 72t-105.5 203zM14 -207q0 -101 81 -150t224 -49q203 0 317 74.5t114 204.5q0 85 -62.5 130.5t-218.5 57.5l-160 15q-157 -45 -226 -114.5t-69 -168.5z M285 711q0 -112 58.5 -170t164.5 -58q88 0 154 37t102.5 114t36.5 169q0 104 -56 161.5t-157 57.5q-93 0 -161 -43t-105 -116t-37 -152z" />
|
||||
<glyph unicode="h" horiz-adv-x="1143" d="M76 0l332 1556h96l-86 -411q-44 -200 -66 -279h6q78 113 186.5 175.5t229.5 62.5q124 0 192 -65t68 -183q0 -70 -24 -182l-148 -674h-98l149 692q21 92 21 156q0 80 -43.5 125t-134.5 45q-112 0 -210.5 -67t-166 -188t-103.5 -286l-102 -477h-98z" />
|
||||
<glyph unicode="i" horiz-adv-x="475" d="M76 0l231 1087h96l-229 -1087h-98zM350 1366q0 55 22 88t60 33q57 0 57 -72q0 -57 -22 -90t-57 -33q-29 0 -44.5 19.5t-15.5 54.5z" />
|
||||
<glyph unicode="j" horiz-adv-x="475" d="M-279 -381q47 -22 113 -22q82 0 128.5 51.5t72.5 177.5l266 1261h96l-268 -1271q-35 -165 -106.5 -236.5t-188.5 -71.5q-62 0 -113 19v92zM350 1366q0 55 22 88t60 33q57 0 57 -72q0 -57 -22 -90t-57 -33q-29 0 -44.5 19.5t-15.5 54.5z" />
|
||||
<glyph unicode="k" horiz-adv-x="944" d="M76 0l330 1556h96l-166 -780l-70 -299h4l609 610h125l-474 -469l297 -618h-106l-264 559l-205 -188l-80 -371h-96z" />
|
||||
<glyph unicode="l" horiz-adv-x="475" d="M76 0l334 1556h94l-334 -1556h-94z" />
|
||||
<glyph unicode="m" horiz-adv-x="1751" d="M72 0l231 1087h80l-33 -210h6q80 113 181.5 170t212.5 57q106 0 163 -67t60 -195h6q77 129 181 195.5t222 66.5q117 0 182.5 -61.5t65.5 -176.5q0 -29 -2.5 -56.5t-19.5 -119.5l-152 -690h-100l149 680q25 120 25 176q0 77 -43 119.5t-119 42.5q-157 0 -277.5 -137.5 t-168.5 -362.5l-109 -518h-102l147 674q25 125 25 162q0 182 -154 182q-106 0 -200 -67.5t-159 -188.5t-100 -287l-100 -475h-98z" />
|
||||
<glyph unicode="n" horiz-adv-x="1143" d="M76 0l231 1087h82l-37 -221h6q164 238 416 238q130 0 195 -64t65 -184q0 -70 -24 -182l-148 -674h-98l149 692q21 92 21 156q0 80 -43.5 125t-134.5 45q-112 0 -210.5 -67t-166 -187.5t-103.5 -286.5l-102 -477h-98z" />
|
||||
<glyph unicode="o" horiz-adv-x="1124" d="M98 403q0 191 73 358t197 257t281 90q180 0 278.5 -108.5t98.5 -299.5q0 -197 -71.5 -368.5t-195.5 -261.5t-286 -90q-184 0 -279.5 109.5t-95.5 313.5zM201 408q0 -342 282 -342q127 0 225.5 77.5t157 228t58.5 330.5q0 154 -73 237t-210 83q-124 0 -223 -78.5 t-158 -225t-59 -310.5z" />
|
||||
<glyph unicode="p" horiz-adv-x="1149" d="M-33 -492l336 1579h82l-45 -274h6q91 153 195.5 224t228.5 71q135 0 208 -92.5t73 -282.5q0 -195 -72 -371t-197.5 -277t-283.5 -101q-230 0 -279 219h-4q-13 -72 -149 -695h-99zM266 346q0 -125 61.5 -200.5t168.5 -75.5q124 0 225 84t164 243.5t63 325.5 q0 295 -200 295q-87 0 -174 -58.5t-161.5 -167.5t-110.5 -237.5t-36 -208.5z" />
|
||||
<glyph unicode="q" horiz-adv-x="1157" d="M98 354q0 201 75.5 379t200.5 274.5t277 96.5q109 0 183.5 -58t99.5 -167h6l55 208h80l-327 -1556h-95l98 470l64 282h-6q-93 -156 -199 -229.5t-231 -73.5q-281 0 -281 374zM201 365q0 -143 45.5 -219t154.5 -76q92 0 182 62.5t160.5 171.5t105 236.5t34.5 200.5 q0 130 -63.5 203.5t-166.5 73.5q-124 0 -224 -83t-164 -245t-64 -325z" />
|
||||
<glyph unicode="r" horiz-adv-x="752" d="M72 0l231 1087h80l-29 -204h6q73 94 123 135.5t106.5 64.5t123.5 23q69 0 123 -14l-21 -93q-47 15 -113 15q-94 0 -179 -64t-153 -192t-100 -277l-100 -481h-98z" />
|
||||
<glyph unicode="s" horiz-adv-x="827" d="M25 55v107q74 -46 153 -71t148 -25q138 0 211 57.5t73 163.5q0 42 -15.5 74t-50 61.5t-132.5 85.5q-148 80 -200 145.5t-52 159.5q0 128 98.5 209.5t259.5 81.5q75 0 158.5 -17.5t140.5 -46.5l-35 -88q-136 64 -264 64q-116 0 -186 -53t-70 -138q0 -55 17 -88t60.5 -68.5 t119.5 -76.5q114 -63 161.5 -103.5t70 -86.5t22.5 -107q0 -144 -103 -229.5t-280 -85.5q-173 0 -305 75z" />
|
||||
<glyph unicode="t" horiz-adv-x="616" d="M113 1006l14 67l184 17l97 253h55l-55 -256h286l-18 -81h-283l-135 -635q-22 -99 -22 -164q0 -139 126 -139q68 0 152 26v-86q-101 -28 -170 -28q-99 0 -153 54.5t-54 158.5q0 73 29 206l129 607h-182z" />
|
||||
<glyph unicode="u" horiz-adv-x="1143" d="M109 227q0 60 22 170l150 690h100l-152 -698q-22 -106 -22 -158q0 -74 47.5 -117.5t138.5 -43.5q110 0 207.5 65.5t164 187t99.5 279.5l105 485h98l-231 -1087h-80l28 205h-6q-167 -221 -403 -221q-131 0 -198.5 62t-67.5 181z" />
|
||||
<glyph unicode="v" horiz-adv-x="895" d="M104 1087h101l108 -735q26 -165 33 -254h6q51 115 129 256l406 733h102l-600 -1087h-113z" />
|
||||
<glyph unicode="w" horiz-adv-x="1393" d="M121 1087h92l13 -821l-3 -157h6q61 134 150 297l373 681h77l64 -681q14 -147 14 -297h6l24 61l101 236l320 681h96l-508 -1087h-108l-60 686q-14 224 -14 266h-6q-34 -92 -144 -290l-356 -662h-117z" />
|
||||
<glyph unicode="x" horiz-adv-x="922" d="M-72 0l471 559l-245 528h100l207 -462l373 462h120l-448 -534l258 -553h-98l-224 483l-393 -483h-121z" />
|
||||
<glyph unicode="y" horiz-adv-x="920" d="M-217 -379q71 -27 137 -27q80 0 147 49.5t130 164.5t100 184l-174 1095h100l82 -548q51 -351 55 -449h11q43 105 186 367l348 630h103l-713 -1290q-72 -127 -122.5 -178t-114 -81t-146.5 -30q-68 0 -129 21v92z" />
|
||||
<glyph unicode="z" horiz-adv-x="887" d="M-29 0l15 72l776 932h-543l17 83h659l-18 -83l-762 -920h602l-17 -84h-729z" />
|
||||
<glyph unicode="{" horiz-adv-x="709" d="M59 528l21 78q126 0 191 49t89 158l89 393q30 135 106 195.5t215 60.5h29l-17 -86q-86 -2 -129 -20.5t-69.5 -61.5t-44.5 -120l-74 -338q-30 -134 -91.5 -194.5t-164.5 -78.5v-4q68 -18 105.5 -68.5t37.5 -121.5q0 -52 -24 -164l-47 -225q-13 -58 -13 -101 q0 -61 37.5 -89t138.5 -28v-86h-20q-256 0 -256 199q0 45 16 115l56 252q18 90 18 127q0 159 -199 159z" />
|
||||
<glyph unicode="|" d="M584 -510v2071h100v-2071h-100z" />
|
||||
<glyph unicode="}" horiz-adv-x="709" d="M-41 -238q96 2 138 21t68.5 61t43.5 121l74 338q27 126 87.5 189.5t168.5 82.5v5q-75 20 -109.5 72.5t-34.5 117.5q0 55 18 131l54 258q12 61 12 101q0 44 -18 69t-54 36t-116 11l20 86h21q131 0 189.5 -51t58.5 -147q0 -41 -17 -115l-55 -252q-19 -95 -19 -127 q0 -77 49.5 -118.5t149.5 -41.5l-20 -78q-125 0 -191 -48.5t-90 -157.5l-88 -394q-32 -139 -108.5 -197.5t-213.5 -58.5h-18v86z" />
|
||||
<glyph unicode="~" d="M127 625v94q108 110 233 110q61 0 115 -13.5t156 -57.5q126 -58 219 -58q54 0 107.5 29t117.5 96v-96q-111 -113 -233 -113q-117 0 -271 72q-62 29 -112.5 43t-108.5 14q-49 0 -108 -30.5t-115 -89.5z" />
|
||||
<glyph unicode="¢" d="M250 600q0 184 63.5 341t178 253t256.5 111l36 178h90l-38 -176q116 -4 217 -43l-29 -90q-107 47 -217 47q-130 0 -233 -76t-162.5 -221t-59.5 -322q0 -164 74.5 -247t208.5 -83q127 0 264 60v-92q-118 -58 -281 -58l-40 -202h-93l45 215q-132 25 -206 132.5t-74 272.5z " />
|
||||
<glyph unicode="£" d="M-4 0l16 84q93 11 165.5 95.5t107.5 236.5l57 260h-199l17 82h198l76 350q41 187 155 279t290 92q170 0 313 -78l-39 -84l-54 26q-108 50 -231 50q-134 0 -220.5 -74.5t-117.5 -220.5l-73 -340h409l-18 -82h-408l-57 -268q-50 -225 -188 -314h759l-20 -94h-938z" />
|
||||
<glyph unicode="¥" d="M166 289l18 84h299l41 190h-301l17 76h258l-215 823h100l201 -817l544 817h117l-559 -823h266l-16 -76h-315l-39 -190h317l-18 -84h-316l-59 -289h-105l64 289h-299z" />
|
||||
<glyph unicode="©" horiz-adv-x="1704" d="M147 731q0 200 100 375t275 276t377 101q200 0 375 -100t276 -275t101 -377q0 -197 -97 -370t-272 -277t-383 -104q-207 0 -382 103.5t-272.5 276.5t-97.5 371zM240 731q0 -178 88.5 -329.5t240.5 -240.5t330 -89q174 0 325 85.5t243 239t92 334.5q0 178 -89 330 t-240.5 241t-330.5 89q-182 0 -335 -92t-238.5 -243t-85.5 -325zM537 725q0 207 110 332t297 125q119 0 227 -52l-36 -83q-99 45 -191 45q-142 0 -222.5 -94.5t-80.5 -264.5q0 -186 74.5 -275t220.5 -89q85 0 199 43v-88q-104 -45 -209 -45q-187 0 -288 116t-101 330z" />
|
||||
<glyph unicode="­" horiz-adv-x="629" d="M82 502l18 90h457l-16 -90h-459z" />
|
||||
<glyph unicode="®" horiz-adv-x="1704" d="M150 731q0 207 103.5 382t276.5 272.5t371 97.5q200 0 375 -100t276 -275t101 -377q0 -197 -97 -370t-272 -277t-383 -104q-204 0 -376.5 100.5t-273.5 273t-101 377.5zM242 731q0 -178 88.5 -329.5t240.5 -240.5t330 -89q174 0 325 85.5t243 239t92 334.5q0 178 -89 330 t-240.5 241t-330.5 89q-182 0 -335 -92t-238.5 -243t-85.5 -325zM657 291v880h211q143 0 222 -62t79 -191q0 -80 -39.5 -141t-109.5 -93l237 -393h-120l-211 360h-168v-360h-101zM758 731h112q93 0 144 46.5t51 135.5q0 172 -197 172h-110v-354z" />
|
||||
<glyph unicode="´" horiz-adv-x="1135" d="M580 1241v21q66 51 150.5 142t129.5 165h137v-23q-51 -66 -157.5 -158.5t-192.5 -146.5h-67z" />
|
||||
<glyph unicode=" " horiz-adv-x="784" />
|
||||
<glyph unicode=" " horiz-adv-x="1569" />
|
||||
<glyph unicode=" " horiz-adv-x="784" />
|
||||
<glyph unicode=" " horiz-adv-x="1569" />
|
||||
<glyph unicode=" " horiz-adv-x="523" />
|
||||
<glyph unicode=" " horiz-adv-x="392" />
|
||||
<glyph unicode=" " horiz-adv-x="261" />
|
||||
<glyph unicode=" " horiz-adv-x="261" />
|
||||
<glyph unicode=" " horiz-adv-x="196" />
|
||||
<glyph unicode=" " horiz-adv-x="313" />
|
||||
<glyph unicode=" " horiz-adv-x="87" />
|
||||
<glyph unicode="‐" horiz-adv-x="629" d="M82 502l18 90h457l-16 -90h-459z" />
|
||||
<glyph unicode="‑" horiz-adv-x="629" d="M82 502l18 90h457l-16 -90h-459z" />
|
||||
<glyph unicode="‒" horiz-adv-x="629" d="M82 502l18 90h457l-16 -90h-459z" />
|
||||
<glyph unicode="–" horiz-adv-x="983" d="M66 502l18 90h807l-17 -90h-808z" />
|
||||
<glyph unicode="—" horiz-adv-x="1966" d="M68 502l18 90h1788l-16 -90h-1790z" />
|
||||
<glyph unicode="‘" horiz-adv-x="299" d="M129 983q41 100 116 231t161 248h73q-66 -106 -129.5 -242.5t-103.5 -258.5h-113z" />
|
||||
<glyph unicode="’" horiz-adv-x="299" d="M129 961q66 106 129.5 242.5t103.5 258.5h113l4 -22q-43 -105 -117.5 -235.5t-158.5 -243.5h-74z" />
|
||||
<glyph unicode="“" horiz-adv-x="631" d="M129 983q41 100 116 231t161 248h73q-66 -106 -129.5 -242.5t-103.5 -258.5h-113zM463 983q43 104 120 238.5t156 240.5h74q-66 -106 -129.5 -242.5t-103.5 -258.5h-113z" />
|
||||
<glyph unicode="”" horiz-adv-x="631" d="M129 961q66 106 129.5 242.5t103.5 258.5h113l4 -22q-43 -105 -117.5 -235.5t-158.5 -243.5h-74zM463 961q66 106 129.5 242.5t103.5 258.5h113l4 -22q-43 -105 -117.5 -235.5t-158.5 -243.5h-74z" />
|
||||
<glyph unicode="•" horiz-adv-x="793" d="M248 682q0 137 63 213t172 76q76 0 116 -39.5t40 -118.5q0 -125 -66 -207t-176 -82q-149 0 -149 158z" />
|
||||
<glyph unicode="…" horiz-adv-x="1489" d="M69 55q0 56 25 88.5t69 32.5q66 0 66 -72q0 -53 -25 -87.5t-67 -34.5q-68 0 -68 73zM569 55q0 56 25 88.5t69 32.5q66 0 66 -72q0 -53 -25 -87.5t-67 -34.5q-68 0 -68 73zM1071 55q0 56 25 88.5t69 32.5q66 0 66 -72q0 -53 -25 -87.5t-67 -34.5q-68 0 -68 73z" />
|
||||
<glyph unicode=" " horiz-adv-x="313" />
|
||||
<glyph unicode=" " horiz-adv-x="392" />
|
||||
<glyph unicode="€" d="M80 541l16 82h172q5 101 35 217h-170l19 82h174q95 273 270 417t399 144q166 0 287 -90l-53 -82q-102 78 -238 78q-186 0 -330.5 -120.5t-226.5 -346.5h457l-21 -82h-460q-30 -98 -39 -217h442l-20 -82h-424q0 -243 89 -356t265 -113q115 0 252 57v-94q-129 -55 -270 -55 q-209 0 -325 139.5t-116 394.5v27h-184z" />
|
||||
<glyph unicode="™" horiz-adv-x="1534" d="M174 1384v78h522v-78h-219v-643h-86v643h-217zM772 741v721h125l221 -606l223 606h125v-721h-86v398l4 207h-6l-227 -605h-74l-221 609h-6l4 -201v-408h-82z" />
|
||||
<glyph unicode="" horiz-adv-x="1085" d="M0 1085h1085v-1085h-1085v1085z" />
|
||||
</font>
|
||||
</defs></svg>
|
After Width: | Height: | Size: 27 KiB |
BIN
fonts/OpenSans-LightItalic-webfont.ttf
Normal file
BIN
fonts/OpenSans-LightItalic-webfont.woff
Normal file
BIN
fonts/OpenSans-Regular-webfont.eot
Normal file
146
fonts/OpenSans-Regular-webfont.svg
Normal file
@ -0,0 +1,146 @@
|
||||
<?xml version="1.0" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
|
||||
<svg xmlns="http://www.w3.org/2000/svg">
|
||||
<metadata>
|
||||
This is a custom SVG webfont generated by Font Squirrel.
|
||||
Copyright : Digitized data copyright 20102011 Google Corporation
|
||||
Foundry : Ascender Corporation
|
||||
Foundry URL : httpwwwascendercorpcom
|
||||
</metadata>
|
||||
<defs>
|
||||
<font id="OpenSansRegular" horiz-adv-x="1171" >
|
||||
<font-face units-per-em="2048" ascent="1638" descent="-410" />
|
||||
<missing-glyph horiz-adv-x="532" />
|
||||
<glyph unicode=" " horiz-adv-x="532" />
|
||||
<glyph unicode="	" horiz-adv-x="532" />
|
||||
<glyph unicode=" " horiz-adv-x="532" />
|
||||
<glyph unicode="!" horiz-adv-x="547" d="M152 106q0 136 120 136q58 0 89.5 -35t31.5 -101q0 -64 -32 -99.5t-89 -35.5q-52 0 -86 31.5t-34 103.5zM170 1462h207l-51 -1059h-105z" />
|
||||
<glyph unicode=""" horiz-adv-x="821" d="M133 1462h186l-40 -528h-105zM502 1462h186l-41 -528h-104z" />
|
||||
<glyph unicode="#" horiz-adv-x="1323" d="M51 430v129h287l68 340h-277v127h299l82 436h139l-82 -436h305l84 436h134l-84 -436h264v-127h-289l-66 -340h283v-129h-307l-84 -430h-137l84 430h-303l-82 -430h-136l80 430h-262zM475 559h303l66 340h-303z" />
|
||||
<glyph unicode="$" d="M131 170v156q83 -37 191.5 -60.5t197.5 -23.5v440q-205 65 -287.5 151t-82.5 222q0 131 101.5 215t268.5 102v182h129v-180q184 -5 355 -74l-52 -131q-149 59 -303 70v-434q157 -50 235 -97.5t115 -109t37 -149.5q0 -136 -102 -224.5t-285 -111.5v-232h-129v223 q-112 0 -217 17.5t-172 48.5zM319 1057q0 -76 45 -122t156 -87v387q-99 -16 -150 -62.5t-51 -115.5zM649 252q217 30 217 184q0 72 -44.5 116.5t-172.5 88.5v-389z" />
|
||||
<glyph unicode="%" horiz-adv-x="1686" d="M104 1026q0 227 74.5 342t220.5 115q145 0 223 -119t78 -338q0 -228 -76.5 -344.5t-224.5 -116.5q-140 0 -217.5 119t-77.5 342zM242 1026q0 -170 37 -255t120 -85q164 0 164 340q0 338 -164 338q-83 0 -120 -84t-37 -254zM365 0l811 1462h147l-811 -1462h-147zM985 440 q0 227 74.5 342t220.5 115q142 0 221.5 -117.5t79.5 -339.5q0 -227 -76.5 -343.5t-224.5 -116.5q-142 0 -218.5 119t-76.5 341zM1122 440q0 -171 37 -255.5t121 -84.5t124 83.5t40 256.5q0 171 -40 253.5t-124 82.5t-121 -82.5t-37 -253.5z" />
|
||||
<glyph unicode="&" horiz-adv-x="1495" d="M113 379q0 130 69.5 230t249.5 202q-85 95 -115.5 144t-48.5 102t-18 110q0 150 98 234t273 84q162 0 255 -83.5t93 -232.5q0 -107 -68 -197.5t-225 -183.5l407 -391q56 62 89.5 145.5t56.5 182.5h168q-68 -286 -205 -434l299 -291h-229l-185 178q-118 -106 -240 -152 t-272 -46q-215 0 -333.5 106t-118.5 293zM285 383q0 -117 77.5 -185.5t206.5 -68.5q241 0 400 154l-437 424q-111 -68 -157 -112.5t-68 -95.5t-22 -116zM414 1171q0 -69 36 -131.5t123 -150.5q129 75 179.5 138.5t50.5 146.5q0 77 -51.5 125.5t-137.5 48.5q-89 0 -144.5 -48 t-55.5 -129z" />
|
||||
<glyph unicode="'" horiz-adv-x="453" d="M133 1462h186l-40 -528h-105z" />
|
||||
<glyph unicode="(" horiz-adv-x="606" d="M82 561q0 265 77.5 496t223.5 405h162q-144 -193 -216.5 -424t-72.5 -475q0 -240 74 -469t213 -418h-160q-147 170 -224 397t-77 488z" />
|
||||
<glyph unicode=")" horiz-adv-x="606" d="M61 1462h162q147 -175 224 -406.5t77 -494.5t-77.5 -490t-223.5 -395h-160q139 188 213 417.5t74 469.5q0 244 -72.5 475t-216.5 424z" />
|
||||
<glyph unicode="*" horiz-adv-x="1130" d="M86 1090l29 182l391 -111l-43 395h194l-43 -395l398 111l26 -182l-381 -31l248 -326l-172 -94l-176 362l-160 -362l-176 94l242 326z" />
|
||||
<glyph unicode="+" d="M104 653v138h410v428h139v-428h412v-138h-412v-426h-139v426h-410z" />
|
||||
<glyph unicode="," horiz-adv-x="502" d="M63 -264q27 104 59.5 257t45.5 245h182l15 -23q-26 -100 -75 -232.5t-102 -246.5h-125z" />
|
||||
<glyph unicode="-" horiz-adv-x="659" d="M84 473v152h491v-152h-491z" />
|
||||
<glyph unicode="." horiz-adv-x="545" d="M152 106q0 67 30.5 101.5t87.5 34.5q58 0 90.5 -34.5t32.5 -101.5q0 -65 -33 -100t-90 -35q-51 0 -84.5 31.5t-33.5 103.5z" />
|
||||
<glyph unicode="/" horiz-adv-x="752" d="M20 0l545 1462h166l-545 -1462h-166z" />
|
||||
<glyph unicode="0" d="M102 733q0 382 119 567t363 185q238 0 361.5 -193t123.5 -559q0 -379 -119.5 -566t-365.5 -187q-236 0 -359 191.5t-123 561.5zM270 733q0 -319 75 -464.5t239 -145.5q166 0 240.5 147.5t74.5 462.5t-74.5 461.5t-240.5 146.5q-164 0 -239 -144.5t-75 -463.5z" />
|
||||
<glyph unicode="1" d="M188 1163l387 299h140v-1462h-162v1042q0 130 8 246q-21 -21 -47 -44t-238 -195z" />
|
||||
<glyph unicode="2" d="M100 0v143l385 387q176 178 232 254t84 148t28 155q0 117 -71 185.5t-197 68.5q-91 0 -172.5 -30t-181.5 -109l-88 113q202 168 440 168q206 0 323 -105.5t117 -283.5q0 -139 -78 -275t-292 -344l-320 -313v-8h752v-154h-961z" />
|
||||
<glyph unicode="3" d="M94 59v158q95 -47 202.5 -71.5t203.5 -24.5q379 0 379 297q0 266 -418 266h-144v143h146q171 0 271 75.5t100 209.5q0 107 -73.5 168t-199.5 61q-96 0 -181 -26t-194 -96l-84 112q90 71 207.5 111.5t247.5 40.5q213 0 331 -97.5t118 -267.5q0 -140 -78.5 -229 t-222.5 -119v-8q176 -22 261 -112t85 -236q0 -209 -145 -321.5t-412 -112.5q-116 0 -212.5 17.5t-187.5 61.5z" />
|
||||
<glyph unicode="4" d="M43 336v145l694 989h176v-983h217v-151h-217v-336h-159v336h-711zM209 487h545v486q0 143 10 323h-8q-48 -96 -90 -159z" />
|
||||
<glyph unicode="5" d="M133 59v160q70 -45 174 -70.5t205 -25.5q176 0 273.5 83t97.5 240q0 306 -375 306q-95 0 -254 -29l-86 55l55 684h727v-153h-585l-37 -439q115 23 229 23q231 0 363.5 -114.5t132.5 -313.5q0 -227 -144.5 -356t-398.5 -129q-247 0 -377 79z" />
|
||||
<glyph unicode="6" d="M117 625q0 431 167.5 644.5t495.5 213.5q113 0 178 -19v-143q-77 25 -176 25q-235 0 -359 -146.5t-136 -460.5h12q110 172 348 172q197 0 310.5 -119t113.5 -323q0 -228 -124.5 -358.5t-336.5 -130.5q-227 0 -360 170.5t-133 474.5zM287 506q0 -103 40 -192t113.5 -141 t167.5 -52q142 0 220.5 89.5t78.5 258.5q0 145 -73 228t-218 83q-90 0 -165 -37t-119.5 -102t-44.5 -135z" />
|
||||
<glyph unicode="7" d="M94 1309v153h973v-133l-598 -1329h-184l606 1309h-797z" />
|
||||
<glyph unicode="8" d="M104 373q0 251 306 391q-138 78 -198 168.5t-60 202.5q0 159 117.5 253.5t314.5 94.5q200 0 317 -93t117 -257q0 -108 -67 -197t-214 -162q178 -85 253 -178.5t75 -216.5q0 -182 -127 -290.5t-348 -108.5q-234 0 -360 102.5t-126 290.5zM268 369q0 -120 83.5 -187 t234.5 -67q149 0 232 70t83 192q0 97 -78 172.5t-272 146.5q-149 -64 -216 -141.5t-67 -185.5zM315 1128q0 -92 59 -158t218 -132q143 60 202.5 129t59.5 161q0 101 -72.5 160.5t-199.5 59.5q-125 0 -196 -60t-71 -160z" />
|
||||
<glyph unicode="9" d="M106 991q0 228 127.5 360t335.5 132q149 0 260.5 -76.5t171.5 -223t60 -345.5q0 -858 -664 -858q-116 0 -184 20v143q80 -26 182 -26q240 0 362.5 148.5t133.5 455.5h-12q-55 -83 -146 -126.5t-205 -43.5q-194 0 -308 116t-114 324zM270 993q0 -144 72 -226.5t219 -82.5 q91 0 167.5 37t120.5 101t44 134q0 105 -41 194t-114.5 140t-168.5 51q-143 0 -221 -92t-78 -256z" />
|
||||
<glyph unicode=":" horiz-adv-x="545" d="M152 106q0 67 30.5 101.5t87.5 34.5q58 0 90.5 -34.5t32.5 -101.5q0 -65 -33 -100t-90 -35q-51 0 -84.5 31.5t-33.5 103.5zM152 989q0 135 118 135q123 0 123 -135q0 -65 -33 -100t-90 -35q-51 0 -84.5 31.5t-33.5 103.5z" />
|
||||
<glyph unicode=";" horiz-adv-x="545" d="M63 -264q27 104 59.5 257t45.5 245h182l15 -23q-26 -100 -75 -232.5t-102 -246.5h-125zM147 989q0 135 119 135q123 0 123 -135q0 -65 -33 -100t-90 -35q-58 0 -88.5 35t-30.5 100z" />
|
||||
<glyph unicode="<" d="M104 664v98l961 479v-149l-782 -371l782 -328v-151z" />
|
||||
<glyph unicode="=" d="M119 449v137h930v-137h-930zM119 858v137h930v-137h-930z" />
|
||||
<glyph unicode=">" d="M104 242v151l783 326l-783 373v149l961 -479v-98z" />
|
||||
<glyph unicode="?" horiz-adv-x="879" d="M27 1384q189 99 395 99q191 0 297 -94t106 -265q0 -73 -19.5 -128.5t-57.5 -105t-164 -159.5q-101 -86 -133.5 -143t-32.5 -152v-33h-129v54q0 117 36 192.5t134 159.5q136 115 171.5 173t35.5 140q0 102 -65.5 157.5t-188.5 55.5q-79 0 -154 -18.5t-172 -67.5zM240 106 q0 136 120 136q58 0 89.5 -35t31.5 -101q0 -64 -32 -99.5t-89 -35.5q-52 0 -86 31.5t-34 103.5z" />
|
||||
<glyph unicode="@" horiz-adv-x="1841" d="M121 571q0 260 107 463t305 314.5t454 111.5q215 0 382.5 -90.5t259 -257t91.5 -383.5q0 -142 -44 -260t-124 -183t-184 -65q-86 0 -145 52t-70 133h-8q-40 -87 -114.5 -136t-176.5 -49q-150 0 -234.5 102.5t-84.5 278.5q0 204 118 331.5t310 127.5q68 0 154 -12.5 t155 -34.5l-25 -470v-22q0 -178 133 -178q91 0 148 107.5t57 279.5q0 181 -74 317t-210.5 209.5t-313.5 73.5q-223 0 -388 -92.5t-252 -264t-87 -396.5q0 -305 161 -469t464 -164q210 0 436 86v-133q-192 -84 -436 -84q-363 0 -563.5 199.5t-200.5 557.5zM686 598 q0 -254 195 -254q207 0 225 313l14 261q-72 20 -157 20q-130 0 -203.5 -90t-73.5 -250z" />
|
||||
<glyph unicode="A" horiz-adv-x="1296" d="M0 0l578 1468h143l575 -1468h-176l-182 465h-586l-180 -465h-172zM412 618h473l-170 453q-33 86 -68 211q-22 -96 -63 -211z" />
|
||||
<glyph unicode="B" horiz-adv-x="1327" d="M201 0v1462h413q291 0 421 -87t130 -275q0 -130 -72.5 -214.5t-211.5 -109.5v-10q333 -57 333 -350q0 -196 -132.5 -306t-370.5 -110h-510zM371 145h305q177 0 266.5 68.5t89.5 214.5q0 136 -91.5 200t-278.5 64h-291v-547zM371 836h280q180 0 259 56.5t79 190.5 q0 123 -88 177.5t-280 54.5h-250v-479z" />
|
||||
<glyph unicode="C" horiz-adv-x="1292" d="M125 733q0 226 84.5 396t244 262t375.5 92q230 0 402 -84l-72 -146q-166 78 -332 78q-241 0 -380.5 -160.5t-139.5 -439.5q0 -287 134.5 -443.5t383.5 -156.5q153 0 349 55v-149q-152 -57 -375 -57q-323 0 -498.5 196t-175.5 557z" />
|
||||
<glyph unicode="D" horiz-adv-x="1493" d="M201 0v1462h448q341 0 530 -189t189 -528q0 -362 -196.5 -553.5t-565.5 -191.5h-405zM371 147h207q304 0 457 149.5t153 442.5q0 286 -143.5 431t-426.5 145h-247v-1168z" />
|
||||
<glyph unicode="E" horiz-adv-x="1139" d="M201 0v1462h815v-151h-645v-471h606v-150h-606v-538h645v-152h-815z" />
|
||||
<glyph unicode="F" horiz-adv-x="1057" d="M201 0v1462h815v-151h-645v-535h606v-151h-606v-625h-170z" />
|
||||
<glyph unicode="G" horiz-adv-x="1491" d="M125 731q0 228 91.5 399.5t263.5 262t403 90.5q234 0 436 -86l-66 -150q-198 84 -381 84q-267 0 -417 -159t-150 -441q0 -296 144.5 -449t424.5 -153q152 0 297 35v450h-327v152h497v-711q-116 -37 -236 -56t-278 -19q-332 0 -517 197.5t-185 553.5z" />
|
||||
<glyph unicode="H" horiz-adv-x="1511" d="M201 0v1462h170v-622h770v622h170v-1462h-170v688h-770v-688h-170z" />
|
||||
<glyph unicode="I" horiz-adv-x="571" d="M201 0v1462h170v-1462h-170z" />
|
||||
<glyph unicode="J" horiz-adv-x="547" d="M-160 -213q71 -20 148 -20q99 0 150.5 60t51.5 173v1462h170v-1448q0 -190 -96 -294.5t-276 -104.5q-94 0 -148 27v145z" />
|
||||
<glyph unicode="K" horiz-adv-x="1257" d="M201 0v1462h170v-725l663 725h201l-588 -635l610 -827h-200l-533 709l-153 -136v-573h-170z" />
|
||||
<glyph unicode="L" horiz-adv-x="1063" d="M201 0v1462h170v-1308h645v-154h-815z" />
|
||||
<glyph unicode="M" horiz-adv-x="1849" d="M201 0v1462h256l463 -1206h8l467 1206h254v-1462h-170v942q0 162 14 352h-8l-500 -1294h-137l-496 1296h-8q14 -154 14 -366v-930h-157z" />
|
||||
<glyph unicode="N" horiz-adv-x="1544" d="M201 0v1462h192l797 -1222h8q-2 28 -9 174q-5 114 -5 177v32v839h159v-1462h-194l-799 1227h-8q16 -216 16 -396v-831h-157z" />
|
||||
<glyph unicode="O" horiz-adv-x="1595" d="M125 735q0 357 176 553.5t500 196.5q315 0 492 -200t177 -552q0 -351 -177.5 -552t-493.5 -201q-323 0 -498.5 197.5t-175.5 557.5zM305 733q0 -297 126.5 -450.5t367.5 -153.5q243 0 367 153t124 451q0 295 -123.5 447.5t-365.5 152.5q-243 0 -369.5 -153.5 t-126.5 -446.5z" />
|
||||
<glyph unicode="P" horiz-adv-x="1233" d="M201 0v1462h379q548 0 548 -426q0 -222 -151.5 -341.5t-433.5 -119.5h-172v-575h-170zM371 721h153q226 0 327 73t101 234q0 145 -95 216t-296 71h-190v-594z" />
|
||||
<glyph unicode="Q" horiz-adv-x="1595" d="M125 735q0 357 176 553.5t500 196.5q315 0 492 -200t177 -552q0 -281 -113 -467t-319 -252l348 -362h-247l-285 330l-55 -2q-323 0 -498.5 197.5t-175.5 557.5zM305 733q0 -297 126.5 -450.5t367.5 -153.5q243 0 367 153t124 451q0 295 -123.5 447.5t-365.5 152.5 q-243 0 -369.5 -153.5t-126.5 -446.5z" />
|
||||
<glyph unicode="R" horiz-adv-x="1266" d="M201 0v1462h401q269 0 397.5 -103t128.5 -310q0 -290 -294 -392l397 -657h-201l-354 608h-305v-608h-170zM371 754h233q180 0 264 71.5t84 214.5q0 145 -85.5 209t-274.5 64h-221v-559z" />
|
||||
<glyph unicode="S" horiz-adv-x="1124" d="M106 47v164q90 -38 196 -60t210 -22q170 0 256 64.5t86 179.5q0 76 -30.5 124.5t-102 89.5t-217.5 93q-204 73 -291.5 173t-87.5 261q0 169 127 269t336 100q218 0 401 -80l-53 -148q-181 76 -352 76q-135 0 -211 -58t-76 -161q0 -76 28 -124.5t94.5 -89t203.5 -89.5 q230 -82 316.5 -176t86.5 -244q0 -193 -140 -301t-380 -108q-260 0 -400 67z" />
|
||||
<glyph unicode="T" horiz-adv-x="1133" d="M18 1311v151h1096v-151h-463v-1311h-170v1311h-463z" />
|
||||
<glyph unicode="U" horiz-adv-x="1491" d="M186 520v942h170v-954q0 -183 100 -281t294 -98q185 0 285 98.5t100 282.5v952h170v-946q0 -250 -151 -393t-415 -143t-408.5 144t-144.5 396z" />
|
||||
<glyph unicode="V" horiz-adv-x="1219" d="M0 1462h180l336 -946q58 -163 92 -317q36 162 94 323l334 940h183l-527 -1462h-168z" />
|
||||
<glyph unicode="W" horiz-adv-x="1896" d="M27 1462h180l231 -903q48 -190 70 -344q27 183 80 358l262 889h180l275 -897q48 -155 81 -350q19 142 72 346l230 901h180l-391 -1462h-168l-295 979q-21 65 -47 164t-27 119q-22 -132 -70 -289l-286 -973h-168z" />
|
||||
<glyph unicode="X" horiz-adv-x="1182" d="M8 0l486 764l-453 698h188l363 -579l366 579h181l-453 -692l488 -770h-193l-393 643l-400 -643h-180z" />
|
||||
<glyph unicode="Y" horiz-adv-x="1147" d="M0 1462h186l387 -731l390 731h184l-488 -895v-567h-172v559z" />
|
||||
<glyph unicode="Z" horiz-adv-x="1169" d="M82 0v133l776 1176h-752v153h959v-133l-776 -1175h798v-154h-1005z" />
|
||||
<glyph unicode="[" horiz-adv-x="674" d="M166 -324v1786h457v-141h-289v-1503h289v-142h-457z" />
|
||||
<glyph unicode="\" horiz-adv-x="752" d="M23 1462h163l547 -1462h-166z" />
|
||||
<glyph unicode="]" horiz-adv-x="674" d="M51 -182h289v1503h-289v141h457v-1786h-457v142z" />
|
||||
<glyph unicode="^" horiz-adv-x="1110" d="M49 551l434 922h99l477 -922h-152l-372 745l-334 -745h-152z" />
|
||||
<glyph unicode="_" horiz-adv-x="918" d="M-4 -184h926v-131h-926v131z" />
|
||||
<glyph unicode="`" horiz-adv-x="1182" d="M393 1548v21h203q32 -69 89 -159.5t101 -143.5v-25h-110q-65 52 -154 148t-129 159z" />
|
||||
<glyph unicode="a" horiz-adv-x="1139" d="M94 303q0 332 531 348l186 6v68q0 129 -55.5 190.5t-177.5 61.5q-137 0 -310 -84l-51 127q81 44 177.5 69t193.5 25q196 0 290.5 -87t94.5 -279v-748h-123l-33 156h-8q-82 -103 -163.5 -139.5t-203.5 -36.5q-163 0 -255.5 84t-92.5 239zM268 301q0 -90 54.5 -137 t152.5 -47q155 0 243.5 85t88.5 238v99l-166 -7q-198 -7 -285.5 -61.5t-87.5 -169.5z" />
|
||||
<glyph unicode="b" horiz-adv-x="1255" d="M176 0v1556h166v-378q0 -127 -8 -228h8q116 164 344 164q216 0 335.5 -147.5t119.5 -417.5t-120.5 -419.5t-334.5 -149.5q-107 0 -195.5 39.5t-148.5 121.5h-12l-35 -141h-119zM342 549q0 -231 77 -330.5t247 -99.5q153 0 228 111.5t75 320.5q0 214 -75 319t-232 105 q-170 0 -245 -97.5t-75 -328.5z" />
|
||||
<glyph unicode="c" horiz-adv-x="975" d="M115 541q0 275 132.5 425t377.5 150q79 0 158 -17t124 -40l-51 -141q-55 22 -120 36.5t-115 14.5q-334 0 -334 -426q0 -202 81.5 -310t241.5 -108q137 0 281 59v-147q-110 -57 -277 -57q-238 0 -368.5 146.5t-130.5 414.5z" />
|
||||
<glyph unicode="d" horiz-adv-x="1255" d="M115 545q0 271 120 421t334 150q223 0 342 -162h13l-7 79l-4 77v446h166v-1556h-135l-22 147h-9q-115 -167 -344 -167q-215 0 -334.5 147t-119.5 418zM287 543q0 -210 77 -317t226 -107q170 0 246.5 92.5t76.5 298.5v35q0 233 -77.5 332.5t-247.5 99.5 q-146 0 -223.5 -113.5t-77.5 -320.5z" />
|
||||
<glyph unicode="e" horiz-adv-x="1149" d="M115 539q0 265 130.5 421t350.5 156q206 0 326 -135.5t120 -357.5v-105h-755q5 -193 97.5 -293t260.5 -100q177 0 350 74v-148q-88 -38 -166.5 -54.5t-189.5 -16.5q-243 0 -383.5 148t-140.5 411zM291 653h573q0 157 -70 240.5t-200 83.5q-132 0 -210.5 -86t-92.5 -238z " />
|
||||
<glyph unicode="f" horiz-adv-x="694" d="M29 967v75l196 60v61q0 404 353 404q87 0 204 -35l-43 -133q-96 31 -164 31q-94 0 -139 -62.5t-45 -200.5v-71h279v-129h-279v-967h-166v967h-196z" />
|
||||
<glyph unicode="g" horiz-adv-x="1122" d="M39 -186q0 100 64 173t180 99q-42 19 -70.5 59t-28.5 93q0 60 32 105t101 87q-85 35 -138.5 119t-53.5 192q0 180 108 277.5t306 97.5q86 0 155 -20h379v-105l-203 -24q28 -35 50 -91.5t22 -127.5q0 -161 -110 -257t-302 -96q-49 0 -92 8q-106 -56 -106 -141 q0 -45 37 -66.5t127 -21.5h194q178 0 273.5 -75t95.5 -218q0 -182 -146 -277.5t-426 -95.5q-215 0 -331.5 80t-116.5 226zM199 -184q0 -89 75 -135t215 -46q209 0 309.5 62.5t100.5 169.5q0 89 -55 123.5t-207 34.5h-199q-113 0 -176 -54t-63 -155zM289 745q0 -115 65 -174 t181 -59q243 0 243 236q0 247 -246 247q-117 0 -180 -63t-63 -187z" />
|
||||
<glyph unicode="h" horiz-adv-x="1257" d="M176 0v1556h166v-471q0 -85 -8 -141h10q49 79 139.5 124.5t206.5 45.5q201 0 301.5 -95.5t100.5 -303.5v-715h-166v709q0 134 -61 200t-191 66q-173 0 -252.5 -94t-79.5 -308v-573h-166z" />
|
||||
<glyph unicode="i" horiz-adv-x="518" d="M162 1393q0 57 28 83.5t70 26.5q40 0 69 -27t29 -83t-29 -83.5t-69 -27.5q-42 0 -70 27.5t-28 83.5zM176 0v1096h166v-1096h-166z" />
|
||||
<glyph unicode="j" horiz-adv-x="518" d="M-111 -332q69 -20 136 -20q78 0 114.5 42.5t36.5 129.5v1276h166v-1264q0 -324 -299 -324q-95 0 -154 25v135zM162 1393q0 57 28 83.5t70 26.5q40 0 69 -27t29 -83t-29 -83.5t-69 -27.5q-42 0 -70 27.5t-28 83.5z" />
|
||||
<glyph unicode="k" horiz-adv-x="1075" d="M176 0v1556h164v-825q0 -55 -8 -170h8q43 61 131 160l354 375h197l-444 -467l475 -629h-201l-387 518l-125 -108v-410h-164z" />
|
||||
<glyph unicode="l" horiz-adv-x="518" d="M176 0v1556h166v-1556h-166z" />
|
||||
<glyph unicode="m" horiz-adv-x="1905" d="M176 0v1096h135l27 -150h8q47 80 132.5 125t191.5 45q257 0 336 -186h8q49 86 142 136t212 50q186 0 278.5 -95.5t92.5 -305.5v-715h-166v713q0 131 -56 196.5t-174 65.5q-155 0 -229 -89t-74 -274v-612h-166v713q0 131 -56 196.5t-175 65.5q-156 0 -228.5 -93.5 t-72.5 -306.5v-575h-166z" />
|
||||
<glyph unicode="n" horiz-adv-x="1257" d="M176 0v1096h135l27 -150h8q51 81 143 125.5t205 44.5q198 0 298 -95.5t100 -305.5v-715h-166v709q0 134 -61 200t-191 66q-172 0 -252 -93t-80 -307v-575h-166z" />
|
||||
<glyph unicode="o" horiz-adv-x="1237" d="M115 549q0 268 134 417.5t372 149.5q230 0 365.5 -153t135.5 -414q0 -268 -135 -418.5t-373 -150.5q-147 0 -261 69t-176 198t-62 302zM287 549q0 -210 84 -320t247 -110t247.5 109.5t84.5 320.5q0 209 -84.5 317.5t-249.5 108.5q-163 0 -246 -107t-83 -319z" />
|
||||
<glyph unicode="p" horiz-adv-x="1255" d="M176 -492v1588h135l23 -150h8q64 90 149 130t195 40q218 0 336.5 -149t118.5 -418q0 -270 -120.5 -419.5t-334.5 -149.5q-107 0 -195.5 39.5t-148.5 121.5h-12q12 -96 12 -182v-451h-166zM342 549q0 -231 77 -330.5t247 -99.5q142 0 222.5 115t80.5 317 q0 205 -80.5 314.5t-226.5 109.5q-168 0 -243 -93t-77 -296v-37z" />
|
||||
<glyph unicode="q" horiz-adv-x="1255" d="M115 545q0 269 120 420t334 151q225 0 346 -170h9l24 150h131v-1588h-166v469q0 100 11 170h-13q-115 -167 -346 -167q-212 0 -331 149t-119 416zM287 543q0 -207 76.5 -315.5t226.5 -108.5q166 0 242 89t81 300v37q0 230 -78 331t-247 101q-146 0 -223.5 -113.5 t-77.5 -320.5z" />
|
||||
<glyph unicode="r" horiz-adv-x="836" d="M176 0v1096h137l19 -203h8q61 107 147 165t189 58q73 0 131 -12l-23 -154q-68 15 -120 15q-133 0 -227.5 -108t-94.5 -269v-588h-166z" />
|
||||
<glyph unicode="s" horiz-adv-x="977" d="M106 827q0 134 109 211.5t299 77.5q177 0 346 -72l-59 -135q-165 68 -299 68q-118 0 -178 -37t-60 -102q0 -44 22.5 -75t72.5 -59t192 -81q195 -71 263.5 -143t68.5 -181q0 -153 -114 -236t-320 -83q-218 0 -340 69v154q79 -40 169.5 -63t174.5 -23q130 0 200 41.5 t70 126.5q0 64 -55.5 109.5t-216.5 107.5q-153 57 -217.5 99.5t-96 96.5t-31.5 129z" />
|
||||
<glyph unicode="t" horiz-adv-x="723" d="M31 967v80l157 69l70 234h96v-254h318v-129h-318v-645q0 -99 47 -152t129 -53q44 0 85 6.5t65 13.5v-127q-27 -13 -79.5 -21.5t-94.5 -8.5q-318 0 -318 335v652h-157z" />
|
||||
<glyph unicode="u" horiz-adv-x="1257" d="M164 379v717h168v-711q0 -134 61 -200t191 -66q172 0 251.5 94t79.5 307v576h166v-1096h-137l-24 147h-9q-51 -81 -141.5 -124t-206.5 -43q-200 0 -299.5 95t-99.5 304z" />
|
||||
<glyph unicode="v" horiz-adv-x="1026" d="M0 1096h178l236 -650q80 -228 94 -296h8q11 53 69.5 219.5t262.5 726.5h178l-416 -1096h-194z" />
|
||||
<glyph unicode="w" horiz-adv-x="1593" d="M23 1096h174q106 -413 161.5 -629t63.5 -291h8q11 57 35.5 147.5t42.5 143.5l201 629h180l196 -629q56 -172 76 -289h8q4 36 21.5 111t208.5 807h172l-303 -1096h-197l-201 643q-19 59 -71 268h-8q-40 -175 -70 -270l-207 -641h-192z" />
|
||||
<glyph unicode="x" horiz-adv-x="1073" d="M39 0l401 561l-381 535h189l289 -420l288 420h187l-381 -535l401 -561h-188l-307 444l-310 -444h-188z" />
|
||||
<glyph unicode="y" horiz-adv-x="1032" d="M2 1096h178l240 -625q79 -214 98 -309h8q13 51 54.5 174.5t271.5 759.5h178l-471 -1248q-70 -185 -163.5 -262.5t-229.5 -77.5q-76 0 -150 17v133q55 -12 123 -12q171 0 244 192l61 156z" />
|
||||
<glyph unicode="z" horiz-adv-x="958" d="M82 0v113l598 854h-561v129h743v-129l-590 -838h605v-129h-795z" />
|
||||
<glyph unicode="{" horiz-adv-x="776" d="M61 498v141q130 2 188 48t58 142v306q0 155 108 241t290 86v-139q-230 -6 -230 -199v-295q0 -215 -223 -254v-12q223 -39 223 -254v-297q0 -102 58.5 -148t171.5 -48v-140q-190 2 -294 87t-104 239v303q0 104 -63 148.5t-183 44.5z" />
|
||||
<glyph unicode="|" horiz-adv-x="1128" d="M494 -496v2052h141v-2052h-141z" />
|
||||
<glyph unicode="}" horiz-adv-x="776" d="M72 -184q111 2 169 48t58 148v297q0 114 55 174t168 80v12q-223 39 -223 254v295q0 193 -227 199v139q184 0 289.5 -87t105.5 -240v-306q0 -97 59 -142.5t189 -47.5v-141q-122 0 -185 -44.5t-63 -148.5v-303q0 -153 -102.5 -238.5t-292.5 -87.5v140z" />
|
||||
<glyph unicode="~" d="M104 592v151q100 109 244 109q68 0 124.5 -14t145.5 -52q66 -28 115 -41.5t96 -13.5q54 0 118 32t118 89v-150q-102 -110 -244 -110q-72 0 -135 16.5t-135 48.5q-75 32 -120 44t-93 12q-53 0 -116.5 -33.5t-117.5 -87.5z" />
|
||||
<glyph unicode="¢" d="M190 741q0 508 396 570v172h135v-164q75 -3 146 -19.5t120 -39.5l-49 -140q-133 51 -242 51q-172 0 -253 -105.5t-81 -322.5q0 -212 79.5 -313.5t246.5 -101.5q141 0 283 59v-147q-105 -54 -252 -60v-200h-133v206q-203 32 -299.5 168.5t-96.5 386.5z" />
|
||||
<glyph unicode="£" d="M63 0v141q205 47 205 291v223h-198v127h198v316q0 178 112 280.5t302 102.5t360 -84l-61 -133q-154 77 -297 77q-123 0 -185.5 -62t-62.5 -202v-295h422v-127h-422v-221q0 -100 -32.5 -168t-106.5 -112h795v-154h-1029z" />
|
||||
<glyph unicode="¥" d="M31 1462h178l375 -727l379 727h174l-416 -770h262v-127h-317v-170h317v-127h-317v-268h-164v268h-316v127h316v170h-316v127h256z" />
|
||||
<glyph unicode="©" horiz-adv-x="1704" d="M100 731q0 200 100 375t275 276t377 101q200 0 375 -100t276 -275t101 -377q0 -197 -97 -370t-272 -277t-383 -104q-207 0 -382 103.5t-272.5 276.5t-97.5 371zM205 731q0 -173 87 -323.5t237.5 -237t322.5 -86.5q174 0 323 87t236.5 235.5t87.5 324.5q0 174 -87 323 t-235.5 236.5t-324.5 87.5q-174 0 -323 -87t-236.5 -235.5t-87.5 -324.5zM481 731q0 209 110.5 332t301.5 123q128 0 246 -60l-58 -118q-108 51 -188 51q-125 0 -192.5 -87t-67.5 -241q0 -168 63.5 -249t194.5 -81q86 0 211 45v-124q-48 -20 -98.5 -34t-120.5 -14 q-194 0 -298 120.5t-104 336.5z" />
|
||||
<glyph unicode="­" horiz-adv-x="659" d="M84 473v152h491v-152h-491z" />
|
||||
<glyph unicode="®" horiz-adv-x="1704" d="M100 731q0 200 100 375t275 276t377 101q200 0 375 -100t276 -275t101 -377q0 -197 -97 -370t-272 -277t-383 -104q-207 0 -382 103.5t-272.5 276.5t-97.5 371zM205 731q0 -173 87 -323.5t237.5 -237t322.5 -86.5q174 0 323 87t236.5 235.5t87.5 324.5q0 174 -87 323 t-235.5 236.5t-324.5 87.5q-174 0 -323 -87t-236.5 -235.5t-87.5 -324.5zM575 285v891h261q166 0 243.5 -65t77.5 -198q0 -80 -42.5 -141.5t-119.5 -91.5l238 -395h-168l-207 354h-135v-354h-148zM723 762h108q80 0 128.5 41.5t48.5 105.5q0 75 -43 107.5t-136 32.5h-106 v-287z" />
|
||||
<glyph unicode="´" horiz-adv-x="1182" d="M393 1241v25q48 62 103.5 150t87.5 153h202v-21q-44 -65 -131 -160t-151 -147h-111z" />
|
||||
<glyph unicode=" " horiz-adv-x="784" />
|
||||
<glyph unicode=" " horiz-adv-x="1569" />
|
||||
<glyph unicode=" " horiz-adv-x="784" />
|
||||
<glyph unicode=" " horiz-adv-x="1569" />
|
||||
<glyph unicode=" " horiz-adv-x="523" />
|
||||
<glyph unicode=" " horiz-adv-x="392" />
|
||||
<glyph unicode=" " horiz-adv-x="261" />
|
||||
<glyph unicode=" " horiz-adv-x="261" />
|
||||
<glyph unicode=" " horiz-adv-x="196" />
|
||||
<glyph unicode=" " horiz-adv-x="313" />
|
||||
<glyph unicode=" " horiz-adv-x="87" />
|
||||
<glyph unicode="‐" horiz-adv-x="659" d="M84 473v152h491v-152h-491z" />
|
||||
<glyph unicode="‑" horiz-adv-x="659" d="M84 473v152h491v-152h-491z" />
|
||||
<glyph unicode="‒" horiz-adv-x="659" d="M84 473v152h491v-152h-491z" />
|
||||
<glyph unicode="–" horiz-adv-x="1024" d="M82 473v152h860v-152h-860z" />
|
||||
<glyph unicode="—" horiz-adv-x="2048" d="M82 473v152h1884v-152h-1884z" />
|
||||
<glyph unicode="‘" horiz-adv-x="348" d="M25 983q22 90 71 224t105 255h123q-66 -254 -103 -501h-184z" />
|
||||
<glyph unicode="’" horiz-adv-x="348" d="M25 961q70 285 102 501h182l15 -22q-26 -100 -75 -232.5t-102 -246.5h-122z" />
|
||||
<glyph unicode="“" horiz-adv-x="717" d="M25 983q22 90 71 224t105 255h123q-66 -254 -103 -501h-184zM391 983q56 215 178 479h123q-30 -115 -59.5 -259.5t-42.5 -241.5h-184z" />
|
||||
<glyph unicode="”" horiz-adv-x="717" d="M25 961q70 285 102 501h182l15 -22q-26 -100 -75 -232.5t-102 -246.5h-122zM391 961q26 100 59 254t46 247h182l14 -22q-24 -91 -72 -224t-104 -255h-125z" />
|
||||
<glyph unicode="•" horiz-adv-x="770" d="M164 748q0 121 56.5 184t164.5 63q105 0 163 -62t58 -185q0 -119 -57.5 -183.5t-163.5 -64.5q-107 0 -164 65.5t-57 182.5z" />
|
||||
<glyph unicode="…" horiz-adv-x="1606" d="M152 106q0 67 30.5 101.5t87.5 34.5q58 0 90.5 -34.5t32.5 -101.5q0 -65 -33 -100t-90 -35q-51 0 -84.5 31.5t-33.5 103.5zM682 106q0 67 30.5 101.5t87.5 34.5q58 0 90.5 -34.5t32.5 -101.5q0 -65 -33 -100t-90 -35q-51 0 -84.5 31.5t-33.5 103.5zM1213 106 q0 67 30.5 101.5t87.5 34.5q58 0 90.5 -34.5t32.5 -101.5q0 -65 -33 -100t-90 -35q-51 0 -84.5 31.5t-33.5 103.5z" />
|
||||
<glyph unicode=" " horiz-adv-x="313" />
|
||||
<glyph unicode=" " horiz-adv-x="392" />
|
||||
<glyph unicode="€" horiz-adv-x="1208" d="M63 506v129h152l-2 42v44l2 80h-152v129h164q39 261 185 407t383 146q201 0 366 -97l-71 -139q-166 86 -295 86q-319 0 -398 -403h510v-129h-524l-2 -57v-64l2 -45h463v-129h-447q37 -180 138.5 -278.5t271.5 -98.5q156 0 309 66v-150q-146 -65 -317 -65 q-237 0 -381.5 134.5t-190.5 391.5h-166z" />
|
||||
<glyph unicode="™" horiz-adv-x="1589" d="M37 1356v106h543v-106h-211v-615h-123v615h-209zM647 741v721h187l196 -559l203 559h180v-721h-127v420l6 137h-8l-211 -557h-104l-201 559h-8l6 -129v-430h-119z" />
|
||||
<glyph unicode="" horiz-adv-x="1095" d="M0 1095h1095v-1095h-1095v1095z" />
|
||||
</font>
|
||||
</defs></svg>
|
After Width: | Height: | Size: 25 KiB |
BIN
fonts/OpenSans-Regular-webfont.ttf
Normal file
BIN
fonts/OpenSans-Regular-webfont.woff
Normal file
BIN
fonts/OpenSans-Semibold-webfont.eot
Normal file
146
fonts/OpenSans-Semibold-webfont.svg
Normal file
@ -0,0 +1,146 @@
|
||||
<?xml version="1.0" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
|
||||
<svg xmlns="http://www.w3.org/2000/svg">
|
||||
<metadata>
|
||||
This is a custom SVG webfont generated by Font Squirrel.
|
||||
Copyright : Digitized data copyright 2011 Google Corporation
|
||||
Foundry : Ascender Corporation
|
||||
Foundry URL : httpwwwascendercorpcom
|
||||
</metadata>
|
||||
<defs>
|
||||
<font id="OpenSansSemibold" horiz-adv-x="1169" >
|
||||
<font-face units-per-em="2048" ascent="1638" descent="-410" />
|
||||
<missing-glyph horiz-adv-x="532" />
|
||||
<glyph unicode=" " horiz-adv-x="532" />
|
||||
<glyph unicode="	" horiz-adv-x="532" />
|
||||
<glyph unicode=" " horiz-adv-x="532" />
|
||||
<glyph unicode="!" horiz-adv-x="565" d="M133 125q0 74 39 112.5t111 38.5q71 0 109 -40t38 -111t-38.5 -112.5t-108.5 -41.5q-71 0 -110.5 40t-39.5 114zM145 1462h277l-51 -1018h-174z" />
|
||||
<glyph unicode=""" horiz-adv-x="893" d="M133 1462h232l-41 -528h-150zM528 1462h232l-41 -528h-150z" />
|
||||
<glyph unicode="#" horiz-adv-x="1323" d="M47 418v168h283l57 284h-264v168h293l80 422h180l-80 -422h252l80 422h174l-80 -422h252v-168h-285l-55 -284h270v-168h-303l-80 -418h-178l80 418h-248l-80 -418h-174l76 418h-250zM506 586h250l57 284h-250z" />
|
||||
<glyph unicode="$" d="M111 168v211q86 -42 201 -70.5t206 -29.5v374l-84 31q-164 63 -239.5 150.5t-75.5 216.5q0 138 107.5 227t291.5 108v168h133v-165q203 -7 385 -82l-73 -183q-157 62 -312 74v-364l76 -29q190 -73 263 -154t73 -198q0 -145 -106 -239t-306 -116v-217h-133v211 q-248 4 -407 76zM354 1053q0 -57 35.5 -95t128.5 -75v311q-80 -12 -122 -49t-42 -92zM651 287q176 27 176 151q0 58 -40.5 95.5t-135.5 72.5v-319z" />
|
||||
<glyph unicode="%" horiz-adv-x="1765" d="M84 1026q0 457 319 457q157 0 241.5 -118.5t84.5 -338.5q0 -230 -82.5 -345.5t-243.5 -115.5q-152 0 -235.5 119.5t-83.5 341.5zM279 1024q0 -149 29 -222t95 -73q132 0 132 295t-132 295q-66 0 -95 -73t-29 -222zM379 0l811 1462h194l-811 -1462h-194zM1036 440 q0 457 320 457q154 0 239.5 -118t85.5 -339q0 -230 -83 -345t-242 -115q-152 0 -236 118.5t-84 341.5zM1231 440q0 -149 29.5 -223t95.5 -74q131 0 131 297q0 293 -131 293q-66 0 -95.5 -72t-29.5 -221z" />
|
||||
<glyph unicode="&" horiz-adv-x="1516" d="M96 387q0 131 64 228.5t231 193.5q-95 111 -129.5 187.5t-34.5 158.5q0 152 108.5 240t291.5 88q177 0 278 -85.5t101 -230.5q0 -114 -67.5 -207t-225.5 -186l346 -334q81 107 135 314h242q-70 -284 -224 -463l301 -291h-303l-149 145q-102 -82 -217.5 -123.5 t-255.5 -41.5q-230 0 -361 109t-131 298zM344 403q0 -98 69.5 -159.5t186.5 -61.5q183 0 313 107l-383 377q-106 -68 -146 -127.5t-40 -135.5zM451 1147q0 -63 33.5 -119t93.5 -119q113 64 158.5 119.5t45.5 124.5q0 65 -43.5 104t-115.5 39q-79 0 -125.5 -40.5 t-46.5 -108.5z" />
|
||||
<glyph unicode="'" horiz-adv-x="498" d="M133 1462h232l-41 -528h-150z" />
|
||||
<glyph unicode="(" horiz-adv-x="649" d="M82 561q0 265 77.5 496t223.5 405h205q-139 -188 -213 -421.5t-74 -477.5t74 -473t211 -414h-203q-147 170 -224 397t-77 488z" />
|
||||
<glyph unicode=")" horiz-adv-x="649" d="M61 1462h205q147 -175 224 -406.5t77 -494.5t-77.5 -490t-223.5 -395h-203q138 187 211.5 415t73.5 472q0 245 -74 477.5t-213 421.5z" />
|
||||
<glyph unicode="*" horiz-adv-x="1122" d="M74 1065l35 217l376 -108l-41 382h228l-41 -382l385 108l28 -217l-360 -29l236 -311l-199 -107l-166 338l-149 -338l-205 107l231 311z" />
|
||||
<glyph unicode="+" d="M96 633v178h398v408h180v-408h399v-178h-399v-406h-180v406h-398z" />
|
||||
<glyph unicode="," horiz-adv-x="547" d="M63 -264q69 270 103 502h231l15 -23q-48 -186 -176 -479h-173z" />
|
||||
<glyph unicode="-" horiz-adv-x="659" d="M72 449v200h514v-200h-514z" />
|
||||
<glyph unicode="." horiz-adv-x="563" d="M133 125q0 73 38 112t110 39q73 0 111 -40.5t38 -110.5q0 -71 -38.5 -112.5t-110.5 -41.5t-110 41t-38 113z" />
|
||||
<glyph unicode="/" horiz-adv-x="799" d="M16 0l545 1462h221l-544 -1462h-222z" />
|
||||
<glyph unicode="0" d="M88 731q0 387 122.5 570.5t373.5 183.5q245 0 371 -192t126 -562q0 -381 -122.5 -566t-374.5 -185q-244 0 -370 191t-126 560zM326 731q0 -299 61.5 -427t196.5 -128t197.5 130t62.5 425q0 294 -62.5 425.5t-197.5 131.5t-196.5 -129t-61.5 -428z" />
|
||||
<glyph unicode="1" d="M154 1124l430 338h196v-1462h-235v944q0 169 8 268q-23 -24 -56.5 -53t-224.5 -184z" />
|
||||
<glyph unicode="2" d="M90 0v178l377 379q167 171 221.5 242.5t79.5 134.5t25 135q0 99 -59.5 156t-164.5 57q-84 0 -162.5 -31t-181.5 -112l-127 155q122 103 237 146t245 43q204 0 327 -106.5t123 -286.5q0 -99 -35.5 -188t-109 -183.5t-244.5 -255.5l-254 -246v-10h694v-207h-991z" />
|
||||
<glyph unicode="3" d="M86 59v209q93 -46 197 -71t200 -25q170 0 254 63t84 195q0 117 -93 172t-292 55h-127v191h129q350 0 350 242q0 94 -61 145t-180 51q-83 0 -160 -23.5t-182 -91.5l-115 164q201 148 467 148q221 0 345 -95t124 -262q0 -139 -81 -231.5t-228 -124.5v-8q176 -22 264 -109.5 t88 -232.5q0 -211 -149 -325.5t-424 -114.5q-243 0 -410 79z" />
|
||||
<glyph unicode="4" d="M39 319v181l668 966h229v-952h197v-195h-197v-319h-229v319h-668zM258 514h449v367q0 196 10 321h-8q-28 -66 -88 -160z" />
|
||||
<glyph unicode="5" d="M117 59v213q81 -46 186 -71t195 -25q159 0 242 71t83 208q0 262 -334 262q-47 0 -116 -9.5t-121 -21.5l-105 62l56 714h760v-209h-553l-33 -362q35 6 85.5 14t123.5 8q221 0 350 -117t129 -319q0 -234 -146.5 -365.5t-416.5 -131.5q-245 0 -385 79z" />
|
||||
<glyph unicode="6" d="M94 623q0 858 699 858q110 0 186 -17v-196q-76 22 -176 22q-235 0 -353 -126t-128 -404h12q47 81 132 125.5t200 44.5q199 0 310 -122t111 -331q0 -230 -128.5 -363.5t-350.5 -133.5q-157 0 -273 75.5t-178.5 220t-62.5 347.5zM332 508q0 -141 76.5 -237.5t195.5 -96.5 q121 0 186.5 78t65.5 223q0 126 -61.5 198t-184.5 72q-76 0 -140 -32.5t-101 -89t-37 -115.5z" />
|
||||
<glyph unicode="7" d="M74 1253v207h1011v-164l-575 -1296h-254l578 1253h-760z" />
|
||||
<glyph unicode="8" d="M88 371q0 122 68.5 219.5t224.5 173.5q-134 80 -191 169t-57 200q0 159 125 253.5t326 94.5q208 0 329 -95.5t121 -255.5q0 -225 -270 -358q172 -86 244.5 -181t72.5 -212q0 -181 -133 -290t-360 -109q-238 0 -369 102t-131 289zM313 379q0 -104 73 -161.5t198 -57.5 q129 0 200.5 59.5t71.5 161.5q0 81 -66 148t-200 124l-29 13q-132 -58 -190 -127.5t-58 -159.5zM360 1116q0 -52 22 -93t64 -74.5t142 -80.5q120 53 169.5 111.5t49.5 136.5q0 85 -61.5 134.5t-163.5 49.5q-100 0 -161 -49.5t-61 -134.5z" />
|
||||
<glyph unicode="9" d="M86 981q0 229 128.5 364.5t350.5 135.5q156 0 272 -76t179 -220.5t63 -346.5q0 -432 -174 -645t-524 -213q-133 0 -191 16v197q89 -25 179 -25q238 0 355 128t128 402h-12q-59 -90 -142.5 -130t-195.5 -40q-194 0 -305 121t-111 332zM317 983q0 -125 60.5 -196.5 t183.5 -71.5q119 0 200 71t81 166q0 89 -34.5 166.5t-96.5 122.5t-142 45q-122 0 -187 -79.5t-65 -223.5z" />
|
||||
<glyph unicode=":" horiz-adv-x="563" d="M133 125q0 73 38 112t110 39q73 0 111 -40.5t38 -110.5q0 -71 -38.5 -112.5t-110.5 -41.5t-110 41t-38 113zM133 979q0 151 148 151q75 0 112 -40t37 -111t-38.5 -112.5t-110.5 -41.5t-110 41t-38 113z" />
|
||||
<glyph unicode=";" horiz-adv-x="569" d="M63 -264q69 270 103 502h231l15 -23q-48 -186 -176 -479h-173zM131 979q0 151 148 151q75 0 112 -40t37 -111t-38.5 -112.5t-110.5 -41.5t-110 41t-38 113z" />
|
||||
<glyph unicode="<" d="M96 651v121l977 488v-195l-733 -344l733 -303v-197z" />
|
||||
<glyph unicode="=" d="M102 432v178h963v-178h-963zM102 831v179h963v-179h-963z" />
|
||||
<glyph unicode=">" d="M96 221v197l733 303l-733 344v195l977 -488v-121z" />
|
||||
<glyph unicode="?" horiz-adv-x="928" d="M16 1370q203 113 435 113q196 0 311 -96t115 -265q0 -75 -22 -133.5t-66.5 -111.5t-153.5 -138q-93 -73 -124.5 -121t-31.5 -129v-45h-196v64q0 110 40 183t140 151q119 94 153.5 146t34.5 124q0 84 -56 129t-161 45q-95 0 -176 -27t-158 -65zM242 125q0 151 147 151 q72 0 110 -39.5t38 -111.5q0 -71 -38.5 -112.5t-109.5 -41.5t-109 40.5t-38 113.5z" />
|
||||
<glyph unicode="@" horiz-adv-x="1839" d="M111 586q0 261 112 464.5t310.5 311.5t449.5 108q217 0 386.5 -90t263 -256.5t93.5 -384.5q0 -143 -45 -261.5t-126.5 -184.5t-188.5 -66q-79 0 -137 42t-78 114h-12q-49 -78 -121 -117t-162 -39q-163 0 -256.5 105t-93.5 284q0 206 124 334.5t333 128.5 q76 0 168.5 -13.5t164.5 -37.5l-22 -465v-24q0 -160 104 -160q79 0 125.5 102t46.5 260q0 171 -70 300.5t-199 199.5t-296 70q-213 0 -370.5 -88t-240.5 -251.5t-83 -379.5q0 -290 155 -446t445 -156q221 0 461 90v-164q-210 -86 -457 -86q-370 0 -577 199.5t-207 556.5z M698 612q0 -233 183 -233q193 0 211 293l12 239q-63 17 -135 17q-128 0 -199.5 -85t-71.5 -231z" />
|
||||
<glyph unicode="A" horiz-adv-x="1354" d="M0 0l547 1468h260l547 -1468h-254l-146 406h-559l-143 -406h-252zM465 612h426l-137 398q-15 40 -41.5 126t-36.5 126q-27 -123 -79 -269z" />
|
||||
<glyph unicode="B" horiz-adv-x="1352" d="M193 0v1462h434q302 0 436.5 -88t134.5 -278q0 -128 -66 -213t-190 -107v-10q154 -29 226.5 -114.5t72.5 -231.5q0 -197 -137.5 -308.5t-382.5 -111.5h-528zM432 201h254q150 0 226.5 57.5t76.5 181.5q0 114 -78 169t-237 55h-242v-463zM432 858h230q150 0 219 47.5 t69 161.5q0 103 -74.5 149t-236.5 46h-207v-404z" />
|
||||
<glyph unicode="C" horiz-adv-x="1298" d="M121 731q0 228 83.5 399t241.5 262t371 91q224 0 414 -94l-86 -199q-74 35 -156.5 61.5t-173.5 26.5q-206 0 -324 -146t-118 -403q0 -269 113.5 -407t328.5 -138q93 0 180 18.5t181 47.5v-205q-172 -65 -390 -65q-321 0 -493 194.5t-172 556.5z" />
|
||||
<glyph unicode="D" horiz-adv-x="1503" d="M193 0v1462h452q349 0 543 -188t194 -529q0 -362 -201 -553.5t-579 -191.5h-409zM432 201h170q528 0 528 536q0 525 -491 525h-207v-1061z" />
|
||||
<glyph unicode="E" horiz-adv-x="1143" d="M193 0v1462h827v-202h-588v-398h551v-200h-551v-459h588v-203h-827z" />
|
||||
<glyph unicode="F" horiz-adv-x="1090" d="M193 0v1462h825v-202h-588v-457h551v-203h-551v-600h-237z" />
|
||||
<glyph unicode="G" horiz-adv-x="1487" d="M121 731q0 353 203 552.5t559 199.5q229 0 434 -88l-84 -199q-178 82 -356 82q-234 0 -370 -147t-136 -402q0 -268 122.5 -407.5t352.5 -139.5q116 0 248 29v377h-303v205h538v-734q-132 -43 -253.5 -61t-262.5 -18q-332 0 -512 196.5t-180 554.5z" />
|
||||
<glyph unicode="H" horiz-adv-x="1538" d="M193 0v1462h239v-598h674v598h240v-1462h-240v659h-674v-659h-239z" />
|
||||
<glyph unicode="I" horiz-adv-x="625" d="M193 0v1462h239v-1462h-239z" />
|
||||
<glyph unicode="J" horiz-adv-x="612" d="M-156 -182q84 -21 146 -21q196 0 196 248v1417h240v-1409q0 -224 -106.5 -342.5t-311.5 -118.5q-98 0 -164 25v201z" />
|
||||
<glyph unicode="K" horiz-adv-x="1309" d="M193 0v1462h239v-698q98 120 195 231l395 467h272q-383 -450 -549 -641l564 -821h-277l-459 662l-141 -115v-547h-239z" />
|
||||
<glyph unicode="L" horiz-adv-x="1110" d="M193 0v1462h239v-1257h619v-205h-858z" />
|
||||
<glyph unicode="M" horiz-adv-x="1890" d="M193 0v1462h337l406 -1163h6l418 1163h338v-1462h-230v723q0 109 5.5 284t9.5 212h-8l-439 -1219h-211l-424 1221h-8q17 -272 17 -510v-711h-217z" />
|
||||
<glyph unicode="N" horiz-adv-x="1604" d="M193 0v1462h290l717 -1159h6q-2 23 -8 167.5t-6 225.5v766h219v-1462h-293l-719 1165h-8l5 -65q14 -186 14 -340v-760h-217z" />
|
||||
<glyph unicode="O" horiz-adv-x="1612" d="M121 735q0 362 178.5 556t509.5 194q326 0 504 -197t178 -555q0 -357 -178.5 -555t-505.5 -198q-331 0 -508.5 196.5t-177.5 558.5zM375 733q0 -270 109 -409.5t323 -139.5q213 0 321.5 138t108.5 411q0 269 -107.5 408t-320.5 139q-215 0 -324.5 -139t-109.5 -408z" />
|
||||
<glyph unicode="P" horiz-adv-x="1260" d="M193 0v1462h421q274 0 410.5 -112t136.5 -330q0 -229 -150 -351t-427 -122h-152v-547h-239zM432 748h127q184 0 270 64t86 200q0 126 -77 188t-240 62h-166v-514z" />
|
||||
<glyph unicode="Q" horiz-adv-x="1612" d="M121 735q0 362 178.5 556t509.5 194q326 0 504 -197t178 -555q0 -266 -101.5 -448t-295.5 -256l350 -377h-322l-276 328h-39q-331 0 -508.5 196.5t-177.5 558.5zM375 733q0 -270 109 -409.5t323 -139.5q213 0 321.5 138t108.5 411q0 269 -107.5 408t-320.5 139 q-215 0 -324.5 -139t-109.5 -408z" />
|
||||
<glyph unicode="R" horiz-adv-x="1309" d="M193 0v1462h413q283 0 419 -106t136 -320q0 -273 -284 -389l413 -647h-272l-350 584h-236v-584h-239zM432 782h166q167 0 242 62t75 184q0 124 -81 178t-244 54h-158v-478z" />
|
||||
<glyph unicode="S" horiz-adv-x="1126" d="M100 57v226q100 -47 212.5 -74t209.5 -27q142 0 209.5 54t67.5 145q0 82 -62 139t-256 135q-200 81 -282 185t-82 250q0 183 130 288t349 105q210 0 418 -92l-76 -195q-195 82 -348 82q-116 0 -176 -50.5t-60 -133.5q0 -57 24 -97.5t79 -76.5t198 -95q161 -67 236 -125 t110 -131t35 -172q0 -195 -141 -306t-389 -111t-406 77z" />
|
||||
<glyph unicode="T" horiz-adv-x="1159" d="M29 1257v205h1099v-205h-430v-1257h-239v1257h-430z" />
|
||||
<glyph unicode="U" horiz-adv-x="1520" d="M180 520v942h240v-925q0 -181 84 -267t258 -86q338 0 338 355v923h239v-946q0 -162 -69.5 -283.5t-201 -187t-314.5 -65.5q-272 0 -423 144t-151 396z" />
|
||||
<glyph unicode="V" horiz-adv-x="1274" d="M0 1462h246l305 -909q24 -65 51 -167.5t35 -152.5q13 76 40 176t44 148l305 905h248l-512 -1462h-252z" />
|
||||
<glyph unicode="W" horiz-adv-x="1937" d="M12 1462h244l209 -852q49 -205 70 -362q11 85 33 190t40 170l238 854h237l244 -858q35 -119 74 -356q15 143 72 364l208 850h242l-381 -1462h-260l-248 872q-16 57 -40 164.5t-29 149.5q-10 -64 -32.5 -166t-37.5 -152l-242 -868h-260l-189 732z" />
|
||||
<glyph unicode="X" horiz-adv-x="1274" d="M4 0l485 758l-454 704h266l338 -553l338 553h258l-457 -708l492 -754h-275l-366 598l-369 -598h-256z" />
|
||||
<glyph unicode="Y" horiz-adv-x="1212" d="M0 1462h260l346 -667l346 667h260l-487 -895v-567h-240v559z" />
|
||||
<glyph unicode="Z" horiz-adv-x="1178" d="M66 0v166l737 1091h-717v205h1006v-168l-740 -1089h760v-205h-1046z" />
|
||||
<glyph unicode="[" horiz-adv-x="676" d="M154 -324v1786h471v-176h-256v-1433h256v-177h-471z" />
|
||||
<glyph unicode="\" horiz-adv-x="799" d="M16 1462h222l544 -1462h-221z" />
|
||||
<glyph unicode="]" horiz-adv-x="676" d="M51 -147h256v1433h-256v176h469v-1786h-469v177z" />
|
||||
<glyph unicode="^" horiz-adv-x="1100" d="M29 535l436 935h121l485 -935h-194l-349 694l-307 -694h-192z" />
|
||||
<glyph unicode="_" horiz-adv-x="879" d="M-4 -184h887v-135h-887v135z" />
|
||||
<glyph unicode="`" horiz-adv-x="1212" d="M362 1548v21h273q38 -70 103.5 -161t109.5 -142v-25h-158q-69 52 -174.5 150.5t-153.5 156.5z" />
|
||||
<glyph unicode="a" horiz-adv-x="1188" d="M90 317q0 171 127 258t387 95l191 6v59q0 106 -49.5 158.5t-153.5 52.5q-85 0 -163 -25t-150 -59l-76 168q90 47 197 71.5t202 24.5q211 0 318.5 -92t107.5 -289v-745h-168l-47 154h-8q-80 -101 -161 -137.5t-208 -36.5q-163 0 -254.5 88t-91.5 249zM334 315 q0 -74 44 -114.5t132 -40.5q128 0 205.5 71.5t77.5 200.5v96l-142 -6q-166 -6 -241.5 -55.5t-75.5 -151.5z" />
|
||||
<glyph unicode="b" horiz-adv-x="1276" d="M168 0v1556h235v-370q0 -41 -4 -122t-6 -103h10q112 165 330 165q207 0 322.5 -150t115.5 -421q0 -272 -117 -423.5t-325 -151.5q-210 0 -326 151h-16l-43 -131h-176zM403 555q0 -202 64 -292.5t209 -90.5q125 0 189.5 99t64.5 286q0 377 -258 377q-142 0 -204.5 -83.5 t-64.5 -279.5v-16z" />
|
||||
<glyph unicode="c" horiz-adv-x="1014" d="M102 547q0 279 136.5 429t394.5 150q175 0 315 -65l-71 -189q-149 58 -246 58q-287 0 -287 -381q0 -186 71.5 -279.5t209.5 -93.5q157 0 297 78v-205q-63 -37 -134.5 -53t-173.5 -16q-251 0 -381.5 146.5t-130.5 420.5z" />
|
||||
<glyph unicode="d" horiz-adv-x="1276" d="M102 551q0 272 117.5 423.5t325.5 151.5q218 0 332 -161h12q-17 119 -17 188v403h236v-1556h-184l-41 145h-11q-113 -165 -331 -165q-207 0 -323 150t-116 421zM344 547q0 -184 65 -280.5t195 -96.5q145 0 211 81.5t68 264.5v33q0 209 -68 297t-213 88 q-124 0 -191 -100.5t-67 -286.5z" />
|
||||
<glyph unicode="e" horiz-adv-x="1180" d="M102 545q0 271 135 426t371 155q219 0 346 -133t127 -366v-127h-737q5 -161 87 -247.5t231 -86.5q98 0 182.5 18.5t181.5 61.5v-191q-86 -41 -174 -58t-201 -17q-258 0 -403.5 150.5t-145.5 414.5zM348 670h502q-2 137 -66 207.5t-176 70.5t-179.5 -71t-80.5 -207z" />
|
||||
<glyph unicode="f" horiz-adv-x="743" d="M35 928v110l182 72v72q0 196 92 290.5t281 94.5q124 0 244 -41l-62 -178q-87 28 -166 28q-80 0 -116.5 -49.5t-36.5 -148.5v-72h270v-178h-270v-928h-236v928h-182z" />
|
||||
<glyph unicode="g" horiz-adv-x="1139" d="M23 -184q0 102 64.5 171.5t180.5 96.5q-47 20 -77.5 64.5t-30.5 93.5q0 62 35 105t104 85q-86 37 -139.5 120.5t-53.5 195.5q0 180 113.5 279t323.5 99q47 0 98.5 -6.5t77.5 -13.5h383v-129l-189 -35q26 -35 43 -86t17 -108q0 -171 -118 -269t-325 -98q-53 0 -96 8 q-76 -47 -76 -110q0 -38 35.5 -57t130.5 -19h193q183 0 278 -78t95 -225q0 -188 -155 -290t-448 -102q-226 0 -345 80t-119 228zM233 -172q0 -76 68.5 -117t192.5 -41q192 0 286 55t94 146q0 72 -51.5 102.5t-191.5 30.5h-178q-101 0 -160.5 -47.5t-59.5 -128.5zM334 748 q0 -104 53.5 -160t153.5 -56q204 0 204 218q0 108 -50.5 166.5t-153.5 58.5q-102 0 -154.5 -58t-52.5 -169z" />
|
||||
<glyph unicode="h" horiz-adv-x="1300" d="M168 0v1556h235v-395q0 -95 -12 -203h15q48 80 133.5 124t199.5 44q402 0 402 -405v-721h-236v680q0 128 -51.5 191t-163.5 63q-148 0 -217.5 -88.5t-69.5 -296.5v-549h-235z" />
|
||||
<glyph unicode="i" horiz-adv-x="571" d="M154 1399q0 63 34.5 97t98.5 34q62 0 96.5 -34t34.5 -97q0 -60 -34.5 -94.5t-96.5 -34.5q-64 0 -98.5 34.5t-34.5 94.5zM168 0v1106h235v-1106h-235z" />
|
||||
<glyph unicode="j" horiz-adv-x="571" d="M-121 -281q68 -18 139 -18q150 0 150 170v1235h235v-1251q0 -171 -89.5 -259t-258.5 -88q-106 0 -176 25v186zM154 1399q0 63 34.5 97t98.5 34q62 0 96.5 -34t34.5 -97q0 -60 -34.5 -94.5t-96.5 -34.5q-64 0 -98.5 34.5t-34.5 94.5z" />
|
||||
<glyph unicode="k" horiz-adv-x="1171" d="M168 0v1556h233v-759l-12 -213h6l133 166l334 356h271l-445 -475l473 -631h-276l-355 485l-129 -106v-379h-233z" />
|
||||
<glyph unicode="l" horiz-adv-x="571" d="M168 0v1556h235v-1556h-235z" />
|
||||
<glyph unicode="m" horiz-adv-x="1958" d="M168 0v1106h184l33 -145h12q46 79 133.5 122t192.5 43q255 0 338 -174h16q49 82 138 128t204 46q198 0 288.5 -100t90.5 -305v-721h-235v682q0 127 -48.5 189.5t-150.5 62.5q-137 0 -200.5 -85.5t-63.5 -262.5v-586h-236v682q0 127 -48 189.5t-150 62.5 q-136 0 -199.5 -88.5t-63.5 -294.5v-551h-235z" />
|
||||
<glyph unicode="n" horiz-adv-x="1300" d="M168 0v1106h184l33 -145h12q50 79 142 122t204 43q398 0 398 -405v-721h-236v680q0 128 -51.5 191t-163.5 63q-149 0 -218 -88t-69 -295v-551h-235z" />
|
||||
<glyph unicode="o" horiz-adv-x="1251" d="M102 555q0 269 138 420t389 151q240 0 380 -154.5t140 -416.5q0 -271 -139 -423t-387 -152q-155 0 -274 70t-183 201t-64 304zM344 555q0 -383 283 -383q280 0 280 383q0 379 -282 379q-148 0 -214.5 -98t-66.5 -281z" />
|
||||
<glyph unicode="p" horiz-adv-x="1276" d="M168 -492v1598h190q8 -31 33 -148h12q110 168 330 168q207 0 322.5 -150t115.5 -421t-117.5 -423t-324.5 -152q-210 0 -326 151h-14q14 -140 14 -170v-453h-235zM403 555q0 -202 64 -292.5t209 -90.5q122 0 188 100t66 285q0 186 -65.5 281.5t-192.5 95.5 q-140 0 -204.5 -82t-64.5 -262v-35z" />
|
||||
<glyph unicode="q" horiz-adv-x="1276" d="M102 551q0 270 118 422.5t325 152.5q104 0 186.5 -38.5t147.5 -126.5h8l26 145h195v-1598h-236v469q0 44 4 93t7 75h-13q-104 -165 -331 -165q-205 0 -321 150.5t-116 420.5zM344 547q0 -379 262 -379q148 0 212.5 85.5t64.5 258.5v37q0 205 -66.5 295t-214.5 90 q-126 0 -192 -100t-66 -287z" />
|
||||
<glyph unicode="r" horiz-adv-x="883" d="M168 0v1106h184l31 -195h12q55 99 143.5 157t190.5 58q71 0 117 -10l-23 -219q-50 12 -104 12q-141 0 -228.5 -92t-87.5 -239v-578h-235z" />
|
||||
<glyph unicode="s" horiz-adv-x="997" d="M98 827q0 142 114.5 220.5t311.5 78.5q195 0 369 -79l-76 -177q-179 74 -301 74q-186 0 -186 -106q0 -52 48.5 -88t211.5 -99q137 -53 199 -97t92 -101.5t30 -137.5q0 -162 -118 -248.5t-338 -86.5q-221 0 -355 67v203q195 -90 363 -90q217 0 217 131q0 42 -24 70t-79 58 t-153 68q-191 74 -258.5 148t-67.5 192z" />
|
||||
<glyph unicode="t" horiz-adv-x="805" d="M39 928v104l162 86l80 234h145v-246h315v-178h-315v-592q0 -85 42.5 -125.5t111.5 -40.5q86 0 172 27v-177q-39 -17 -100.5 -28.5t-127.5 -11.5q-334 0 -334 352v596h-151z" />
|
||||
<glyph unicode="u" horiz-adv-x="1300" d="M158 383v723h237v-682q0 -127 52 -190.5t163 -63.5q148 0 217.5 88.5t69.5 296.5v551h236v-1106h-185l-33 145h-12q-49 -77 -139.5 -121t-206.5 -44q-201 0 -300 100t-99 303z" />
|
||||
<glyph unicode="v" horiz-adv-x="1096" d="M0 1106h248l225 -643q58 -162 70 -262h8q9 72 70 262l225 643h250l-422 -1106h-254z" />
|
||||
<glyph unicode="w" horiz-adv-x="1673" d="M20 1106h240l141 -545q48 -202 68 -346h6q10 73 30.5 167.5t35.5 141.5l168 582h258l163 -582q15 -49 37.5 -150t26.5 -157h8q15 123 70 344l143 545h236l-312 -1106h-264l-143 516q-26 82 -94 381h-9q-58 -270 -92 -383l-147 -514h-260z" />
|
||||
<glyph unicode="x" horiz-adv-x="1128" d="M25 0l389 565l-371 541h268l252 -387l254 387h266l-372 -541l391 -565h-266l-273 414l-272 -414h-266z" />
|
||||
<glyph unicode="y" horiz-adv-x="1098" d="M0 1106h256l225 -627q51 -134 68 -252h8q9 55 33 133.5t254 745.5h254l-473 -1253q-129 -345 -430 -345q-78 0 -152 17v186q53 -12 121 -12q170 0 239 197l41 104z" />
|
||||
<glyph unicode="z" horiz-adv-x="979" d="M68 0v145l559 781h-525v180h789v-164l-547 -762h563v-180h-839z" />
|
||||
<glyph unicode="{" horiz-adv-x="791" d="M45 473v191q135 0 200.5 45.5t65.5 138.5v311q0 156 108.5 229.5t325.5 73.5v-182q-114 -5 -165.5 -46.5t-51.5 -123.5v-297q0 -199 -229 -238v-12q229 -36 229 -237v-299q0 -82 51 -124t166 -44v-183q-231 2 -332.5 78.5t-101.5 247.5v285q0 186 -266 186z" />
|
||||
<glyph unicode="|" horiz-adv-x="1128" d="M473 -481v2033h180v-2033h-180z" />
|
||||
<glyph unicode="}" horiz-adv-x="760" d="M45 -141q95 1 148 38.5t53 129.5v262q0 121 53 187t176 87v12q-229 39 -229 238v297q0 82 -45.5 123.5t-155.5 46.5v182q223 0 320.5 -76.5t97.5 -250.5v-287q0 -100 63.5 -142t188.5 -42v-191q-123 0 -187.5 -42.5t-64.5 -143.5v-307q0 -156 -99.5 -229t-318.5 -75v183z " />
|
||||
<glyph unicode="~" d="M96 571v191q99 108 250 108q66 0 125 -13t147 -50q131 -55 220 -55q52 0 114.5 31t120.5 89v-190q-105 -111 -250 -111q-65 0 -127.5 15.5t-146.5 50.5q-127 55 -219 55q-50 0 -111.5 -30t-122.5 -91z" />
|
||||
<glyph unicode="¢" d="M166 741q0 254 100.5 397t306.5 175v170h158v-162q152 -5 283 -66l-70 -188q-146 59 -250 59q-146 0 -216 -95t-70 -288q0 -194 72 -283t210 -89q75 0 142.5 15t154.5 52v-200q-119 -59 -258 -64v-194h-156v200q-207 31 -307 171t-100 390z" />
|
||||
<glyph unicode="£" d="M72 0v195q98 30 145 96t47 178v184h-188v172h188v256q0 188 113.5 294t312.5 106q194 0 375 -82l-76 -182q-162 71 -284 71q-205 0 -205 -219v-244h397v-172h-397v-182q0 -91 -33 -155t-113 -109h756v-207h-1038z" />
|
||||
<glyph unicode="¥" d="M18 1462h246l320 -665l321 665h244l-399 -760h227v-151h-281v-154h281v-153h-281v-244h-225v244h-283v153h283v154h-283v151h224z" />
|
||||
<glyph unicode="©" horiz-adv-x="1704" d="M100 731q0 200 100 375t275 276t377 101q200 0 375 -100t276 -275t101 -377q0 -197 -97 -370t-272 -277t-383 -104q-207 0 -382 103.5t-272.5 276.5t-97.5 371zM223 731q0 -170 84.5 -315.5t230.5 -229.5t314 -84q170 0 316 85.5t229.5 230t83.5 313.5q0 168 -84.5 314.5 t-231 230.5t-313.5 84q-168 0 -312.5 -83t-230.5 -229t-86 -317zM471 731q0 214 110 337.5t306 123.5q138 0 274 -70l-65 -143q-106 55 -203 55q-111 0 -171 -80.5t-60 -222.5q0 -147 54 -226t177 -79q55 0 118 15t109 36v-158q-115 -51 -235 -51q-197 0 -305.5 120.5 t-108.5 342.5z" />
|
||||
<glyph unicode="­" horiz-adv-x="659" d="M72 449v200h514v-200h-514z" />
|
||||
<glyph unicode="®" horiz-adv-x="1704" d="M100 731q0 200 100 375t275 276t377 101q200 0 375 -100t276 -275t101 -377q0 -197 -97 -370t-272 -277t-383 -104q-207 0 -382 103.5t-272.5 276.5t-97.5 371zM223 731q0 -170 84.5 -315.5t230.5 -229.5t314 -84q170 0 316 85.5t229.5 230t83.5 313.5q0 168 -84.5 314.5 t-231 230.5t-313.5 84q-168 0 -312.5 -83t-230.5 -229t-86 -317zM559 279v903h262q174 0 255 -68t81 -205q0 -171 -153 -233l237 -397h-211l-192 346h-90v-346h-189zM748 770h69q74 0 112 35t38 100q0 72 -36.5 100.5t-115.5 28.5h-67v-264z" />
|
||||
<glyph unicode="´" horiz-adv-x="1212" d="M362 1241v25q57 70 117.5 156t95.5 147h273v-21q-52 -61 -155.5 -157.5t-174.5 -149.5h-156z" />
|
||||
<glyph unicode=" " horiz-adv-x="784" />
|
||||
<glyph unicode=" " horiz-adv-x="1569" />
|
||||
<glyph unicode=" " horiz-adv-x="784" />
|
||||
<glyph unicode=" " horiz-adv-x="1569" />
|
||||
<glyph unicode=" " horiz-adv-x="523" />
|
||||
<glyph unicode=" " horiz-adv-x="392" />
|
||||
<glyph unicode=" " horiz-adv-x="261" />
|
||||
<glyph unicode=" " horiz-adv-x="261" />
|
||||
<glyph unicode=" " horiz-adv-x="196" />
|
||||
<glyph unicode=" " horiz-adv-x="313" />
|
||||
<glyph unicode=" " horiz-adv-x="87" />
|
||||
<glyph unicode="‐" horiz-adv-x="659" d="M72 449v200h514v-200h-514z" />
|
||||
<glyph unicode="‑" horiz-adv-x="659" d="M72 449v200h514v-200h-514z" />
|
||||
<glyph unicode="‒" horiz-adv-x="659" d="M72 449v200h514v-200h-514z" />
|
||||
<glyph unicode="–" horiz-adv-x="1024" d="M82 455v190h860v-190h-860z" />
|
||||
<glyph unicode="—" horiz-adv-x="2048" d="M82 455v190h1884v-190h-1884z" />
|
||||
<glyph unicode="‘" horiz-adv-x="395" d="M25 983q20 83 71 224t105 255h170q-64 -256 -101 -501h-233z" />
|
||||
<glyph unicode="’" horiz-adv-x="395" d="M25 961q69 289 100 501h231l15 -22q-53 -209 -176 -479h-170z" />
|
||||
<glyph unicode="“" horiz-adv-x="813" d="M25 983q20 83 71 224t105 255h170q-64 -256 -101 -501h-233zM440 983q53 203 178 479h170q-69 -296 -100 -501h-233z" />
|
||||
<glyph unicode="”" horiz-adv-x="813" d="M25 961q69 289 100 501h231l15 -22q-53 -209 -176 -479h-170zM440 961q69 271 103 501h231l14 -22q-53 -209 -176 -479h-172z" />
|
||||
<glyph unicode="•" horiz-adv-x="770" d="M131 748q0 138 66 210t188 72q121 0 187.5 -72.5t66.5 -209.5q0 -135 -67 -209t-187 -74t-187 72.5t-67 210.5z" />
|
||||
<glyph unicode="…" horiz-adv-x="1677" d="M133 125q0 73 38 112t110 39q73 0 111 -40.5t38 -110.5q0 -71 -38.5 -112.5t-110.5 -41.5t-110 41t-38 113zM690 125q0 73 38 112t110 39q73 0 111 -40.5t38 -110.5q0 -71 -38.5 -112.5t-110.5 -41.5t-110 41t-38 113zM1247 125q0 73 38 112t110 39q73 0 111 -40.5 t38 -110.5q0 -71 -38.5 -112.5t-110.5 -41.5t-110 41t-38 113z" />
|
||||
<glyph unicode=" " horiz-adv-x="313" />
|
||||
<glyph unicode=" " horiz-adv-x="392" />
|
||||
<glyph unicode="€" horiz-adv-x="1188" d="M63 494v153h136l-2 37v37l2 65h-136v154h150q38 251 191 394t395 143q200 0 358 -88l-84 -187q-154 76 -274 76q-141 0 -230.5 -84t-119.5 -254h456v-154h-471l-2 -45v-55l2 -39h408v-153h-391q64 -312 364 -312q143 0 293 62v-203q-131 -61 -305 -61q-241 0 -391.5 132 t-196.5 382h-152z" />
|
||||
<glyph unicode="™" horiz-adv-x="1561" d="M27 1333v129h553v-129h-205v-592h-146v592h-202zM635 741v721h217l178 -534l187 534h210v-721h-147v414l4 129h-6l-193 -543h-122l-185 543h-6l4 -119v-424h-141z" />
|
||||
<glyph unicode="" horiz-adv-x="1105" d="M0 1105h1105v-1105h-1105v1105z" />
|
||||
</font>
|
||||
</defs></svg>
|
After Width: | Height: | Size: 25 KiB |
BIN
fonts/OpenSans-Semibold-webfont.ttf
Normal file
BIN
fonts/OpenSans-Semibold-webfont.woff
Normal file
BIN
fonts/OpenSans-SemiboldItalic-webfont.eot
Normal file
146
fonts/OpenSans-SemiboldItalic-webfont.svg
Normal file
@ -0,0 +1,146 @@
|
||||
<?xml version="1.0" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
|
||||
<svg xmlns="http://www.w3.org/2000/svg">
|
||||
<metadata>
|
||||
This is a custom SVG webfont generated by Font Squirrel.
|
||||
Copyright : Digitized data copyright 20102011 Google Corporation
|
||||
Foundry : Ascender Corporation
|
||||
Foundry URL : httpwwwascendercorpcom
|
||||
</metadata>
|
||||
<defs>
|
||||
<font id="OpenSansSemiboldItalic" horiz-adv-x="1128" >
|
||||
<font-face units-per-em="2048" ascent="1638" descent="-410" />
|
||||
<missing-glyph horiz-adv-x="532" />
|
||||
<glyph unicode=" " horiz-adv-x="532" />
|
||||
<glyph unicode="	" horiz-adv-x="532" />
|
||||
<glyph unicode=" " horiz-adv-x="532" />
|
||||
<glyph unicode="!" horiz-adv-x="557" d="M33 96q0 80 45.5 130t130.5 50q57 0 91 -32.5t34 -93.5q0 -79 -47 -128t-123 -49q-62 0 -96.5 33.5t-34.5 89.5zM160 444l168 1018h272l-264 -1018h-176z" />
|
||||
<glyph unicode=""" horiz-adv-x="858" d="M213 934l72 528h231l-151 -528h-152zM588 934l74 528h231l-152 -528h-153z" />
|
||||
<glyph unicode="#" horiz-adv-x="1323" d="M51 418l17 168h280l84 286h-264l16 168h295l121 422h178l-121 -422h252l121 422h174l-121 -422h252l-14 -168h-285l-84 -286h271l-15 -168h-303l-121 -418h-180l123 418h-248l-121 -418h-174l117 418h-250zM526 586h250l82 286h-250z" />
|
||||
<glyph unicode="$" d="M61 172v209q78 -42 179.5 -70t193.5 -30l84 387q-156 56 -223.5 138.5t-67.5 199.5q0 167 118.5 267.5t324.5 117.5l37 163h135l-35 -165q161 -16 289 -82l-86 -185q-134 66 -244 74l-80 -371q128 -51 186.5 -95t86.5 -101t28 -135q0 -172 -119.5 -277t-337.5 -125 l-45 -211h-135l45 211q-197 13 -334 80zM451 1016q0 -98 110 -139l68 319q-89 -11 -133.5 -57.5t-44.5 -122.5zM571 285q86 11 136.5 60t50.5 126q0 101 -115 145z" />
|
||||
<glyph unicode="%" horiz-adv-x="1688" d="M141 872q0 166 53 313.5t142.5 222.5t208.5 75q127 0 193.5 -76t66.5 -221q0 -160 -55.5 -313.5t-146.5 -230.5t-206 -77q-124 0 -190 79t-66 228zM231 0l1086 1462h194l-1085 -1462h-195zM334 866q0 -135 80 -135q52 0 95.5 58t73 175.5t29.5 219.5q0 131 -82 131 q-55 0 -99 -61t-70.5 -173t-26.5 -215zM940 279q0 171 53 320t142.5 223.5t207.5 74.5q127 0 195 -75t68 -218q0 -161 -55.5 -315.5t-146.5 -231.5t-204 -77q-127 0 -193.5 76.5t-66.5 222.5zM1133 281q0 -134 81 -134q52 0 96 58.5t73.5 174.5t29.5 220q0 131 -84 131 q-52 0 -95.5 -57.5t-72 -171t-28.5 -221.5z" />
|
||||
<glyph unicode="&" horiz-adv-x="1411" d="M66 350q0 147 85.5 254t286.5 205q-88 151 -88 283q0 180 112.5 286.5t297.5 106.5q160 0 252 -81t92 -218q0 -129 -89.5 -230t-293.5 -192l235 -326q109 112 181 295h233q-113 -270 -297 -454l205 -279h-277l-94 131q-106 -80 -211 -115.5t-229 -35.5 q-190 0 -295.5 97.5t-105.5 272.5zM305 371q0 -86 56 -140.5t147 -54.5q77 0 147 27t144 82l-264 381q-133 -74 -181.5 -141.5t-48.5 -153.5zM567 1102q0 -109 62 -201q147 75 199.5 133.5t52.5 126.5q0 66 -36 101.5t-97 35.5q-87 0 -134 -54t-47 -142z" />
|
||||
<glyph unicode="'" horiz-adv-x="483" d="M213 934l72 528h231l-151 -528h-152z" />
|
||||
<glyph unicode="(" horiz-adv-x="639" d="M78 276q0 343 124.5 632.5t379.5 553.5h209q-498 -548 -498 -1190q0 -329 115 -596h-183q-147 261 -147 600z" />
|
||||
<glyph unicode=")" horiz-adv-x="639" d="M-154 -324q498 548 498 1190q0 327 -115 596h183q147 -265 147 -602q0 -342 -123 -629.5t-381 -554.5h-209z" />
|
||||
<glyph unicode="*" horiz-adv-x="1122" d="M193 1167l71 195l354 -178l37 383l213 -43l-116 -367l403 23l-12 -205l-367 45l170 -361l-205 -61l-102 371l-227 -312l-162 144l293 266z" />
|
||||
<glyph unicode="+" d="M117 631v180h379v381h180v-381h377v-180h-377v-375h-180v375h-379z" />
|
||||
<glyph unicode="," horiz-adv-x="530" d="M-102 -264q105 238 200 502h236l8 -23q-125 -260 -266 -479h-178z" />
|
||||
<glyph unicode="-" horiz-adv-x="649" d="M47 446l45 203h502l-45 -203h-502z" />
|
||||
<glyph unicode="." horiz-adv-x="551" d="M33 94q0 83 47 132.5t131 49.5q56 0 89.5 -31.5t33.5 -92.5q0 -78 -47.5 -129.5t-124.5 -51.5q-66 0 -97.5 35.5t-31.5 87.5z" />
|
||||
<glyph unicode="/" horiz-adv-x="788" d="M-92 0l811 1462h233l-811 -1462h-233z" />
|
||||
<glyph unicode="0" d="M92 471q0 284 83 526t222.5 365t321.5 123q187 0 284 -118.5t97 -354.5q0 -306 -79 -546.5t-219 -363t-325 -122.5q-194 0 -289.5 127.5t-95.5 363.5zM330 469q0 -143 39 -218t129 -75q100 0 182.5 113.5t132 316.5t49.5 414q0 268 -162 268q-97 0 -180 -112 t-136.5 -312.5t-53.5 -394.5z" />
|
||||
<glyph unicode="1" d="M242 1145l508 317h198l-311 -1462h-238l189 870q28 150 82 324q-57 -55 -135 -102l-187 -117z" />
|
||||
<glyph unicode="2" d="M-18 0l36 180l471 422q176 159 238.5 231t90.5 133.5t28 131.5q0 85 -49.5 134.5t-139.5 49.5q-70 0 -139 -30t-170 -109l-115 160q120 97 231 138.5t228 41.5q181 0 288 -93t107 -251q0 -108 -39 -201t-123 -190.5t-284 -268.5l-311 -264v-8h622l-41 -207h-929z" />
|
||||
<glyph unicode="3" d="M31 59v215q84 -49 185.5 -75.5t195.5 -26.5q157 0 245 71.5t88 196.5q0 219 -278 219h-133l37 183h106q164 0 267.5 74.5t103.5 199.5q0 79 -49.5 124.5t-139.5 45.5q-72 0 -146.5 -25.5t-162.5 -84.5l-104 161q120 81 225.5 113.5t226.5 32.5q183 0 286 -88.5 t103 -241.5q0 -158 -99 -264t-269 -137v-7q127 -24 196.5 -106t69.5 -205q0 -133 -68 -236.5t-196.5 -160.5t-304.5 -57q-225 0 -385 79z" />
|
||||
<glyph unicode="4" d="M-4 317l37 197l803 952h254l-201 -952h201l-43 -197h-201l-68 -317h-229l69 317h-622zM262 514h397l68 309q31 136 100 377h-8q-51 -86 -135 -186z" />
|
||||
<glyph unicode="5" d="M53 59v217q167 -100 342 -100q173 0 270 83t97 230q0 105 -62 168.5t-188 63.5q-95 0 -225 -35l-88 68l200 708h713l-45 -209h-506l-106 -364q93 18 155 18q181 0 288.5 -103.5t107.5 -285.5q0 -161 -70 -283t-204 -188.5t-324 -66.5q-214 0 -355 79z" />
|
||||
<glyph unicode="6" d="M111 446q0 205 60.5 406t165 343t251 215t342.5 73q117 0 203 -25l-43 -194q-72 22 -181 22q-205 0 -337 -129.5t-197 -392.5h6q125 170 326 170q156 0 243.5 -99t87.5 -272q0 -162 -68.5 -301t-185.5 -210.5t-270 -71.5q-194 0 -298.5 120t-104.5 346zM340 418 q0 -110 49.5 -177t140.5 -67q81 0 143 48.5t96 134.5t34 188q0 200 -178 200q-51 0 -95.5 -19t-79 -48t-58.5 -64.5t-39 -82t-13 -113.5z" />
|
||||
<glyph unicode="7" d="M125 0l754 1257h-674l43 205h932l-33 -168l-758 -1294h-264z" />
|
||||
<glyph unicode="8" d="M76 348q0 297 368 432q-91 70 -130.5 145t-39.5 162q0 179 127 288.5t330 109.5q179 0 283 -89t104 -239q0 -132 -79 -229.5t-248 -163.5q120 -78 172.5 -165.5t52.5 -201.5q0 -121 -61.5 -216.5t-175.5 -148t-271 -52.5q-203 0 -317.5 100t-114.5 268zM311 369 q0 -93 59 -149t158 -56q115 0 184.5 64t69.5 167q0 91 -48.5 157.5t-139.5 119.5q-149 -54 -216 -126.5t-67 -176.5zM504 1096q0 -83 39 -137t104 -93q115 43 177.5 105t62.5 157q0 81 -48 126.5t-128 45.5q-93 0 -150 -56t-57 -148z" />
|
||||
<glyph unicode="9" d="M92 12v207q121 -43 236 -43q188 0 306 123t177 389h-6q-113 -160 -305 -160q-165 0 -255.5 102t-90.5 288q0 156 67 289t186.5 204.5t274.5 71.5q192 0 294.5 -119.5t102.5 -345.5q0 -205 -58 -414.5t-152.5 -349t-226 -207t-310.5 -67.5q-133 0 -240 32zM387 932 q0 -105 46 -160t134 -55q117 0 198 94t81 240q0 108 -48 172.5t-134 64.5q-82 0 -145.5 -47t-97.5 -130t-34 -179z" />
|
||||
<glyph unicode=":" horiz-adv-x="551" d="M33 94q0 83 47 132.5t131 49.5q56 0 89.5 -31.5t33.5 -92.5q0 -78 -47.5 -129.5t-124.5 -51.5q-66 0 -97.5 35.5t-31.5 87.5zM205 948q0 83 47 132.5t131 49.5q56 0 89.5 -31.5t33.5 -92.5q0 -79 -48.5 -130t-125.5 -51q-66 0 -96.5 35.5t-30.5 87.5z" />
|
||||
<glyph unicode=";" horiz-adv-x="551" d="M-100 -264q95 214 198 502h236l8 -23q-125 -260 -266 -479h-176zM205 948q0 83 47 132.5t131 49.5q56 0 89.5 -31.5t33.5 -92.5q0 -79 -48.5 -130t-125.5 -51q-66 0 -96.5 35.5t-30.5 87.5z" />
|
||||
<glyph unicode="<" d="M115 651v121l936 488v-195l-697 -344l697 -303v-197z" />
|
||||
<glyph unicode="=" d="M117 430v180h936v-180h-936zM117 831v179h936v-179h-936z" />
|
||||
<glyph unicode=">" d="M115 221v197l694 303l-694 344v195l936 -488v-121z" />
|
||||
<glyph unicode="?" horiz-adv-x="907" d="M162 94q0 83 47 132.5t131 49.5q56 0 89.5 -31.5t33.5 -92.5q0 -79 -49 -129t-125 -50q-66 0 -96.5 34.5t-30.5 86.5zM186 1370q207 113 410 113q171 0 269 -85.5t98 -242.5q0 -120 -63.5 -217.5t-231.5 -216.5q-104 -74 -150 -133t-61 -144h-197q18 133 71.5 220.5 t176.5 177.5q107 77 146.5 117t58 80.5t18.5 88.5q0 70 -42.5 114t-123.5 44q-77 0 -150 -27.5t-151 -64.5z" />
|
||||
<glyph unicode="@" horiz-adv-x="1743" d="M100 502q0 270 122.5 489t343 344t493.5 125q200 0 346 -74.5t223.5 -214.5t77.5 -325q0 -176 -59.5 -322.5t-166.5 -229.5t-239 -83q-98 0 -150.5 46t-64.5 120h-6q-101 -166 -277 -166q-123 0 -189.5 78.5t-66.5 218.5q0 151 67.5 279.5t188 203t263.5 74.5 q52 0 94.5 -5t79.5 -13t129 -39l-101 -392q-30 -114 -30 -159q0 -92 79 -92q72 0 134 66.5t97.5 174.5t35.5 230q0 228 -128.5 347.5t-363.5 119.5q-214 0 -385 -99.5t-266.5 -281.5t-95.5 -406q0 -259 140.5 -401t391.5 -142q200 0 430 86v-155q-219 -90 -454 -90 q-210 0 -367 83.5t-241.5 239.5t-84.5 365zM676 522q0 -157 112 -157q82 0 141.5 72t100.5 220l64 240q-53 16 -105 16q-86 0 -158.5 -53.5t-113.5 -144t-41 -193.5z" />
|
||||
<glyph unicode="A" horiz-adv-x="1210" d="M-121 0l783 1464h274l166 -1464h-234l-41 406h-485l-209 -406h-254zM446 614h365q-40 416 -45.5 503.5t-5.5 139.5q-55 -139 -142 -307z" />
|
||||
<glyph unicode="B" horiz-adv-x="1247" d="M70 0l309 1462h399q222 0 335.5 -84t113.5 -248q0 -146 -86.5 -243t-239.5 -127v-8q108 -28 167.5 -103.5t59.5 -183.5q0 -217 -150 -341t-417 -124h-491zM348 201h223q147 0 230.5 68t83.5 194q0 98 -60 149.5t-176 51.5h-200zM489 858h199q139 0 215 60.5t76 171.5 q0 172 -223 172h-181z" />
|
||||
<glyph unicode="C" horiz-adv-x="1225" d="M135 545q0 260 105.5 483t281.5 339t402 116q217 0 389 -92l-94 -195q-63 34 -134 58t-161 24q-154 0 -275 -89t-193.5 -259.5t-72.5 -374.5q0 -180 82.5 -275.5t243.5 -95.5q141 0 329 68v-205q-180 -67 -374 -67q-248 0 -388.5 148.5t-140.5 416.5z" />
|
||||
<glyph unicode="D" horiz-adv-x="1374" d="M70 0l309 1462h369q271 0 417 -145t146 -424q0 -271 -100 -473t-291 -311t-449 -109h-401zM348 201h135q177 0 309 86t202.5 242t70.5 356q0 184 -88 280.5t-256 96.5h-146z" />
|
||||
<glyph unicode="E" horiz-adv-x="1077" d="M70 0l309 1462h776l-43 -205h-539l-84 -395h502l-41 -203h-504l-96 -456h539l-43 -203h-776z" />
|
||||
<glyph unicode="F" horiz-adv-x="1026" d="M70 0l309 1462h774l-43 -205h-537l-96 -454h502l-45 -203h-500l-127 -600h-237z" />
|
||||
<glyph unicode="G" horiz-adv-x="1399" d="M135 539q0 264 102.5 483t290 340t426.5 121q111 0 213 -20.5t205 -69.5l-90 -203q-174 86 -334 86q-158 0 -287 -90.5t-203.5 -258t-74.5 -372.5q0 -183 89 -277t253 -94q109 0 215 33l80 371h-277l43 205h512l-157 -736q-112 -40 -218.5 -58.5t-238.5 -18.5 q-261 0 -405 146t-144 413z" />
|
||||
<glyph unicode="H" horiz-adv-x="1411" d="M70 0l309 1462h237l-127 -598h566l127 598h237l-309 -1462h-238l140 659h-566l-139 -659h-237z" />
|
||||
<glyph unicode="I" horiz-adv-x="608" d="M70 0l311 1462h235l-311 -1462h-235z" />
|
||||
<glyph unicode="J" horiz-adv-x="612" d="M-322 -383l5 201q84 -21 153 -21q201 0 254 250l299 1415h238l-305 -1446q-46 -217 -161.5 -320.5t-312.5 -103.5q-104 0 -170 25z" />
|
||||
<glyph unicode="K" horiz-adv-x="1198" d="M70 0l309 1462h237l-151 -706l141 166l492 540h284l-616 -669l321 -793h-262l-252 655l-149 -100l-117 -555h-237z" />
|
||||
<glyph unicode="L" horiz-adv-x="1016" d="M70 0l309 1462h237l-266 -1257h539l-43 -205h-776z" />
|
||||
<glyph unicode="M" horiz-adv-x="1757" d="M68 0l309 1462h323l109 -1149h6l606 1149h344l-305 -1462h-227l182 872q39 186 86 342h-6l-643 -1214h-205l-115 1214h-6q-9 -118 -55 -340l-184 -874h-219z" />
|
||||
<glyph unicode="N" horiz-adv-x="1491" d="M68 0l309 1462h268l399 -1149h7q6 54 31 192.5t40 203.5l160 753h219l-309 -1462h-260l-410 1163h-6l-10 -69q-24 -149 -35.5 -212.5t-183.5 -881.5h-219z" />
|
||||
<glyph unicode="O" horiz-adv-x="1485" d="M135 543q0 267 98.5 487.5t269.5 337.5t388 117q251 0 390.5 -149t139.5 -414q0 -279 -95 -497t-261.5 -331.5t-386.5 -113.5q-259 0 -401 149.5t-142 413.5zM383 545q0 -173 81.5 -267t227.5 -94q138 0 248.5 95.5t172 265t61.5 375.5q0 170 -79 265t-223 95 q-138 0 -250 -96t-175.5 -266.5t-63.5 -372.5z" />
|
||||
<glyph unicode="P" horiz-adv-x="1174" d="M70 0l309 1462h334q229 0 345 -100.5t116 -300.5q0 -248 -169.5 -381t-472.5 -133h-110l-115 -547h-237zM465 748h94q178 0 275.5 79.5t97.5 225.5q0 109 -58.5 159t-179.5 50h-119z" />
|
||||
<glyph unicode="Q" horiz-adv-x="1485" d="M135 543q0 267 98.5 487.5t269.5 337.5t388 117q251 0 390.5 -149t139.5 -414q0 -322 -130 -563t-355 -332l264 -375h-289l-202 328h-31q-259 0 -401 149.5t-142 413.5zM383 545q0 -173 81.5 -267t227.5 -94q138 0 248.5 94t172 263.5t61.5 378.5q0 170 -79 265t-223 95 q-138 0 -250 -96t-175.5 -266.5t-63.5 -372.5z" />
|
||||
<glyph unicode="R" horiz-adv-x="1206" d="M70 0l309 1462h338q223 0 342 -94.5t119 -290.5q0 -165 -86.5 -278.5t-257.5 -165.5l249 -633h-260l-207 584h-186l-123 -584h-237zM473 782h123q170 0 254 75t84 206q0 105 -59 151t-183 46h-119z" />
|
||||
<glyph unicode="S" horiz-adv-x="1057" d="M39 55v224q173 -97 350 -97q137 0 216 58.5t79 162.5q0 69 -41 122.5t-172 136.5q-105 67 -155 122t-76.5 120.5t-26.5 144.5q0 128 61.5 227t174 153t253.5 54q205 0 381 -92l-86 -191q-161 78 -295 78q-109 0 -175 -58.5t-66 -152.5q0 -47 15 -82.5t46.5 -66 t134.5 -95.5q155 -97 214 -187.5t59 -207.5q0 -210 -144.5 -329t-398.5 -119q-210 0 -348 75z" />
|
||||
<glyph unicode="T" horiz-adv-x="1053" d="M176 1257l45 205h998l-43 -205h-381l-267 -1257h-237l264 1257h-379z" />
|
||||
<glyph unicode="U" horiz-adv-x="1399" d="M152 391q0 83 20 170l193 901h237l-192 -905q-21 -88 -21 -158q0 -102 59.5 -158.5t180.5 -56.5q145 0 230 80.5t124 261.5l199 936h237l-202 -956q-56 -267 -208 -396.5t-403 -129.5q-217 0 -335.5 106t-118.5 305z" />
|
||||
<glyph unicode="V" horiz-adv-x="1165" d="M186 1462h232l74 -905q9 -103 11 -233l-1 -76h4q70 178 137 309l455 905h254l-764 -1462h-258z" />
|
||||
<glyph unicode="W" horiz-adv-x="1788" d="M203 1462h229l19 -850q0 -136 -13 -346h6q83 221 142 355l387 841h225l31 -839l3 -169l-3 -188h8q28 88 70 197.5t61 152.5l358 846h246l-655 -1462h-258l-37 842l-6 185l4 106h-6q-47 -144 -117 -291l-385 -842h-256z" />
|
||||
<glyph unicode="X" horiz-adv-x="1151" d="M-111 0l586 770l-250 692h246l178 -540l402 540h266l-551 -710l274 -752h-256l-192 592l-438 -592h-265z" />
|
||||
<glyph unicode="Y" horiz-adv-x="1092" d="M186 1462h242l154 -669l432 669h266l-623 -913l-114 -549h-238l119 553z" />
|
||||
<glyph unicode="Z" horiz-adv-x="1092" d="M-39 0l33 168l850 1087h-598l43 207h897l-35 -172l-852 -1085h645l-43 -205h-940z" />
|
||||
<glyph unicode="[" horiz-adv-x="631" d="M-27 -324l381 1786h430l-39 -176h-221l-303 -1433h221l-39 -177h-430z" />
|
||||
<glyph unicode="\" horiz-adv-x="788" d="M221 1462h207l219 -1462h-209z" />
|
||||
<glyph unicode="]" horiz-adv-x="631" d="M-143 -324l37 177h219l305 1433h-221l39 176h430l-381 -1786h-428z" />
|
||||
<glyph unicode="^" horiz-adv-x="1069" d="M37 537l608 933h127l272 -933h-184l-188 690l-434 -690h-201z" />
|
||||
<glyph unicode="_" horiz-adv-x="813" d="M-188 -324l30 140h817l-30 -140h-817z" />
|
||||
<glyph unicode="`" horiz-adv-x="1135" d="M541 1548v21h245q47 -154 132 -303v-25h-144q-65 63 -132 151.5t-101 155.5z" />
|
||||
<glyph unicode="a" horiz-adv-x="1186" d="M94 367q0 202 69.5 378t191.5 278.5t268 102.5q97 0 167 -45.5t109 -132.5h10l62 158h180l-236 -1106h-182l21 176h-6q-158 -196 -349 -196q-141 0 -223 101.5t-82 285.5zM332 373q0 -102 40.5 -152.5t112.5 -50.5q82 0 161 77.5t130 207.5t51 284q0 88 -47 141.5 t-123 53.5q-85 0 -160 -77t-120 -209.5t-45 -274.5z" />
|
||||
<glyph unicode="b" horiz-adv-x="1200" d="M47 0l330 1556h235l-71 -333q-13 -63 -38 -156.5t-40 -140.5h8q90 113 165 156.5t161 43.5q145 0 226 -103.5t81 -285.5q0 -202 -69.5 -379.5t-190.5 -277.5t-266 -100q-98 0 -168.5 45t-110.5 131h-10l-64 -156h-178zM369 373q0 -96 46.5 -149.5t131.5 -53.5t159 78.5 t117 210t43 274.5q0 201 -155 201q-81 0 -162 -80t-130.5 -210.5t-49.5 -270.5z" />
|
||||
<glyph unicode="c" horiz-adv-x="954" d="M94 389q0 207 73.5 376.5t206.5 265t302 95.5q164 0 297 -61l-70 -184q-122 53 -221 53q-150 0 -250 -153.5t-100 -379.5q0 -111 56 -171t155 -60q74 0 138.5 22t129.5 54v-195q-140 -71 -305 -71q-196 0 -304 106t-108 303z" />
|
||||
<glyph unicode="d" horiz-adv-x="1198" d="M94 369q0 205 71.5 383t191.5 276t266 98q179 0 268 -178h8q13 146 37 250l76 358h233l-330 -1556h-184l19 176h-7q-88 -106 -170 -151t-174 -45q-143 0 -224 101.5t-81 287.5zM332 373q0 -203 157 -203q82 0 162.5 82t129 214t48.5 267q0 91 -43.5 146t-132.5 55 q-85 0 -159 -77t-118 -211t-44 -273z" />
|
||||
<glyph unicode="e" horiz-adv-x="1075" d="M94 401q0 198 77.5 368.5t210 263.5t296.5 93q161 0 250.5 -72.5t89.5 -205.5q0 -182 -166.5 -284.5t-474.5 -102.5h-43l-2 -31v-29q0 -111 56.5 -174t168.5 -63q72 0 143 19t168 65v-187q-96 -44 -176.5 -62.5t-179.5 -18.5q-197 0 -307.5 111t-110.5 310zM362 633h29 q188 0 294 53.5t106 151.5q0 51 -32 79.5t-95 28.5q-96 0 -180.5 -86t-121.5 -227z" />
|
||||
<glyph unicode="f" horiz-adv-x="702" d="M-225 -279q64 -20 114 -20q134 0 177 205l217 1022h-179l21 106l194 76l21 92q44 198 134.5 281.5t256.5 83.5q115 0 211 -43l-61 -176q-74 28 -136 28q-69 0 -110.5 -43t-63.5 -141l-18 -86h229l-37 -178h-229l-223 -1053q-40 -189 -131 -278t-238 -89q-90 0 -149 23 v190z" />
|
||||
<glyph unicode="g" horiz-adv-x="1067" d="M-121 -211q0 103 69.5 178t223.5 127q-76 45 -76 127q0 69 46.5 119.5t146.5 97.5q-135 81 -135 252q0 196 122.5 316t323.5 120q80 0 160 -20h383l-31 -137l-192 -33q28 -58 28 -137q0 -193 -119 -306.5t-319 -113.5q-52 0 -92 8q-111 -40 -111 -104q0 -38 31.5 -52 t91.5 -22l127 -16q176 -22 252 -87.5t76 -187.5q0 -196 -151 -303t-429 -107q-203 0 -314.5 75t-111.5 206zM92 -184q0 -65 55.5 -103.5t169.5 -38.5q163 0 255 54t92 155q0 51 -45 80t-158 41l-137 14q-112 -18 -172 -71t-60 -131zM377 680q0 -71 35.5 -109.5t101.5 -38.5 q65 0 112.5 39t74 107t26.5 149q0 142 -133 142q-65 0 -114 -38.5t-76 -105t-27 -145.5z" />
|
||||
<glyph unicode="h" horiz-adv-x="1208" d="M47 0l330 1556h235l-57 -262q-27 -126 -73 -293l-19 -75h8q84 106 168.5 153t177.5 47q136 0 208.5 -77.5t72.5 -221.5q0 -76 -23 -174l-139 -653h-234l142 672q18 90 18 127q0 135 -129 135q-112 0 -209.5 -125t-142.5 -342l-98 -467h-236z" />
|
||||
<glyph unicode="i" horiz-adv-x="563" d="M47 0l236 1106h235l-235 -1106h-236zM330 1378q0 68 39 110t110 42q53 0 86 -26.5t33 -80.5q0 -71 -40 -112t-105 -41q-53 0 -88 26t-35 82z" />
|
||||
<glyph unicode="j" horiz-adv-x="563" d="M-262 -279q64 -20 117 -20q131 0 170 186l260 1219h233l-266 -1247q-38 -181 -127.5 -266t-237.5 -85q-90 0 -149 23v190zM332 1378q0 68 38 110t109 42q54 0 86.5 -26.5t32.5 -80.5q0 -71 -40 -112t-105 -41q-53 0 -87 25.5t-34 82.5z" />
|
||||
<glyph unicode="k" horiz-adv-x="1081" d="M47 0l330 1556h235q-135 -627 -159.5 -729.5t-59.5 -226.5h4l490 506h272l-483 -485l291 -621h-262l-209 471l-136 -96l-77 -375h-236z" />
|
||||
<glyph unicode="l" horiz-adv-x="563" d="M47 0l330 1556h235l-331 -1556h-234z" />
|
||||
<glyph unicode="m" horiz-adv-x="1819" d="M47 0l236 1106h184l-21 -205h9q148 225 352 225q220 0 254 -235h8q75 116 170.5 175.5t198.5 59.5q133 0 202.5 -76.5t69.5 -215.5q0 -64 -22 -181l-140 -653h-235l143 672q19 95 19 133q0 129 -121 129q-108 0 -201.5 -124t-136.5 -329l-101 -481h-235l143 672 q17 82 17 127q0 135 -117 135q-110 0 -203.5 -127t-138.5 -338l-98 -469h-236z" />
|
||||
<glyph unicode="n" horiz-adv-x="1208" d="M47 0l236 1106h184l-21 -205h9q83 118 171 171.5t191 53.5q134 0 207.5 -76t73.5 -216q0 -69 -23 -181l-137 -653h-236l142 672q18 90 18 131q0 131 -129 131q-72 0 -142 -57t-126 -164.5t-84 -243.5l-98 -469h-236z" />
|
||||
<glyph unicode="o" horiz-adv-x="1174" d="M94 408q0 199 71.5 365t200.5 258.5t298 92.5q195 0 305 -116t110 -316q0 -202 -73 -367.5t-200.5 -254t-293.5 -88.5q-192 0 -305 114.5t-113 311.5zM332 403q0 -111 49.5 -170t146.5 -59q90 0 162 68t112 190.5t40 269.5q0 107 -49 167.5t-140 60.5q-93 0 -166.5 -71.5 t-114 -194t-40.5 -261.5z" />
|
||||
<glyph unicode="p" horiz-adv-x="1200" d="M-55 -492l338 1598h184l-21 -188h9q157 208 344 208q143 0 224 -103t81 -286q0 -204 -70 -381.5t-190.5 -276.5t-265.5 -99q-181 0 -269 176h-10q-7 -97 -25 -185l-96 -463h-233zM369 373q0 -96 46.5 -149.5t131.5 -53.5t159 78.5t117 210t43 274.5q0 201 -155 201 q-81 0 -161 -79.5t-130.5 -210.5t-50.5 -271z" />
|
||||
<glyph unicode="q" horiz-adv-x="1198" d="M94 367q0 208 73 387t192.5 275.5t265.5 96.5q183 0 274 -178h10l64 158h178l-340 -1598h-233l75 349q12 56 43.5 180t38.5 141h-8q-84 -108 -164 -153t-170 -45q-139 0 -219 102.5t-80 284.5zM332 373q0 -203 160 -203q80 0 159 81t127.5 213t48.5 269q0 94 -45.5 147.5 t-126.5 53.5q-86 0 -160 -77.5t-118.5 -209.5t-44.5 -274z" />
|
||||
<glyph unicode="r" horiz-adv-x="836" d="M47 0l236 1106h184l-21 -205h9q83 120 166 172.5t176 52.5q62 0 108 -12l-51 -219q-54 14 -102 14q-126 0 -225 -113t-138 -296l-106 -500h-236z" />
|
||||
<glyph unicode="s" horiz-adv-x="922" d="M14 47v203q153 -90 312 -90q97 0 157 40t60 109q0 51 -34.5 87.5t-141.5 97.5q-125 67 -176.5 136.5t-51.5 164.5q0 155 107 243t289 88q196 0 346 -84l-76 -176q-140 76 -266 76q-73 0 -118.5 -33t-45.5 -92q0 -45 33 -80t135 -90q105 -59 149 -101t67 -91.5t23 -114.5 q0 -173 -118 -266.5t-328 -93.5q-190 0 -322 67z" />
|
||||
<glyph unicode="t" horiz-adv-x="752" d="M92 928l21 110l190 82l129 232h146l-52 -246h279l-39 -178h-277l-122 -572q-13 -55 -13 -92q0 -43 25 -68.5t76 -25.5q68 0 151 31v-178q-35 -17 -95 -30t-120 -13q-274 0 -274 247q0 57 16 131l121 570h-162z" />
|
||||
<glyph unicode="u" horiz-adv-x="1208" d="M111 274q0 63 12 124.5t24 123.5l123 584h236l-129 -610q-31 -141 -31 -193q0 -133 127 -133q72 0 143 57t126 162.5t85 247.5l99 469h233l-233 -1106h-185l21 205h-8q-82 -116 -171 -170.5t-192 -54.5q-134 0 -207 76t-73 218z" />
|
||||
<glyph unicode="v" horiz-adv-x="997" d="M100 1106h232l55 -598q14 -159 14 -297h7q28 74 70 165t65 132l311 598h250l-598 -1106h-275z" />
|
||||
<glyph unicode="w" horiz-adv-x="1540" d="M121 1106h221l13 -646q-2 -87 -11 -245h6q66 176 109 272l278 619h254l19 -604l1 -53l-3 -234h6q17 50 57 158.5t63.5 163.5t251.5 569h244l-518 -1106h-268l-19 627l-1 70l3 200q-25 -62 -51.5 -125t-345.5 -772h-262z" />
|
||||
<glyph unicode="x" horiz-adv-x="1032" d="M-86 0l475 569l-231 537h245l144 -373l287 373h274l-461 -549l248 -557h-246l-160 387l-305 -387h-270z" />
|
||||
<glyph unicode="y" horiz-adv-x="1004" d="M-170 -285q75 -16 125 -16q74 0 134 43.5t124 155.5l51 92l-164 1116h232l63 -531q9 -62 16 -174.5t7 -181.5h6q86 215 135 313l293 574h254l-688 -1280q-90 -165 -196 -241.5t-249 -76.5q-76 0 -143 19v188z" />
|
||||
<glyph unicode="z" horiz-adv-x="920" d="M-39 0l29 147l635 781h-439l39 178h705l-37 -170l-623 -758h486l-37 -178h-758z" />
|
||||
<glyph unicode="{" horiz-adv-x="721" d="M8 485l39 187q120 0 191.5 42.5t93.5 143.5l59 275q28 134 73 201.5t120 97.5t198 30h60l-41 -184q-96 0 -139.5 -34t-61.5 -116l-70 -309q-24 -108 -87 -170.5t-179 -79.5v-6q160 -45 160 -215q0 -38 -16 -121l-43 -194q-11 -48 -11 -74q0 -51 32.5 -74.5t109.5 -23.5 v-185h-39q-316 0 -316 236q0 61 17 133l45 201q14 65 14 98q0 141 -209 141z" />
|
||||
<glyph unicode="|" d="M498 -481v2033h178v-2033h-178z" />
|
||||
<glyph unicode="}" horiz-adv-x="721" d="M-88 -141q106 2 152.5 36.5t64.5 114.5l70 309q24 109 87 170t179 78v6q-158 48 -158 215q0 55 17 121l43 197q10 44 10 74q0 58 -43 78t-121 20l35 184h22q318 0 318 -235q0 -61 -17 -133l-45 -203q-14 -65 -14 -98q0 -142 209 -142l-39 -186q-121 0 -192 -42t-93 -142 l-63 -306q-34 -165 -123.5 -232t-269.5 -67h-29v183z" />
|
||||
<glyph unicode="~" d="M111 571v191q100 108 249 108q64 0 118.5 -12t146.5 -51q70 -30 115 -42.5t94 -12.5q50 0 112.5 31t120.5 89v-190q-103 -111 -250 -111q-63 0 -124 16.5t-138 49.5q-76 32 -119.5 43.5t-91.5 11.5q-51 0 -112 -31t-121 -90z" />
|
||||
<glyph unicode="¢" d="M195 586q0 190 63.5 351t178 260.5t261.5 121.5l35 164h156l-37 -164q124 -12 221 -57l-69 -185q-125 53 -222 53q-99 0 -180 -71.5t-125.5 -194.5t-44.5 -266q0 -111 56 -171t155 -60q74 0 138.5 21.5t129.5 53.5v-194q-133 -69 -293 -74l-40 -194h-156l45 213 q-132 34 -202 134.5t-70 258.5z" />
|
||||
<glyph unicode="£" d="M-18 0l38 193q200 45 250 276l35 164h-196l36 172h197l61 299q38 185 153 282t300 97q188 0 352 -86l-88 -183q-143 74 -258 74q-185 0 -227 -205l-57 -278h333l-34 -172h-336l-33 -152q-21 -98 -68.5 -165t-130.5 -109h690l-45 -207h-972z" />
|
||||
<glyph unicode="¥" d="M106 244l33 155h273l30 148h-272l35 155h211l-199 760h232l145 -669l432 669h248l-518 -760h217l-35 -155h-274l-31 -148h274l-33 -155h-272l-53 -244h-221l51 244h-273z" />
|
||||
<glyph unicode="©" horiz-adv-x="1704" d="M131 731q0 200 100 375t275 276t377 101q199 0 373.5 -99t276 -275.5t101.5 -377.5q0 -199 -98.5 -373t-272.5 -276t-380 -102q-207 0 -382 103.5t-272.5 276.5t-97.5 371zM254 731q0 -168 83 -312.5t229 -230.5t317 -86q173 0 319.5 87t227.5 231.5t81 310.5 q0 165 -82 310.5t-227.5 232t-318.5 86.5q-168 0 -314.5 -84.5t-230.5 -231t-84 -313.5zM502 727q0 216 113.5 340.5t312.5 124.5q138 0 266 -66l-68 -147q-106 55 -196 55q-113 0 -175.5 -76t-62.5 -231q0 -301 238 -301q47 0 112 16t109 35v-158q-117 -51 -240 -51 q-197 0 -303 123.5t-106 335.5z" />
|
||||
<glyph unicode="­" horiz-adv-x="649" d="M47 446l45 203h502l-45 -203h-502z" />
|
||||
<glyph unicode="®" horiz-adv-x="1704" d="M131 731q0 200 100 375t275 276t377 101q199 0 373.5 -99t276 -275.5t101.5 -377.5q0 -199 -98.5 -373t-272.5 -276t-380 -102q-207 0 -382 103.5t-272.5 276.5t-97.5 371zM254 731q0 -168 83 -312.5t229 -230.5t317 -86q173 0 319.5 87t227.5 231.5t81 310.5 q0 165 -82 310.5t-227.5 232t-318.5 86.5q-168 0 -314.5 -84.5t-230.5 -231t-84 -313.5zM608 291v878h269q337 0 337 -262q0 -83 -45.5 -145t-130.5 -98l211 -373h-200l-172 325h-91v-325h-178zM786 760h72q84 0 129 36t45 99q0 73 -45.5 101t-128.5 28h-72v-264z" />
|
||||
<glyph unicode="´" horiz-adv-x="1135" d="M508 1241v25q97 108 225 303h264v-19q-54 -66 -158 -161.5t-175 -147.5h-156z" />
|
||||
<glyph unicode=" " horiz-adv-x="784" />
|
||||
<glyph unicode=" " horiz-adv-x="1569" />
|
||||
<glyph unicode=" " horiz-adv-x="784" />
|
||||
<glyph unicode=" " horiz-adv-x="1569" />
|
||||
<glyph unicode=" " horiz-adv-x="523" />
|
||||
<glyph unicode=" " horiz-adv-x="392" />
|
||||
<glyph unicode=" " horiz-adv-x="261" />
|
||||
<glyph unicode=" " horiz-adv-x="261" />
|
||||
<glyph unicode=" " horiz-adv-x="196" />
|
||||
<glyph unicode=" " horiz-adv-x="313" />
|
||||
<glyph unicode=" " horiz-adv-x="87" />
|
||||
<glyph unicode="‐" horiz-adv-x="649" d="M47 446l45 203h502l-45 -203h-502z" />
|
||||
<glyph unicode="‑" horiz-adv-x="649" d="M47 446l45 203h502l-45 -203h-502z" />
|
||||
<glyph unicode="‒" horiz-adv-x="649" d="M47 446l45 203h502l-45 -203h-502z" />
|
||||
<glyph unicode="–" horiz-adv-x="983" d="M47 453l43 194h838l-43 -194h-838z" />
|
||||
<glyph unicode="—" horiz-adv-x="1966" d="M47 453l43 194h1821l-43 -194h-1821z" />
|
||||
<glyph unicode="‘" horiz-adv-x="393" d="M119 983q34 76 106.5 209t159.5 270h176q-122 -286 -199 -501h-237z" />
|
||||
<glyph unicode="’" horiz-adv-x="393" d="M115 961q43 95 106 255t92 246h238l8 -22q-37 -83 -110.5 -217.5t-155.5 -261.5h-178z" />
|
||||
<glyph unicode="“" horiz-adv-x="803" d="M119 983q34 76 106.5 209t159.5 270h176q-122 -286 -199 -501h-237zM526 983q84 190 267 479h176q-122 -286 -199 -501h-235z" />
|
||||
<glyph unicode="”" horiz-adv-x="803" d="M115 961q43 95 106 255t92 246h238l8 -22q-37 -83 -110.5 -217.5t-155.5 -261.5h-178zM522 961q51 114 109 261t90 240h237l9 -22q-98 -220 -269 -479h-176z" />
|
||||
<glyph unicode="•" horiz-adv-x="756" d="M152 684q0 156 83.5 252t223.5 96q100 0 158.5 -54.5t58.5 -168.5q0 -156 -82 -252t-227 -96q-102 0 -158.5 57.5t-56.5 165.5z" />
|
||||
<glyph unicode="…" horiz-adv-x="1634" d="M834 94q0 83 47 132.5t131 49.5q56 0 89.5 -31.5t33.5 -92.5q0 -78 -47.5 -129.5t-124.5 -51.5q-66 0 -97.5 35.5t-31.5 87.5zM594 94q0 83 47 132.5t131 49.5q56 0 89.5 -31.5t33.5 -92.5q0 -78 -47.5 -129.5t-124.5 -51.5q-66 0 -97.5 35.5t-31.5 87.5zM293 94 q0 83 47 132.5t131 49.5q56 0 89.5 -31.5t33.5 -92.5q0 -78 -47.5 -129.5t-124.5 -51.5q-66 0 -97.5 35.5t-31.5 87.5z" />
|
||||
<glyph unicode=" " horiz-adv-x="313" />
|
||||
<glyph unicode=" " horiz-adv-x="392" />
|
||||
<glyph unicode="€" d="M51 492l33 155h139q15 95 27 139h-137l32 154h148q92 260 255.5 401.5t371.5 141.5q88 0 164.5 -22t156.5 -77l-102 -180q-54 34 -107 56t-119 22q-118 0 -214.5 -87t-161.5 -255h387l-33 -154h-402q-18 -67 -28 -139h340l-33 -155h-319q0 -161 60.5 -234.5t195.5 -73.5 q120 0 258 60v-203q-129 -61 -306 -61q-216 0 -330 130t-114 382h-162z" />
|
||||
<glyph unicode="™" horiz-adv-x="1534" d="M113 1335v127h540v-127h-198v-594h-146v594h-196zM709 741v721h215l170 -534l182 534h205v-721h-146v418l4 121h-6l-184 -539h-119l-178 539h-6l4 -115v-424h-141z" />
|
||||
<glyph unicode="" horiz-adv-x="1105" d="M0 1105h1105v-1105h-1105v1105z" />
|
||||
</font>
|
||||
</defs></svg>
|
After Width: | Height: | Size: 27 KiB |
BIN
fonts/OpenSans-SemiboldItalic-webfont.ttf
Normal file
BIN
fonts/OpenSans-SemiboldItalic-webfont.woff
Normal file
BIN
images/bullet.png
Normal file
After Width: | Height: | Size: 1.0 KiB |
BIN
images/hr.gif
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
images/nav-bg.gif
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
images/shot1.png
Normal file
After Width: | Height: | Size: 69 KiB |
BIN
images/shot2.png
Normal file
After Width: | Height: | Size: 110 KiB |
BIN
images/shot3.png
Normal file
After Width: | Height: | Size: 102 KiB |
@ -1,19 +0,0 @@
|
||||
noinst_HEADERS = \
|
||||
bmon/attr.h \
|
||||
bmon/bmon.h \
|
||||
bmon/compile-fixes.h \
|
||||
bmon/conf.h \
|
||||
bmon/config.h \
|
||||
bmon/defs.h \
|
||||
bmon/element_cfg.h \
|
||||
bmon/element.h \
|
||||
bmon/graph.h \
|
||||
bmon/group.h \
|
||||
bmon/history.h \
|
||||
bmon/info.h \
|
||||
bmon/input.h \
|
||||
bmon/list.h \
|
||||
bmon/module.h \
|
||||
bmon/output.h \
|
||||
bmon/unit.h \
|
||||
bmon/utils.h
|
2
include/bmon/.gitignore
vendored
@ -1,2 +0,0 @@
|
||||
defs.h*
|
||||
stamp-h1
|
@ -1,138 +0,0 @@
|
||||
/*
|
||||
* bmon/attr.h Attributes
|
||||
*
|
||||
* Copyright (c) 2001-2013 Thomas Graf <tgraf@suug.ch>
|
||||
* Copyright (c) 2013 Red Hat, Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included
|
||||
* in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef __BMON_ATTR_H_
|
||||
#define __BMON_ATTR_H_
|
||||
|
||||
#include <bmon/bmon.h>
|
||||
#include <bmon/unit.h>
|
||||
|
||||
struct element;
|
||||
|
||||
struct rate
|
||||
{
|
||||
/* Total value of attribute with eventual overflows accumulated. */
|
||||
uint64_t r_total;
|
||||
|
||||
/* Current value of counter */
|
||||
uint64_t r_current;
|
||||
|
||||
/* Value of r_current at last read */
|
||||
uint64_t r_prev;
|
||||
|
||||
/* Rate per second calculated every `rate_interval' */
|
||||
float r_rate;
|
||||
|
||||
/* Time of last calculation */
|
||||
timestamp_t r_last_calc;
|
||||
};
|
||||
|
||||
enum {
|
||||
ATTR_TYPE_UNSPEC,
|
||||
ATTR_TYPE_COUNTER,
|
||||
ATTR_TYPE_RATE,
|
||||
ATTR_TYPE_PERCENT,
|
||||
};
|
||||
|
||||
struct attr_def {
|
||||
int ad_id;
|
||||
char * ad_name;
|
||||
char * ad_description;
|
||||
int ad_type;
|
||||
int ad_flags;
|
||||
struct unit * ad_unit;
|
||||
|
||||
struct list_head ad_list;
|
||||
};
|
||||
|
||||
struct attr_map {
|
||||
const char * name;
|
||||
const char * description;
|
||||
const char * unit;
|
||||
int attrid,
|
||||
type,
|
||||
rxid,
|
||||
txid,
|
||||
flags;
|
||||
};
|
||||
|
||||
extern int attr_def_add(const char *, const char *,
|
||||
struct unit *, int, int);
|
||||
extern struct attr_def * attr_def_lookup(const char *);
|
||||
extern struct attr_def * attr_def_lookup_id(int);
|
||||
|
||||
extern int attr_map_load(struct attr_map *map, size_t size);
|
||||
|
||||
#define ATTR_FORCE_HISTORY 0x01 /* collect history */
|
||||
#define ATTR_IGNORE_OVERFLOWS 0x02
|
||||
#define ATTR_TRUE_64BIT 0x04
|
||||
#define ATTR_RX_ENABLED 0x08 /* has RX counter */
|
||||
#define ATTR_TX_ENABLED 0x10 /* has TX counter */
|
||||
#define ATTR_DOING_HISTORY 0x20 /* history collected */
|
||||
|
||||
struct attr
|
||||
{
|
||||
struct rate a_rx_rate,
|
||||
a_tx_rate;
|
||||
|
||||
uint8_t a_flags;
|
||||
struct attr_def * a_def;
|
||||
timestamp_t a_last_update;
|
||||
|
||||
struct list_head a_history_list;
|
||||
|
||||
struct list_head a_list;
|
||||
struct list_head a_sort_list;
|
||||
};
|
||||
|
||||
extern struct attr * attr_lookup(const struct element *, int);
|
||||
extern void attr_update(struct element *, int,
|
||||
uint64_t, uint64_t , int );
|
||||
extern void attr_notify_update(struct attr *,
|
||||
timestamp_t *);
|
||||
extern void attr_free(struct attr *);
|
||||
|
||||
extern void attr_rate2float(struct attr *,
|
||||
double *, char **, int *,
|
||||
double *, char **, int *);
|
||||
|
||||
extern void attr_calc_usage(struct attr *, float *, float *,
|
||||
uint64_t, uint64_t);
|
||||
|
||||
#define ATTR_HASH_SIZE 32
|
||||
|
||||
#define UPDATE_FLAG_RX 0x01
|
||||
#define UPDATE_FLAG_TX 0x02
|
||||
#define UPDATE_FLAG_64BIT 0x04
|
||||
|
||||
extern struct attr * attr_select_first(void);
|
||||
extern struct attr * attr_select_last(void);
|
||||
extern struct attr * attr_select_next(void);
|
||||
extern struct attr * attr_select_prev(void);
|
||||
extern struct attr * attr_current(void);
|
||||
|
||||
extern void attr_start_collecting_history(struct attr *);
|
||||
|
||||
#endif
|
@ -1,84 +0,0 @@
|
||||
/*
|
||||
* bmon.h All-include Header
|
||||
*
|
||||
* Copyright (c) 2001-2013 Thomas Graf <tgraf@suug.ch>
|
||||
* Copyright (c) 2013 Red Hat, Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included
|
||||
* in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef __BMON_BMON_H_
|
||||
#define __BMON_BMON_H_
|
||||
|
||||
#include <bmon/config.h>
|
||||
#include <bmon/list.h>
|
||||
|
||||
extern int start_time;
|
||||
|
||||
typedef struct timestamp_s
|
||||
{
|
||||
int64_t tv_sec;
|
||||
int64_t tv_usec;
|
||||
} timestamp_t;
|
||||
|
||||
typedef struct xdate_s
|
||||
{
|
||||
struct tm d_tm;
|
||||
unsigned int d_usec;
|
||||
} xdate_t;
|
||||
|
||||
enum {
|
||||
EMPTY_LIST = 1,
|
||||
END_OF_LIST = 2
|
||||
};
|
||||
|
||||
#define BUG() \
|
||||
do { \
|
||||
fprintf(stderr, "BUG: %s:%d\n", __FILE__, __LINE__); \
|
||||
assert(0); \
|
||||
exit(EINVAL); \
|
||||
} while (0);
|
||||
|
||||
#define ARRAY_SIZE(X) (sizeof(X) / sizeof((X)[0]))
|
||||
|
||||
#if defined __GNUC__
|
||||
#define __init __attribute__ ((constructor))
|
||||
#define __exit __attribute__ ((destructor))
|
||||
#define __unused__ __attribute__ ((unused))
|
||||
#else
|
||||
#define __init
|
||||
#define __exit
|
||||
#define __unused__
|
||||
#endif
|
||||
|
||||
#ifdef DEBUG
|
||||
#define DBG(FMT, ARG...) \
|
||||
do { \
|
||||
fprintf(stderr, \
|
||||
"[DBG] %20s:%-4u %s: " FMT "\n", \
|
||||
__FILE__, __LINE__, \
|
||||
__PRETTY_FUNCTION__, ##ARG); \
|
||||
} while (0)
|
||||
#else
|
||||
#define DBG(FMT, ARG...) \
|
||||
do { \
|
||||
} while (0)
|
||||
#endif
|
||||
|
||||
#endif
|
@ -1,35 +0,0 @@
|
||||
/*
|
||||
* compile_fixes.h
|
||||
*
|
||||
* Copyright (c) 2001-2013 Thomas Graf <tgraf@suug.ch>
|
||||
* Copyright (c) 2013 Red Hat, Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included
|
||||
* in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef __BMON_COMPILE_FIXES_H_
|
||||
#define __BMON_COMPILE_FIXES_H_
|
||||
|
||||
#include <bmon/defs.h>
|
||||
|
||||
#ifndef HAVE_SUSECONDS_T
|
||||
typedef long suseconds_t;
|
||||
#endif
|
||||
|
||||
#endif
|
@ -1,91 +0,0 @@
|
||||
/*
|
||||
* conf.h Config Crap
|
||||
*
|
||||
* Copyright (c) 2001-2013 Thomas Graf <tgraf@suug.ch>
|
||||
* Copyright (c) 2013 Red Hat, Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included
|
||||
* in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef __BMON_CONF_H_
|
||||
#define __BMON_CONF_H_
|
||||
|
||||
#include <bmon/bmon.h>
|
||||
|
||||
extern cfg_t *cfg;
|
||||
|
||||
extern float cfg_read_interval;
|
||||
extern float cfg_rate_interval;
|
||||
extern float cfg_rate_variance;
|
||||
extern float cfg_history_variance;
|
||||
extern int cfg_show_all;
|
||||
extern int cfg_unit_exp;
|
||||
|
||||
extern void conf_init_pre(void);
|
||||
extern void conf_init_post(void);
|
||||
extern void configfile_read(void);
|
||||
extern void set_configfile(const char *);
|
||||
|
||||
extern unsigned int get_lifecycles(void);
|
||||
|
||||
extern void conf_set_float(const char *, double);
|
||||
extern double conf_get_float(const char *);
|
||||
extern void conf_set_int(const char *, long);
|
||||
extern long conf_get_int(const char *);
|
||||
extern void conf_set_string(const char *, const char *);
|
||||
extern const char * conf_get_string(const char *);
|
||||
|
||||
typedef struct tv_s
|
||||
{
|
||||
char * tv_type;
|
||||
char * tv_value;
|
||||
struct list_head tv_list;
|
||||
} tv_t;
|
||||
|
||||
typedef struct module_conf_s
|
||||
{
|
||||
char * m_name;
|
||||
struct list_head m_attrs;
|
||||
struct list_head m_list;
|
||||
} module_conf_t;
|
||||
|
||||
extern int parse_module_param(const char *, struct list_head *);
|
||||
|
||||
enum {
|
||||
LAYOUT_UNSPEC,
|
||||
LAYOUT_DEFAULT,
|
||||
LAYOUT_STATUSBAR,
|
||||
LAYOUT_HEADER,
|
||||
LAYOUT_LIST,
|
||||
LAYOUT_SELECTED,
|
||||
__LAYOUT_MAX
|
||||
};
|
||||
|
||||
#define LAYOUT_MAX (__LAYOUT_MAX - 1)
|
||||
|
||||
struct layout
|
||||
{
|
||||
int l_fg,
|
||||
l_bg,
|
||||
l_attr;
|
||||
};
|
||||
|
||||
extern struct layout cfg_layout[];
|
||||
|
||||
#endif
|
@ -1,162 +0,0 @@
|
||||
/*
|
||||
* config.h Global Config
|
||||
*
|
||||
* Copyright (c) 2001-2013 Thomas Graf <tgraf@suug.ch>
|
||||
* Copyright (c) 2013 Red Hat, Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included
|
||||
* in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef __BMON_CONFIG_H_
|
||||
#define __BMON_CONFIG_H_
|
||||
|
||||
#include <bmon/defs.h>
|
||||
#include <bmon/compile-fixes.h>
|
||||
|
||||
#if STDC_HEADERS != 1
|
||||
#error "*** ERROR: ANSI C headers required for compilation ***"
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
#include <ctype.h>
|
||||
#include <stdarg.h>
|
||||
#include <signal.h>
|
||||
#include <limits.h>
|
||||
#include <stdlib.h>
|
||||
#include <math.h>
|
||||
#include <inttypes.h>
|
||||
#include <sys/file.h>
|
||||
#include <assert.h>
|
||||
#include <syslog.h>
|
||||
#include <sys/wait.h>
|
||||
#include <dirent.h>
|
||||
#ifdef SYS_BSD
|
||||
# include <float.h>
|
||||
#else
|
||||
# include <values.h>
|
||||
#endif
|
||||
|
||||
#if TIME_WITH_SYS_TIME
|
||||
# include <sys/time.h>
|
||||
# include <time.h>
|
||||
#else
|
||||
# if HAVE_SYS_TIME_H
|
||||
# include <sys/time.h>
|
||||
# else
|
||||
# include <time.h>
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_VFORK_H
|
||||
#include <vfork.h>
|
||||
#endif
|
||||
|
||||
#if !HAVE_WORKING_VFORK
|
||||
#define vfork fork
|
||||
#endif
|
||||
|
||||
#if defined HAVE_STRING_H
|
||||
#include <string.h>
|
||||
#elif defined HAVE_STRINGS_H
|
||||
#include <strings.h>
|
||||
#else
|
||||
#error "*** ERROR: No string header file found ***"
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_UNISTD_H
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_STDLIB_H
|
||||
#include <stdlib.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_STDINT_H
|
||||
#include <stdint.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_INITTYPES_H
|
||||
#include <inittypes.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_SYS_TYPES_H
|
||||
#include <sys/types.h>
|
||||
#endif
|
||||
|
||||
#if defined HAVE_GETOPT_H
|
||||
#include <getopt.h>
|
||||
#endif
|
||||
|
||||
#include <sys/stat.h>
|
||||
#include <grp.h>
|
||||
#include <pwd.h>
|
||||
#include <errno.h>
|
||||
|
||||
#if defined HAVE_SYS_UTSNAME_H
|
||||
#include <sys/utsname.h>
|
||||
#endif
|
||||
|
||||
#if defined HAVE_NCURSESW_CURSES_H
|
||||
# include <ncursesw/curses.h>
|
||||
#elif defined HAVE_NCURSESW_H
|
||||
# include <ncursesw.h>
|
||||
#elif defined HAVE_NCURSES_CURSES_H
|
||||
# include <ncurses/curses.h>
|
||||
#elif defined HAVE_NCURSES_H
|
||||
# include <ncurses.h>
|
||||
#elif defined HAVE_CURSES_H
|
||||
# include <curses.h>
|
||||
#else
|
||||
# error "SysV or X/Open-compatible Curses header file required"
|
||||
#endif
|
||||
|
||||
#include <netinet/in.h>
|
||||
|
||||
#if defined HAVE_NETINET6_IN6_H
|
||||
#include <netinet6/in6.h>
|
||||
#endif
|
||||
|
||||
#include <sys/socket.h>
|
||||
#include <arpa/inet.h>
|
||||
|
||||
#include <confuse.h>
|
||||
|
||||
#ifndef IFNAMSIZ
|
||||
#define IFNAMSIZ 16
|
||||
#endif
|
||||
|
||||
#ifndef SCNu64
|
||||
#define SCNu64 "llu"
|
||||
#endif
|
||||
|
||||
#ifndef PRIu64
|
||||
#define PRIu64 "llu"
|
||||
#endif
|
||||
|
||||
#ifndef PRId64
|
||||
#define PRId64 "lld"
|
||||
#endif
|
||||
|
||||
#ifndef PRIX64
|
||||
#define PRIX64 "X"
|
||||
#endif
|
||||
|
||||
#define DEFAULT_GROUP "intf"
|
||||
|
||||
#endif
|
@ -1,246 +0,0 @@
|
||||
/* include/bmon/defs.h.in. Generated from configure.ac by autoheader. */
|
||||
|
||||
/* enable debugging */
|
||||
#undef DEBUG
|
||||
|
||||
/* no overflow workaround */
|
||||
#undef DISABLE_OVERFLOW_WORKAROUND
|
||||
|
||||
/* Define to 1 if you have the `atexit' function. */
|
||||
#undef HAVE_ATEXIT
|
||||
|
||||
/* have curses */
|
||||
#undef HAVE_CURSES
|
||||
|
||||
/* Define to 1 if library supports color (enhanced functions) */
|
||||
#undef HAVE_CURSES_COLOR
|
||||
|
||||
/* Define to 1 if library supports X/Open Enhanced functions */
|
||||
#undef HAVE_CURSES_ENHANCED
|
||||
|
||||
/* Define to 1 if <curses.h> is present */
|
||||
#undef HAVE_CURSES_H
|
||||
|
||||
/* Define to 1 if library supports certain obsolete features */
|
||||
#undef HAVE_CURSES_OBSOLETE
|
||||
|
||||
/* Define to 1 if you have the <dirent.h> header file. */
|
||||
#undef HAVE_DIRENT_H
|
||||
|
||||
/* Define to 1 if you have the <fcntl.h> header file. */
|
||||
#undef HAVE_FCNTL_H
|
||||
|
||||
/* Define to 1 if you have the `fork' function. */
|
||||
#undef HAVE_FORK
|
||||
|
||||
/* Define to 1 if you have the `getdate' function. */
|
||||
#undef HAVE_GETDATE
|
||||
|
||||
/* Define to 1 if you have the <getopt.h> header file. */
|
||||
#undef HAVE_GETOPT_H
|
||||
|
||||
/* Define to 1 if you have the `gettimeofday' function. */
|
||||
#undef HAVE_GETTIMEOFDAY
|
||||
|
||||
/* Define to 1 if you have the <inttypes.h> header file. */
|
||||
#undef HAVE_INTTYPES_H
|
||||
|
||||
/* Define to 1 if you have the `m' library (-lm). */
|
||||
#undef HAVE_LIBM
|
||||
|
||||
/* Define to 1 if you have the <memory.h> header file. */
|
||||
#undef HAVE_MEMORY_H
|
||||
|
||||
/* Define to 1 if you have the `memset' function. */
|
||||
#undef HAVE_MEMSET
|
||||
|
||||
/* have ncurses */
|
||||
#undef HAVE_NCURSES
|
||||
|
||||
/* Define to 1 if the NcursesW library is present */
|
||||
#undef HAVE_NCURSESW
|
||||
|
||||
/* Define to 1 if <ncursesw/curses.h> is present */
|
||||
#undef HAVE_NCURSESW_CURSES_H
|
||||
|
||||
/* Define to 1 if <ncursesw.h> is present */
|
||||
#undef HAVE_NCURSESW_H
|
||||
|
||||
/* Define to 1 if <ncurses/curses.h> is present */
|
||||
#undef HAVE_NCURSES_CURSES_H
|
||||
|
||||
/* Define to 1 if <ncurses.h> is present */
|
||||
#undef HAVE_NCURSES_H
|
||||
|
||||
/* Define to 1 if you have the <ncurses/ncurses.h> header file. */
|
||||
#undef HAVE_NCURSES_NCURSES_H
|
||||
|
||||
/* Define to 1 if you have the <ndir.h> header file, and it defines `DIR'. */
|
||||
#undef HAVE_NDIR_H
|
||||
|
||||
/* Define to 1 if you have the <netdb.h> header file. */
|
||||
#undef HAVE_NETDB_H
|
||||
|
||||
/* Define to 1 if you have the <netinet6/in6.h> header file. */
|
||||
#undef HAVE_NETINET6_IN6_H
|
||||
|
||||
/* Define to 1 if you have the <netinet/in.h> header file. */
|
||||
#undef HAVE_NETINET_IN_H
|
||||
|
||||
/* Define to 1 if you have the `pow' function. */
|
||||
#undef HAVE_POW
|
||||
|
||||
/* have redrawwin */
|
||||
#undef HAVE_REDRAWWIN
|
||||
|
||||
/* Define to 1 if you have the `socket' function. */
|
||||
#undef HAVE_SOCKET
|
||||
|
||||
/* Define to 1 if you have the <stdint.h> header file. */
|
||||
#undef HAVE_STDINT_H
|
||||
|
||||
/* Define to 1 if you have the <stdlib.h> header file. */
|
||||
#undef HAVE_STDLIB_H
|
||||
|
||||
/* Define to 1 if you have the `strcasecmp' function. */
|
||||
#undef HAVE_STRCASECMP
|
||||
|
||||
/* Define to 1 if you have the `strchr' function. */
|
||||
#undef HAVE_STRCHR
|
||||
|
||||
/* Define to 1 if you have the `strdup' function. */
|
||||
#undef HAVE_STRDUP
|
||||
|
||||
/* Define to 1 if you have the `strerror' function. */
|
||||
#undef HAVE_STRERROR
|
||||
|
||||
/* Define to 1 if you have the <strings.h> header file. */
|
||||
#undef HAVE_STRINGS_H
|
||||
|
||||
/* Define to 1 if you have the <string.h> header file. */
|
||||
#undef HAVE_STRING_H
|
||||
|
||||
/* Define to 1 if you have the `strncasecmp' function. */
|
||||
#undef HAVE_STRNCASECMP
|
||||
|
||||
/* Define to 1 if you have the `strstr' function. */
|
||||
#undef HAVE_STRSTR
|
||||
|
||||
/* Define to 1 if you have the `strtol' function. */
|
||||
#undef HAVE_STRTOL
|
||||
|
||||
/* Define to 1 if the system has the type `suseconds_t'. */
|
||||
#undef HAVE_SUSECONDS_T
|
||||
|
||||
/* Define to 1 if you have the <sysctl/ioctl.h> header file. */
|
||||
#undef HAVE_SYSCTL_IOCTL_H
|
||||
|
||||
/* Define to 1 if you have the <sys/dir.h> header file, and it defines `DIR'.
|
||||
*/
|
||||
#undef HAVE_SYS_DIR_H
|
||||
|
||||
/* Define to 1 if you have the <sys/ndir.h> header file, and it defines `DIR'.
|
||||
*/
|
||||
#undef HAVE_SYS_NDIR_H
|
||||
|
||||
/* Define to 1 if you have the <sys/param.h> header file. */
|
||||
#undef HAVE_SYS_PARAM_H
|
||||
|
||||
/* Define to 1 if you have the <sys/socket.h> header file. */
|
||||
#undef HAVE_SYS_SOCKET_H
|
||||
|
||||
/* Define to 1 if you have the <sys/sockio.h> header file. */
|
||||
#undef HAVE_SYS_SOCKIO_H
|
||||
|
||||
/* Define to 1 if you have the <sys/stat.h> header file. */
|
||||
#undef HAVE_SYS_STAT_H
|
||||
|
||||
/* Define to 1 if you have the <sys/types.h> header file. */
|
||||
#undef HAVE_SYS_TYPES_H
|
||||
|
||||
/* Define to 1 if you have the <sys/utsname.h> header file. */
|
||||
#undef HAVE_SYS_UTSNAME_H
|
||||
|
||||
/* Define to 1 if you have the `uname' function. */
|
||||
#undef HAVE_UNAME
|
||||
|
||||
/* Define to 1 if you have the <unistd.h> header file. */
|
||||
#undef HAVE_UNISTD_H
|
||||
|
||||
/* have udc */
|
||||
#undef HAVE_USE_DEFAULT_COLORS
|
||||
|
||||
/* Define to 1 if you have the `vfork' function. */
|
||||
#undef HAVE_VFORK
|
||||
|
||||
/* Define to 1 if you have the <vfork.h> header file. */
|
||||
#undef HAVE_VFORK_H
|
||||
|
||||
/* Define to 1 if `fork' works. */
|
||||
#undef HAVE_WORKING_FORK
|
||||
|
||||
/* Define to 1 if `vfork' works. */
|
||||
#undef HAVE_WORKING_VFORK
|
||||
|
||||
/* Name of package */
|
||||
#undef PACKAGE
|
||||
|
||||
/* Define to the address where bug reports for this package should be sent. */
|
||||
#undef PACKAGE_BUGREPORT
|
||||
|
||||
/* Define to the full name of this package. */
|
||||
#undef PACKAGE_NAME
|
||||
|
||||
/* Define to the full name and version of this package. */
|
||||
#undef PACKAGE_STRING
|
||||
|
||||
/* Define to the one symbol short name of this package. */
|
||||
#undef PACKAGE_TARNAME
|
||||
|
||||
/* Define to the home page for this package. */
|
||||
#undef PACKAGE_URL
|
||||
|
||||
/* Define to the version of this package. */
|
||||
#undef PACKAGE_VERSION
|
||||
|
||||
/* Define as the return type of signal handlers (`int' or `void'). */
|
||||
#undef RETSIGTYPE
|
||||
|
||||
/* Define to 1 if you have the ANSI C header files. */
|
||||
#undef STDC_HEADERS
|
||||
|
||||
/* operating system */
|
||||
#undef SYS_BSD
|
||||
|
||||
/* operating system */
|
||||
#undef SYS_LINUX
|
||||
|
||||
/* operating system */
|
||||
#undef SYS_OTHER
|
||||
|
||||
/* operating system */
|
||||
#undef SYS_SUNOS
|
||||
|
||||
/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */
|
||||
#undef TIME_WITH_SYS_TIME
|
||||
|
||||
/* Version number of package */
|
||||
#undef VERSION
|
||||
|
||||
/* Define to empty if `const' does not conform to ANSI C. */
|
||||
#undef const
|
||||
|
||||
/* Define to `__inline__' or `__inline' if that's what the C compiler
|
||||
calls it, or to nothing if 'inline' is not supported under any name. */
|
||||
#ifndef __cplusplus
|
||||
#undef inline
|
||||
#endif
|
||||
|
||||
/* Define to `int' if <sys/types.h> does not define. */
|
||||
#undef pid_t
|
||||
|
||||
/* Define to `unsigned int' if <sys/types.h> does not define. */
|
||||
#undef size_t
|
||||
|
||||
/* Define as `fork' if `vfork' does not work. */
|
||||
#undef vfork
|
@ -1,130 +0,0 @@
|
||||
/*
|
||||
* bmon/element.h Elements
|
||||
*
|
||||
* Copyright (c) 2001-2013 Thomas Graf <tgraf@suug.ch>
|
||||
* Copyright (c) 2013 Red Hat, Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included
|
||||
* in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef __BMON_ELEMENT_H_
|
||||
#define __BMON_ELEMENT_H_
|
||||
|
||||
#include <bmon/bmon.h>
|
||||
#include <bmon/group.h>
|
||||
#include <bmon/attr.h>
|
||||
|
||||
#define MAX_GRAPHS 32
|
||||
#define IFNAME_MAX 32
|
||||
|
||||
struct policy
|
||||
{
|
||||
char * p_rule;
|
||||
struct list_head p_list;
|
||||
};
|
||||
|
||||
struct element_cfg;
|
||||
|
||||
struct info
|
||||
{
|
||||
char * i_name;
|
||||
char * i_value;
|
||||
struct list_head i_list;
|
||||
};
|
||||
|
||||
struct element
|
||||
{
|
||||
char * e_name;
|
||||
char * e_description;
|
||||
uint32_t e_id;
|
||||
uint32_t e_flags;
|
||||
unsigned int e_lifecycles;
|
||||
unsigned int e_level; /* recursion level */
|
||||
|
||||
struct element * e_parent;
|
||||
struct element_group * e_group;
|
||||
|
||||
struct list_head e_list;
|
||||
struct list_head e_childs;
|
||||
|
||||
unsigned int e_nattrs;
|
||||
struct list_head e_attrhash[ATTR_HASH_SIZE];
|
||||
struct list_head e_attr_sorted;
|
||||
|
||||
unsigned int e_ninfo;
|
||||
struct list_head e_info_list;
|
||||
|
||||
struct attr_def * e_key_attr[__GT_MAX];
|
||||
struct attr_def * e_usage_attr;
|
||||
|
||||
float e_rx_usage,
|
||||
e_tx_usage;
|
||||
|
||||
struct element_cfg * e_cfg;
|
||||
|
||||
struct attr * e_current_attr;
|
||||
};
|
||||
|
||||
#define ELEMENT_CREAT (1 << 0)
|
||||
|
||||
extern struct element * element_lookup(struct element_group *,
|
||||
const char *, uint32_t,
|
||||
struct element *, int);
|
||||
|
||||
extern void element_free(struct element *);
|
||||
|
||||
extern void element_reset_update_flag(struct element_group *,
|
||||
struct element *,
|
||||
void *);
|
||||
extern void element_notify_update(struct element *,
|
||||
timestamp_t *);
|
||||
extern void element_lifesign(struct element *, int);
|
||||
extern void element_check_if_dead(struct element_group *,
|
||||
struct element *, void *);
|
||||
|
||||
extern int element_set_key_attr(struct element *, const char *, const char *);
|
||||
extern int element_set_usage_attr(struct element *, const char *);
|
||||
|
||||
#define ELEMENT_FLAG_FOLDED (1 << 0)
|
||||
#define ELEMENT_FLAG_UPDATED (1 << 1)
|
||||
#define ELEMENT_FLAG_EXCLUDE (1 << 2)
|
||||
#define ELEMENT_FLAG_CREATED (1 << 3)
|
||||
|
||||
extern void element_foreach_attr(struct element *,
|
||||
void (*cb)(struct element *,
|
||||
struct attr *, void *),
|
||||
void *);
|
||||
|
||||
extern struct element * element_current(void);
|
||||
extern struct element * element_select_first(void);
|
||||
extern struct element * element_select_last(void);
|
||||
extern struct element * element_select_next(void);
|
||||
extern struct element * element_select_prev(void);
|
||||
|
||||
extern int element_allowed(const char *, struct element_cfg *);
|
||||
extern void element_parse_policy(const char *);
|
||||
|
||||
extern void element_update_info(struct element *,
|
||||
const char *,
|
||||
const char *);
|
||||
|
||||
extern void element_set_txmax(struct element *, uint64_t);
|
||||
extern void element_set_rxmax(struct element *, uint64_t);
|
||||
|
||||
#endif
|
@ -1,53 +0,0 @@
|
||||
/*
|
||||
* element_cfg.h Element Configuration
|
||||
*
|
||||
* Copyright (c) 2001-2013 Thomas Graf <tgraf@suug.ch>
|
||||
* Copyright (c) 2013 Red Hat, Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included
|
||||
* in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef __BMON_ELEMENT_CFG_H_
|
||||
#define __BMON_ELEMENT_CFG_H_
|
||||
|
||||
#include <bmon/bmon.h>
|
||||
#include <bmon/conf.h>
|
||||
|
||||
#define ELEMENT_CFG_SHOW (1 << 0)
|
||||
#define ELEMENT_CFG_HIDE (1 << 1)
|
||||
|
||||
struct element_cfg
|
||||
{
|
||||
char * ec_name; /* Name of element config */
|
||||
char * ec_parent; /* Name of parent */
|
||||
char * ec_description; /* Human readable description */
|
||||
uint64_t ec_rxmax; /* Maximum RX value expected */
|
||||
uint64_t ec_txmax; /* Minimum TX value expected */
|
||||
unsigned int ec_flags; /* Flags */
|
||||
|
||||
struct list_head ec_list; /* Internal, do not modify */
|
||||
int ec_refcnt; /* Internal, do not modify */
|
||||
};
|
||||
|
||||
extern struct element_cfg * element_cfg_alloc(const char *);
|
||||
extern struct element_cfg * element_cfg_create(const char *);
|
||||
extern void element_cfg_free(struct element_cfg *);
|
||||
extern struct element_cfg * element_cfg_lookup(const char *);
|
||||
|
||||
#endif
|
@ -1,72 +0,0 @@
|
||||
/*
|
||||
* bmon/graph.h Graph creation utility
|
||||
*
|
||||
* Copyright (c) 2001-2013 Thomas Graf <tgraf@suug.ch>
|
||||
* Copyright (c) 2013 Red Hat, Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included
|
||||
* in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef __BMON_GRAPH_H_
|
||||
#define __BMON_GRAPH_H_
|
||||
|
||||
#include <bmon/bmon.h>
|
||||
#include <bmon/unit.h>
|
||||
|
||||
struct history;
|
||||
|
||||
struct graph_cfg {
|
||||
int gc_height,
|
||||
gc_width,
|
||||
gc_flags;
|
||||
|
||||
char gc_background,
|
||||
gc_foreground,
|
||||
gc_noise,
|
||||
gc_unknown;
|
||||
|
||||
struct unit * gc_unit;
|
||||
};
|
||||
|
||||
struct graph_table {
|
||||
char * gt_table;
|
||||
char * gt_y_unit;
|
||||
float * gt_scale;
|
||||
};
|
||||
|
||||
struct graph {
|
||||
struct graph_cfg g_cfg;
|
||||
struct graph_table g_rx,
|
||||
g_tx;
|
||||
|
||||
struct list_head g_list;
|
||||
};
|
||||
|
||||
extern void graph_free(struct graph *);
|
||||
extern struct graph * graph_alloc(struct history *, struct graph_cfg *);
|
||||
extern void graph_refill(struct graph *, struct history *);
|
||||
|
||||
extern size_t graph_row_size(struct graph_cfg *);
|
||||
|
||||
extern void new_graph(void);
|
||||
extern void del_graph(void);
|
||||
extern int next_graph(void);
|
||||
extern int prev_graph(void);
|
||||
|
||||
#endif
|
@ -1,100 +0,0 @@
|
||||
/*
|
||||
* bmon/group.h Group Management
|
||||
*
|
||||
* Copyright (c) 2001-2013 Thomas Graf <tgraf@suug.ch>
|
||||
* Copyright (c) 2013 Red Hat, Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included
|
||||
* in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef __BMON_GROUP_H_
|
||||
#define __BMON_GROUP_H_
|
||||
|
||||
#include <bmon/bmon.h>
|
||||
|
||||
struct element;
|
||||
|
||||
enum {
|
||||
GT_MAJOR,
|
||||
GT_MINOR,
|
||||
__GT_MAX,
|
||||
};
|
||||
|
||||
#define GT_MAX (__GT_MAX - 1)
|
||||
|
||||
#define GROUP_COL_MAX (__GT_MAX * 2)
|
||||
|
||||
struct group_hdr
|
||||
{
|
||||
char * gh_name;
|
||||
char * gh_title;
|
||||
char * gh_column[GROUP_COL_MAX];
|
||||
struct list_head gh_list;
|
||||
};
|
||||
|
||||
extern struct group_hdr * group_lookup_hdr(const char *);
|
||||
extern int group_new_hdr(const char *, const char *,
|
||||
const char *, const char *,
|
||||
const char *, const char *);
|
||||
extern int group_new_derived_hdr(const char *,
|
||||
const char *,
|
||||
const char *);
|
||||
|
||||
struct element_group
|
||||
{
|
||||
char * g_name;
|
||||
struct group_hdr * g_hdr;
|
||||
|
||||
struct list_head g_elements;
|
||||
unsigned int g_nelements;
|
||||
|
||||
/* Currently selected element in this group */
|
||||
struct element * g_current;
|
||||
|
||||
struct list_head g_list;
|
||||
};
|
||||
|
||||
#define GROUP_CREATE 1
|
||||
|
||||
extern struct element_group * group_lookup(const char *, int);
|
||||
extern void reset_update_flags(void);
|
||||
extern void free_unused_elements(void);
|
||||
extern void calc_rates(void);
|
||||
|
||||
extern void group_foreach(
|
||||
void (*cb)(struct element_group *,
|
||||
void *),
|
||||
void *);
|
||||
extern void group_foreach_recursive(
|
||||
void (*cb)(struct element_group *,
|
||||
struct element *, void *),
|
||||
void *);
|
||||
|
||||
extern void group_foreach_element(struct element_group *,
|
||||
void (*cb)(struct element_group *,
|
||||
struct element *, void *),
|
||||
void *);
|
||||
|
||||
extern struct element_group * group_current(void);
|
||||
extern struct element_group * group_select_first(void);
|
||||
extern struct element_group * group_select_last(void);
|
||||
extern struct element_group * group_select_next(void);
|
||||
extern struct element_group * group_select_prev(void);
|
||||
|
||||
#endif
|
@ -1,93 +0,0 @@
|
||||
/*
|
||||
* bmon/history.h History Management
|
||||
*
|
||||
* Copyright (c) 2001-2013 Thomas Graf <tgraf@suug.ch>
|
||||
* Copyright (c) 2013 Red Hat, Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included
|
||||
* in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef __BMON_HISTORY_H_
|
||||
#define __BMON_HISTORY_H_
|
||||
|
||||
#include <bmon/bmon.h>
|
||||
#include <bmon/attr.h>
|
||||
|
||||
#define HISTORY_UNKNOWN ((uint64_t) -1)
|
||||
#define HBEAT_TRIGGER 60.0f
|
||||
|
||||
enum {
|
||||
HISTORY_TYPE_8 = 1,
|
||||
HISTORY_TYPE_16 = 2,
|
||||
HISTORY_TYPE_32 = 4,
|
||||
HISTORY_TYPE_64 = 8,
|
||||
};
|
||||
|
||||
struct history_def
|
||||
{
|
||||
char * hd_name;
|
||||
int hd_size,
|
||||
hd_type;
|
||||
float hd_interval;
|
||||
|
||||
struct list_head hd_list;
|
||||
};
|
||||
|
||||
struct history_store
|
||||
{
|
||||
/* TODO? store error ratio? */
|
||||
void * hs_data;
|
||||
uint64_t hs_prev_total;
|
||||
};
|
||||
|
||||
struct history
|
||||
{
|
||||
/* index to current entry in data array */
|
||||
int h_index;
|
||||
struct history_def * h_definition;
|
||||
/* time of last history update */
|
||||
timestamp_t h_last_update;
|
||||
struct list_head h_list;
|
||||
|
||||
float h_min_interval,
|
||||
h_max_interval;
|
||||
|
||||
struct history_store h_rx,
|
||||
h_tx;
|
||||
|
||||
};
|
||||
|
||||
extern struct history_def * history_def_lookup(const char *);
|
||||
extern struct history_def * history_def_alloc(const char *);
|
||||
|
||||
extern uint64_t history_data(struct history *,
|
||||
struct history_store *, int);
|
||||
extern void history_update(struct attr *,
|
||||
struct history *, timestamp_t *);
|
||||
extern struct history * history_alloc(struct history_def *);
|
||||
extern void history_free(struct history *);
|
||||
extern void history_attach(struct attr *);
|
||||
|
||||
extern struct history_def * history_select_first(void);
|
||||
extern struct history_def * history_select_last(void);
|
||||
extern struct history_def * history_select_next(void);
|
||||
extern struct history_def * history_select_prev(void);
|
||||
extern struct history_def * history_current(void);
|
||||
|
||||
#endif
|
@ -1,42 +0,0 @@
|
||||
/*
|
||||
* bmon/info.h Info Attributes
|
||||
*
|
||||
* Copyright (c) 2001-2013 Thomas Graf <tgraf@suug.ch>
|
||||
* Copyright (c) 2013 Red Hat, Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included
|
||||
* in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef __BMON_INFO_H_
|
||||
#define __BMON_INFO_H_
|
||||
|
||||
#include <bmon/bmon.h>
|
||||
#include <bmon/unit.h>
|
||||
|
||||
struct element;
|
||||
|
||||
struct info
|
||||
{
|
||||
char * i_name;
|
||||
char * i_value;
|
||||
|
||||
struct list_head i_list;
|
||||
};
|
||||
|
||||
#endif
|
@ -1,52 +0,0 @@
|
||||
/*
|
||||
* input.h Input API
|
||||
*
|
||||
* Copyright (c) 2001-2013 Thomas Graf <tgraf@suug.ch>
|
||||
* Copyright (c) 2013 Red Hat, Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included
|
||||
* in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef __BMON_INPUT_H_
|
||||
#define __BMON_INPUT_H_
|
||||
|
||||
#include <bmon/bmon.h>
|
||||
#include <bmon/conf.h>
|
||||
#include <bmon/module.h>
|
||||
|
||||
extern int input_set(const char *);
|
||||
extern void input_register(struct bmon_module *);
|
||||
extern void input_read(void);
|
||||
|
||||
struct reader_timing
|
||||
{
|
||||
timestamp_t rt_last_read; /* timestamp taken before read */
|
||||
timestamp_t rt_next_read; /* estimated next read */
|
||||
|
||||
struct {
|
||||
float v_error;
|
||||
float v_max;
|
||||
float v_min;
|
||||
float v_total;
|
||||
} rt_variance;
|
||||
};
|
||||
|
||||
extern struct reader_timing rtiming;
|
||||
|
||||
#endif
|
@ -1,101 +0,0 @@
|
||||
/*
|
||||
* bmon/list.h Kernel List Implementation
|
||||
*
|
||||
* Copied and adapted from the kernel sources
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef BMON_LIST_H_
|
||||
#define BMON_LIST_H_
|
||||
|
||||
#ifdef __APPLE__
|
||||
/* Apple systems define these macros in system headers, so we undef
|
||||
* them prior to inclusion of this file */
|
||||
#undef LIST_HEAD
|
||||
#undef LIST_HEAD_INIT
|
||||
#undef INIT_LIST_HEAD
|
||||
#endif
|
||||
|
||||
struct list_head
|
||||
{
|
||||
struct list_head * next;
|
||||
struct list_head * prev;
|
||||
};
|
||||
|
||||
static inline void INIT_LIST_HEAD(struct list_head *list)
|
||||
{
|
||||
list->next = list;
|
||||
list->prev = list;
|
||||
}
|
||||
|
||||
static inline void __list_add(struct list_head *obj, struct list_head *prev,
|
||||
struct list_head *next)
|
||||
{
|
||||
prev->next = obj;
|
||||
obj->prev = prev;
|
||||
next->prev = obj;
|
||||
obj->next = next;
|
||||
}
|
||||
|
||||
static inline void list_add_tail(struct list_head *obj, struct list_head *head)
|
||||
{
|
||||
__list_add(obj, head->prev, head);
|
||||
}
|
||||
|
||||
static inline void list_add_head(struct list_head *obj, struct list_head *head)
|
||||
{
|
||||
__list_add(obj, head, head->next);
|
||||
}
|
||||
|
||||
static inline void list_del(struct list_head *obj)
|
||||
{
|
||||
obj->next->prev = obj->prev;
|
||||
obj->prev->next = obj->next;
|
||||
}
|
||||
|
||||
static inline int list_empty(struct list_head *head)
|
||||
{
|
||||
return head->next == head;
|
||||
}
|
||||
|
||||
#define container_of(ptr, type, member) ({ \
|
||||
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
|
||||
(type *)( (char *)__mptr - ((size_t) &((type *)0)->member));})
|
||||
|
||||
#define list_entry(ptr, type, member) \
|
||||
container_of(ptr, type, member)
|
||||
|
||||
#define list_at_tail(pos, head, member) \
|
||||
((pos)->member.next == (head))
|
||||
|
||||
#define list_at_head(pos, head, member) \
|
||||
((pos)->member.prev == (head))
|
||||
|
||||
#define LIST_SELF(name) { &(name), &(name) }
|
||||
|
||||
#define LIST_HEAD(name) \
|
||||
struct list_head name = { &(name), &(name) }
|
||||
|
||||
#define list_first_entry(head, type, member) \
|
||||
list_entry((head)->next, type, member)
|
||||
|
||||
#define list_for_each_entry(pos, head, member) \
|
||||
for (pos = list_entry((head)->next, typeof(*pos), member); \
|
||||
&(pos)->member != (head); \
|
||||
(pos) = list_entry((pos)->member.next, typeof(*(pos)), member))
|
||||
|
||||
#define list_for_each_entry_reverse(pos, head, member) \
|
||||
for (pos = list_entry((head)->prev, typeof(*pos), member); \
|
||||
&pos->member != (head); \
|
||||
pos = list_entry(pos->member.prev, typeof(*pos), member))
|
||||
|
||||
#define list_for_each_entry_safe(pos, n, head, member) \
|
||||
for (pos = list_entry((head)->next, typeof(*pos), member), \
|
||||
n = list_entry(pos->member.next, typeof(*pos), member); \
|
||||
&(pos)->member != (head); \
|
||||
pos = n, n = list_entry(n->member.next, typeof(*n), member))
|
||||
|
||||
#define init_list_head(head) \
|
||||
do { (head)->next = (head); (head)->prev = (head); } while (0)
|
||||
|
||||
#endif
|
@ -1,79 +0,0 @@
|
||||
/*
|
||||
* module.h Module API
|
||||
*
|
||||
* Copyright (c) 2001-2013 Thomas Graf <tgraf@suug.ch>
|
||||
* Copyright 2013 Red Hat, Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included
|
||||
* in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef __BMON_MODULE_H_
|
||||
#define __BMON_MODULE_H_
|
||||
|
||||
#include <bmon/bmon.h>
|
||||
#include <bmon/conf.h>
|
||||
|
||||
#define BMON_MODULE_ENABLED (1 << 0) /* Enabled */
|
||||
#define BMON_MODULE_DEFAULT (1 << 1) /* Suitable as default */
|
||||
#define BMON_MODULE_AUTO (1 << 2) /* Auto enable */
|
||||
|
||||
struct bmon_subsys;
|
||||
|
||||
struct bmon_module
|
||||
{
|
||||
char * m_name;
|
||||
|
||||
int (*m_init)(void);
|
||||
int (*m_probe)(void);
|
||||
void (*m_shutdown)(void);
|
||||
|
||||
void (*m_parse_opt)(const char *, const char *);
|
||||
|
||||
void (*m_pre)(void);
|
||||
void (*m_do)(void);
|
||||
void (*m_post)(void);
|
||||
|
||||
int m_flags;
|
||||
struct list_head m_list;
|
||||
struct bmon_subsys *m_subsys;
|
||||
};
|
||||
|
||||
struct bmon_subsys
|
||||
{
|
||||
char * s_name;
|
||||
int s_nmod;
|
||||
struct list_head s_mod_list;
|
||||
|
||||
void (*s_activate_default)(void);
|
||||
|
||||
struct list_head s_list;
|
||||
};
|
||||
|
||||
extern void module_foreach_run_enabled_pre(struct bmon_subsys *);
|
||||
extern void module_foreach_run_enabled(struct bmon_subsys *);
|
||||
extern void module_foreach_run_enabled_post(struct bmon_subsys *);
|
||||
|
||||
extern int module_register(struct bmon_subsys *, struct bmon_module *);
|
||||
extern int module_set(struct bmon_subsys *, const char *);
|
||||
|
||||
extern void module_init(void);
|
||||
extern void module_shutdown(void);
|
||||
extern void module_register_subsys(struct bmon_subsys *);
|
||||
|
||||
#endif
|
@ -1,39 +0,0 @@
|
||||
/*
|
||||
* output.h Output API
|
||||
*
|
||||
* Copyright (c) 2001-2013 Thomas Graf <tgraf@suug.ch>
|
||||
* Copyright (c) 2013 Red Hat, Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included
|
||||
* in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef __BMON_OUTPUT_H_
|
||||
#define __BMON_OUTPUT_H_
|
||||
|
||||
#include <bmon/bmon.h>
|
||||
#include <bmon/conf.h>
|
||||
#include <bmon/module.h>
|
||||
|
||||
extern void output_register(struct bmon_module *);
|
||||
extern int output_set(const char *);
|
||||
extern void output_pre(void);
|
||||
extern void output_draw(void);
|
||||
extern void output_post(void);
|
||||
|
||||
#endif
|
@ -1,69 +0,0 @@
|
||||
/*
|
||||
* bmon/unit.h Units
|
||||
*
|
||||
* Copyright (c) 2001-2013 Thomas Graf <tgraf@suug.ch>
|
||||
* Copyright (c) 2013 Red Hat, Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included
|
||||
* in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef __BMON_UNIT_H_
|
||||
#define __BMON_UNIT_H_
|
||||
|
||||
#include <bmon/bmon.h>
|
||||
|
||||
#define DYNAMIC_EXP (-1)
|
||||
|
||||
enum {
|
||||
UNIT_DEFAULT,
|
||||
UNIT_SI,
|
||||
UNIT_BIT,
|
||||
__UNIT_MAX,
|
||||
};
|
||||
|
||||
#define UNIT_MAX (__UNIT_MAX - 1)
|
||||
|
||||
#define UNIT_BYTE "byte"
|
||||
#define UNIT_NUMBER "number"
|
||||
|
||||
struct fraction {
|
||||
float f_divisor;
|
||||
char * f_name;
|
||||
|
||||
struct list_head f_list;
|
||||
};
|
||||
|
||||
struct unit {
|
||||
char * u_name;
|
||||
struct list_head u_div[__UNIT_MAX];
|
||||
|
||||
struct list_head u_list;
|
||||
};
|
||||
|
||||
extern struct unit * unit_lookup(const char *);
|
||||
extern struct unit * unit_add(const char *name);
|
||||
extern void unit_add_div(struct unit *, int, const char *, float);
|
||||
extern double unit_divisor(uint64_t, struct unit *, char **, int *);
|
||||
extern double unit_value2str(uint64_t, struct unit *, char **, int *);
|
||||
extern void fraction_free(struct fraction *);
|
||||
|
||||
extern char * unit_bytes2str(uint64_t, char *, size_t);
|
||||
extern char * unit_bit2str(uint64_t, char *, size_t);
|
||||
|
||||
#endif
|
@ -1,102 +0,0 @@
|
||||
/*
|
||||
* utils.h General purpose utilities
|
||||
*
|
||||
* Copyright (c) 2001-2013 Thomas Graf <tgraf@suug.ch>
|
||||
* Copyright (c) 2013 Red Hat, Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included
|
||||
* in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef __BMON_UTILS_H_
|
||||
#define __BMON_UTILS_H_
|
||||
|
||||
#include <bmon/bmon.h>
|
||||
|
||||
extern void * xcalloc(size_t, size_t);
|
||||
extern void * xrealloc(void *, size_t);
|
||||
extern void xfree(void *);
|
||||
extern void quit (const char *, ...);
|
||||
|
||||
extern float timestamp_to_float(timestamp_t *);
|
||||
extern int64_t timestamp_to_int(timestamp_t *);
|
||||
|
||||
extern void float_to_timestamp(timestamp_t *, float);
|
||||
extern void int_to_timestamp(timestamp_t *, int);
|
||||
|
||||
extern void timestamp_add(timestamp_t *, timestamp_t *, timestamp_t *);
|
||||
extern void timestamp_sub(timestamp_t *, timestamp_t *, timestamp_t *);
|
||||
|
||||
extern int timestamp_le(timestamp_t *, timestamp_t *);
|
||||
extern int timestamp_is_negative(timestamp_t *ts);
|
||||
|
||||
extern void update_timestamp(timestamp_t *);
|
||||
extern void copy_timestamp(timestamp_t *, timestamp_t *);
|
||||
|
||||
extern float timestamp_diff(timestamp_t *, timestamp_t *);
|
||||
|
||||
#if 0
|
||||
|
||||
|
||||
|
||||
#if __BYTE_ORDER == __BIG_ENDIAN
|
||||
#define xntohll(N) (N)
|
||||
#define xhtonll(N) (N)
|
||||
#else
|
||||
#define xntohll(N) ((((uint64_t) ntohl(N)) << 32) + ntohl((N) >> 32))
|
||||
#define xhtonll(N) ((((uint64_t) htonl(N)) << 32) + htonl((N) >> 32))
|
||||
#endif
|
||||
|
||||
enum {
|
||||
U_NUMBER,
|
||||
U_BYTES,
|
||||
U_BITS
|
||||
};
|
||||
|
||||
extern float read_delta;
|
||||
|
||||
|
||||
const char * xinet_ntop(struct sockaddr *, char *, socklen_t);
|
||||
|
||||
|
||||
extern float time_diff(timestamp_t *, timestamp_t *);
|
||||
extern float diff_now(timestamp_t *);
|
||||
|
||||
extern uint64_t parse_size(const char *);
|
||||
|
||||
extern int parse_date(const char *str, xdate_t *dst);
|
||||
|
||||
#ifndef HAVE_STRDUP
|
||||
extern char *strdup(const char *);
|
||||
#endif
|
||||
|
||||
extern char * timestamp2str(timestamp_t *ts, char *buf, size_t len);
|
||||
|
||||
static inline char *xstrncat(char *dest, const char *src, size_t n)
|
||||
{
|
||||
return strncat(dest, src, n - strlen(dest) - 1);
|
||||
}
|
||||
|
||||
static inline void xdate_to_ts(timestamp_t *dst, xdate_t *src)
|
||||
{
|
||||
dst->tv_sec = mktime(&src->d_tm);
|
||||
dst->tv_usec = src->d_usec;
|
||||
};
|
||||
#endif
|
||||
|
||||
#endif
|
54
index.html
Normal file
@ -0,0 +1,54 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="chrome=1">
|
||||
<title>Bmon - bandwidth monitor and rate estimator</title>
|
||||
<link rel="stylesheet" href="stylesheets/styles.css">
|
||||
<link rel="stylesheet" href="stylesheets/pygment_trac.css">
|
||||
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
|
||||
<script src="javascripts/respond.js"></script>
|
||||
<!--[if lt IE 9]>
|
||||
<script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
|
||||
<![endif]-->
|
||||
<!--[if lt IE 8]>
|
||||
<link rel="stylesheet" href="stylesheets/ie.css">
|
||||
<![endif]-->
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<div id="header">
|
||||
<nav>
|
||||
<li class="fork"><a href="https://github.com/tgraf/bmon">View On GitHub</a></li>
|
||||
<li class="downloads"><a href="https://github.com/tgraf/bmon/zipball/master">ZIP</a></li>
|
||||
<li class="downloads"><a href="https://github.com/tgraf/bmon/tarball/master">TAR</a></li>
|
||||
<li class="title">DOWNLOADS</li>
|
||||
</nav>
|
||||
</div><!-- end header -->
|
||||
|
||||
<div class="wrapper">
|
||||
|
||||
<section>
|
||||
<div id="title">
|
||||
<h1>Bmon</h1>
|
||||
<p>bandwidth monitor and rate estimator</p>
|
||||
<hr>
|
||||
<span class="credits left">Project maintained by <a href="https://github.com/tgraf">tgraf</a></span>
|
||||
<span class="credits right">Hosted on GitHub Pages — Theme by <a href="https://twitter.com/michigangraham">mattgraham</a></span>
|
||||
</div>
|
||||
|
||||
<h1>
|
||||
<a name="bmon" class="anchor" href="#bmon"><span class="octicon octicon-link"></span></a>bmon</h1>
|
||||
|
||||
<p>bmon is a monitoring and debugging tool to capture networking related
|
||||
statistics and prepare them visually in a human friendly way. It
|
||||
features various output methods including an interactive curses user
|
||||
interface and a programmable text output for scripting.</p>
|
||||
</section>
|
||||
|
||||
</div>
|
||||
<!--[if !IE]><script>fixScale(document);</script><![endif]-->
|
||||
|
||||
</body>
|
||||
</html>
|
779
javascripts/respond.js
Normal file
@ -0,0 +1,779 @@
|
||||
if(typeof Object.create!=="function"){
|
||||
Object.create=function(o){
|
||||
function F(){
|
||||
};
|
||||
F.prototype=o;
|
||||
return new F();
|
||||
};
|
||||
}
|
||||
var ua={toString:function(){
|
||||
return navigator.userAgent;
|
||||
},test:function(s){
|
||||
return this.toString().toLowerCase().indexOf(s.toLowerCase())>-1;
|
||||
}};
|
||||
ua.version=(ua.toString().toLowerCase().match(/[\s\S]+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[])[1];
|
||||
ua.webkit=ua.test("webkit");
|
||||
ua.gecko=ua.test("gecko")&&!ua.webkit;
|
||||
ua.opera=ua.test("opera");
|
||||
ua.ie=ua.test("msie")&&!ua.opera;
|
||||
ua.ie6=ua.ie&&document.compatMode&&typeof document.documentElement.style.maxHeight==="undefined";
|
||||
ua.ie7=ua.ie&&document.documentElement&&typeof document.documentElement.style.maxHeight!=="undefined"&&typeof XDomainRequest==="undefined";
|
||||
ua.ie8=ua.ie&&typeof XDomainRequest!=="undefined";
|
||||
var domReady=function(){
|
||||
var _1=[];
|
||||
var _2=function(){
|
||||
if(!arguments.callee.done){
|
||||
arguments.callee.done=true;
|
||||
for(var i=0;i<_1.length;i++){
|
||||
_1[i]();
|
||||
}
|
||||
}
|
||||
};
|
||||
if(document.addEventListener){
|
||||
document.addEventListener("DOMContentLoaded",_2,false);
|
||||
}
|
||||
if(ua.ie){
|
||||
(function(){
|
||||
try{
|
||||
document.documentElement.doScroll("left");
|
||||
}
|
||||
catch(e){
|
||||
setTimeout(arguments.callee,50);
|
||||
return;
|
||||
}
|
||||
_2();
|
||||
})();
|
||||
document.onreadystatechange=function(){
|
||||
if(document.readyState==="complete"){
|
||||
document.onreadystatechange=null;
|
||||
_2();
|
||||
}
|
||||
};
|
||||
}
|
||||
if(ua.webkit&&document.readyState){
|
||||
(function(){
|
||||
if(document.readyState!=="loading"){
|
||||
_2();
|
||||
}else{
|
||||
setTimeout(arguments.callee,10);
|
||||
}
|
||||
})();
|
||||
}
|
||||
window.onload=_2;
|
||||
return function(fn){
|
||||
if(typeof fn==="function"){
|
||||
_1[_1.length]=fn;
|
||||
}
|
||||
return fn;
|
||||
};
|
||||
}();
|
||||
var cssHelper=function(){
|
||||
var _3={BLOCKS:/[^\s{][^{]*\{(?:[^{}]*\{[^{}]*\}[^{}]*|[^{}]*)*\}/g,BLOCKS_INSIDE:/[^\s{][^{]*\{[^{}]*\}/g,DECLARATIONS:/[a-zA-Z\-]+[^;]*:[^;]+;/g,RELATIVE_URLS:/url\(['"]?([^\/\)'"][^:\)'"]+)['"]?\)/g,REDUNDANT_COMPONENTS:/(?:\/\*([^*\\\\]|\*(?!\/))+\*\/|@import[^;]+;)/g,REDUNDANT_WHITESPACE:/\s*(,|:|;|\{|\})\s*/g,MORE_WHITESPACE:/\s{2,}/g,FINAL_SEMICOLONS:/;\}/g,NOT_WHITESPACE:/\S+/g};
|
||||
var _4,_5=false;
|
||||
var _6=[];
|
||||
var _7=function(fn){
|
||||
if(typeof fn==="function"){
|
||||
_6[_6.length]=fn;
|
||||
}
|
||||
};
|
||||
var _8=function(){
|
||||
for(var i=0;i<_6.length;i++){
|
||||
_6[i](_4);
|
||||
}
|
||||
};
|
||||
var _9={};
|
||||
var _a=function(n,v){
|
||||
if(_9[n]){
|
||||
var _b=_9[n].listeners;
|
||||
if(_b){
|
||||
for(var i=0;i<_b.length;i++){
|
||||
_b[i](v);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
var _c=function(_d,_e,_f){
|
||||
if(ua.ie&&!window.XMLHttpRequest){
|
||||
window.XMLHttpRequest=function(){
|
||||
return new ActiveXObject("Microsoft.XMLHTTP");
|
||||
};
|
||||
}
|
||||
if(!XMLHttpRequest){
|
||||
return "";
|
||||
}
|
||||
var r=new XMLHttpRequest();
|
||||
try{
|
||||
r.open("get",_d,true);
|
||||
r.setRequestHeader("X_REQUESTED_WITH","XMLHttpRequest");
|
||||
}
|
||||
catch(e){
|
||||
_f();
|
||||
return;
|
||||
}
|
||||
var _10=false;
|
||||
setTimeout(function(){
|
||||
_10=true;
|
||||
},5000);
|
||||
document.documentElement.style.cursor="progress";
|
||||
r.onreadystatechange=function(){
|
||||
if(r.readyState===4&&!_10){
|
||||
if(!r.status&&location.protocol==="file:"||(r.status>=200&&r.status<300)||r.status===304||navigator.userAgent.indexOf("Safari")>-1&&typeof r.status==="undefined"){
|
||||
_e(r.responseText);
|
||||
}else{
|
||||
_f();
|
||||
}
|
||||
document.documentElement.style.cursor="";
|
||||
r=null;
|
||||
}
|
||||
};
|
||||
r.send("");
|
||||
};
|
||||
var _11=function(_12){
|
||||
_12=_12.replace(_3.REDUNDANT_COMPONENTS,"");
|
||||
_12=_12.replace(_3.REDUNDANT_WHITESPACE,"$1");
|
||||
_12=_12.replace(_3.MORE_WHITESPACE," ");
|
||||
_12=_12.replace(_3.FINAL_SEMICOLONS,"}");
|
||||
return _12;
|
||||
};
|
||||
var _13={mediaQueryList:function(s){
|
||||
var o={};
|
||||
var idx=s.indexOf("{");
|
||||
var lt=s.substring(0,idx);
|
||||
s=s.substring(idx+1,s.length-1);
|
||||
var mqs=[],rs=[];
|
||||
var qts=lt.toLowerCase().substring(7).split(",");
|
||||
for(var i=0;i<qts.length;i++){
|
||||
mqs[mqs.length]=_13.mediaQuery(qts[i],o);
|
||||
}
|
||||
var rts=s.match(_3.BLOCKS_INSIDE);
|
||||
if(rts!==null){
|
||||
for(i=0;i<rts.length;i++){
|
||||
rs[rs.length]=_13.rule(rts[i],o);
|
||||
}
|
||||
}
|
||||
o.getMediaQueries=function(){
|
||||
return mqs;
|
||||
};
|
||||
o.getRules=function(){
|
||||
return rs;
|
||||
};
|
||||
o.getListText=function(){
|
||||
return lt;
|
||||
};
|
||||
o.getCssText=function(){
|
||||
return s;
|
||||
};
|
||||
return o;
|
||||
},mediaQuery:function(s,mql){
|
||||
s=s||"";
|
||||
var not=false,_14;
|
||||
var exp=[];
|
||||
var _15=true;
|
||||
var _16=s.match(_3.NOT_WHITESPACE);
|
||||
for(var i=0;i<_16.length;i++){
|
||||
var _17=_16[i];
|
||||
if(!_14&&(_17==="not"||_17==="only")){
|
||||
if(_17==="not"){
|
||||
not=true;
|
||||
}
|
||||
}else{
|
||||
if(!_14){
|
||||
_14=_17;
|
||||
}else{
|
||||
if(_17.charAt(0)==="("){
|
||||
var _18=_17.substring(1,_17.length-1).split(":");
|
||||
exp[exp.length]={mediaFeature:_18[0],value:_18[1]||null};
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return {getList:function(){
|
||||
return mql||null;
|
||||
},getValid:function(){
|
||||
return _15;
|
||||
},getNot:function(){
|
||||
return not;
|
||||
},getMediaType:function(){
|
||||
return _14;
|
||||
},getExpressions:function(){
|
||||
return exp;
|
||||
}};
|
||||
},rule:function(s,mql){
|
||||
var o={};
|
||||
var idx=s.indexOf("{");
|
||||
var st=s.substring(0,idx);
|
||||
var ss=st.split(",");
|
||||
var ds=[];
|
||||
var dts=s.substring(idx+1,s.length-1).split(";");
|
||||
for(var i=0;i<dts.length;i++){
|
||||
ds[ds.length]=_13.declaration(dts[i],o);
|
||||
}
|
||||
o.getMediaQueryList=function(){
|
||||
return mql||null;
|
||||
};
|
||||
o.getSelectors=function(){
|
||||
return ss;
|
||||
};
|
||||
o.getSelectorText=function(){
|
||||
return st;
|
||||
};
|
||||
o.getDeclarations=function(){
|
||||
return ds;
|
||||
};
|
||||
o.getPropertyValue=function(n){
|
||||
for(var i=0;i<ds.length;i++){
|
||||
if(ds[i].getProperty()===n){
|
||||
return ds[i].getValue();
|
||||
}
|
||||
}
|
||||
return null;
|
||||
};
|
||||
return o;
|
||||
},declaration:function(s,r){
|
||||
var idx=s.indexOf(":");
|
||||
var p=s.substring(0,idx);
|
||||
var v=s.substring(idx+1);
|
||||
return {getRule:function(){
|
||||
return r||null;
|
||||
},getProperty:function(){
|
||||
return p;
|
||||
},getValue:function(){
|
||||
return v;
|
||||
}};
|
||||
}};
|
||||
var _19=function(el){
|
||||
if(typeof el.cssHelperText!=="string"){
|
||||
return;
|
||||
}
|
||||
var o={mediaQueryLists:[],rules:[],selectors:{},declarations:[],properties:{}};
|
||||
var _1a=o.mediaQueryLists;
|
||||
var ors=o.rules;
|
||||
var _1b=el.cssHelperText.match(_3.BLOCKS);
|
||||
if(_1b!==null){
|
||||
for(var i=0;i<_1b.length;i++){
|
||||
if(_1b[i].substring(0,7)==="@media "){
|
||||
_1a[_1a.length]=_13.mediaQueryList(_1b[i]);
|
||||
ors=o.rules=ors.concat(_1a[_1a.length-1].getRules());
|
||||
}else{
|
||||
ors[ors.length]=_13.rule(_1b[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
var oss=o.selectors;
|
||||
var _1c=function(r){
|
||||
var ss=r.getSelectors();
|
||||
for(var i=0;i<ss.length;i++){
|
||||
var n=ss[i];
|
||||
if(!oss[n]){
|
||||
oss[n]=[];
|
||||
}
|
||||
oss[n][oss[n].length]=r;
|
||||
}
|
||||
};
|
||||
for(i=0;i<ors.length;i++){
|
||||
_1c(ors[i]);
|
||||
}
|
||||
var ods=o.declarations;
|
||||
for(i=0;i<ors.length;i++){
|
||||
ods=o.declarations=ods.concat(ors[i].getDeclarations());
|
||||
}
|
||||
var ops=o.properties;
|
||||
for(i=0;i<ods.length;i++){
|
||||
var n=ods[i].getProperty();
|
||||
if(!ops[n]){
|
||||
ops[n]=[];
|
||||
}
|
||||
ops[n][ops[n].length]=ods[i];
|
||||
}
|
||||
el.cssHelperParsed=o;
|
||||
_4[_4.length]=el;
|
||||
return o;
|
||||
};
|
||||
var _1d=function(el,s){
|
||||
el.cssHelperText=_11(s||el.innerHTML);
|
||||
return _19(el);
|
||||
};
|
||||
var _1e=function(){
|
||||
_5=true;
|
||||
_4=[];
|
||||
var _1f=[];
|
||||
var _20=function(){
|
||||
for(var i=0;i<_1f.length;i++){
|
||||
_19(_1f[i]);
|
||||
}
|
||||
var _21=document.getElementsByTagName("style");
|
||||
for(i=0;i<_21.length;i++){
|
||||
_1d(_21[i]);
|
||||
}
|
||||
_5=false;
|
||||
_8();
|
||||
};
|
||||
var _22=document.getElementsByTagName("link");
|
||||
for(var i=0;i<_22.length;i++){
|
||||
var _23=_22[i];
|
||||
if(_23.getAttribute("rel").indexOf("style")>-1&&_23.href&&_23.href.length!==0&&!_23.disabled){
|
||||
_1f[_1f.length]=_23;
|
||||
}
|
||||
}
|
||||
if(_1f.length>0){
|
||||
var c=0;
|
||||
var _24=function(){
|
||||
c++;
|
||||
if(c===_1f.length){
|
||||
_20();
|
||||
}
|
||||
};
|
||||
var _25=function(_26){
|
||||
var _27=_26.href;
|
||||
_c(_27,function(_28){
|
||||
_28=_11(_28).replace(_3.RELATIVE_URLS,"url("+_27.substring(0,_27.lastIndexOf("/"))+"/$1)");
|
||||
_26.cssHelperText=_28;
|
||||
_24();
|
||||
},_24);
|
||||
};
|
||||
for(i=0;i<_1f.length;i++){
|
||||
_25(_1f[i]);
|
||||
}
|
||||
}else{
|
||||
_20();
|
||||
}
|
||||
};
|
||||
var _29={mediaQueryLists:"array",rules:"array",selectors:"object",declarations:"array",properties:"object"};
|
||||
var _2a={mediaQueryLists:null,rules:null,selectors:null,declarations:null,properties:null};
|
||||
var _2b=function(_2c,v){
|
||||
if(_2a[_2c]!==null){
|
||||
if(_29[_2c]==="array"){
|
||||
return (_2a[_2c]=_2a[_2c].concat(v));
|
||||
}else{
|
||||
var c=_2a[_2c];
|
||||
for(var n in v){
|
||||
if(v.hasOwnProperty(n)){
|
||||
if(!c[n]){
|
||||
c[n]=v[n];
|
||||
}else{
|
||||
c[n]=c[n].concat(v[n]);
|
||||
}
|
||||
}
|
||||
}
|
||||
return c;
|
||||
}
|
||||
}
|
||||
};
|
||||
var _2d=function(_2e){
|
||||
_2a[_2e]=(_29[_2e]==="array")?[]:{};
|
||||
for(var i=0;i<_4.length;i++){
|
||||
_2b(_2e,_4[i].cssHelperParsed[_2e]);
|
||||
}
|
||||
return _2a[_2e];
|
||||
};
|
||||
domReady(function(){
|
||||
var els=document.body.getElementsByTagName("*");
|
||||
for(var i=0;i<els.length;i++){
|
||||
els[i].checkedByCssHelper=true;
|
||||
}
|
||||
if(document.implementation.hasFeature("MutationEvents","2.0")||window.MutationEvent){
|
||||
document.body.addEventListener("DOMNodeInserted",function(e){
|
||||
var el=e.target;
|
||||
if(el.nodeType===1){
|
||||
_a("DOMElementInserted",el);
|
||||
el.checkedByCssHelper=true;
|
||||
}
|
||||
},false);
|
||||
}else{
|
||||
setInterval(function(){
|
||||
var els=document.body.getElementsByTagName("*");
|
||||
for(var i=0;i<els.length;i++){
|
||||
if(!els[i].checkedByCssHelper){
|
||||
_a("DOMElementInserted",els[i]);
|
||||
els[i].checkedByCssHelper=true;
|
||||
}
|
||||
}
|
||||
},1000);
|
||||
}
|
||||
});
|
||||
var _2f=function(d){
|
||||
if(typeof window.innerWidth!="undefined"){
|
||||
return window["inner"+d];
|
||||
}else{
|
||||
if(typeof document.documentElement!="undefined"&&typeof document.documentElement.clientWidth!="undefined"&&document.documentElement.clientWidth!=0){
|
||||
return document.documentElement["client"+d];
|
||||
}
|
||||
}
|
||||
};
|
||||
return {addStyle:function(s,_30){
|
||||
var el=document.createElement("style");
|
||||
el.setAttribute("type","text/css");
|
||||
document.getElementsByTagName("head")[0].appendChild(el);
|
||||
if(el.styleSheet){
|
||||
el.styleSheet.cssText=s;
|
||||
}else{
|
||||
el.appendChild(document.createTextNode(s));
|
||||
}
|
||||
el.addedWithCssHelper=true;
|
||||
if(typeof _30==="undefined"||_30===true){
|
||||
cssHelper.parsed(function(_31){
|
||||
var o=_1d(el,s);
|
||||
for(var n in o){
|
||||
if(o.hasOwnProperty(n)){
|
||||
_2b(n,o[n]);
|
||||
}
|
||||
}
|
||||
_a("newStyleParsed",el);
|
||||
});
|
||||
}else{
|
||||
el.parsingDisallowed=true;
|
||||
}
|
||||
return el;
|
||||
},removeStyle:function(el){
|
||||
return el.parentNode.removeChild(el);
|
||||
},parsed:function(fn){
|
||||
if(_5){
|
||||
_7(fn);
|
||||
}else{
|
||||
if(typeof _4!=="undefined"){
|
||||
if(typeof fn==="function"){
|
||||
fn(_4);
|
||||
}
|
||||
}else{
|
||||
_7(fn);
|
||||
_1e();
|
||||
}
|
||||
}
|
||||
},mediaQueryLists:function(fn){
|
||||
cssHelper.parsed(function(_32){
|
||||
fn(_2a.mediaQueryLists||_2d("mediaQueryLists"));
|
||||
});
|
||||
},rules:function(fn){
|
||||
cssHelper.parsed(function(_33){
|
||||
fn(_2a.rules||_2d("rules"));
|
||||
});
|
||||
},selectors:function(fn){
|
||||
cssHelper.parsed(function(_34){
|
||||
fn(_2a.selectors||_2d("selectors"));
|
||||
});
|
||||
},declarations:function(fn){
|
||||
cssHelper.parsed(function(_35){
|
||||
fn(_2a.declarations||_2d("declarations"));
|
||||
});
|
||||
},properties:function(fn){
|
||||
cssHelper.parsed(function(_36){
|
||||
fn(_2a.properties||_2d("properties"));
|
||||
});
|
||||
},broadcast:_a,addListener:function(n,fn){
|
||||
if(typeof fn==="function"){
|
||||
if(!_9[n]){
|
||||
_9[n]={listeners:[]};
|
||||
}
|
||||
_9[n].listeners[_9[n].listeners.length]=fn;
|
||||
}
|
||||
},removeListener:function(n,fn){
|
||||
if(typeof fn==="function"&&_9[n]){
|
||||
var ls=_9[n].listeners;
|
||||
for(var i=0;i<ls.length;i++){
|
||||
if(ls[i]===fn){
|
||||
ls.splice(i,1);
|
||||
i-=1;
|
||||
}
|
||||
}
|
||||
}
|
||||
},getViewportWidth:function(){
|
||||
return _2f("Width");
|
||||
},getViewportHeight:function(){
|
||||
return _2f("Height");
|
||||
}};
|
||||
}();
|
||||
domReady(function enableCssMediaQueries(){
|
||||
var _37;
|
||||
var _38={LENGTH_UNIT:/[0-9]+(em|ex|px|in|cm|mm|pt|pc)$/,RESOLUTION_UNIT:/[0-9]+(dpi|dpcm)$/,ASPECT_RATIO:/^[0-9]+\/[0-9]+$/,ABSOLUTE_VALUE:/^[0-9]*(\.[0-9]+)*$/};
|
||||
var _39=[];
|
||||
var _3a=function(){
|
||||
var id="css3-mediaqueries-test";
|
||||
var el=document.createElement("div");
|
||||
el.id=id;
|
||||
var _3b=cssHelper.addStyle("@media all and (width) { #"+id+" { width: 1px !important; } }",false);
|
||||
document.body.appendChild(el);
|
||||
var ret=el.offsetWidth===1;
|
||||
_3b.parentNode.removeChild(_3b);
|
||||
el.parentNode.removeChild(el);
|
||||
_3a=function(){
|
||||
return ret;
|
||||
};
|
||||
return ret;
|
||||
};
|
||||
var _3c=function(){
|
||||
_37=document.createElement("div");
|
||||
_37.style.cssText="position:absolute;top:-9999em;left:-9999em;"+"margin:0;border:none;padding:0;width:1em;font-size:1em;";
|
||||
document.body.appendChild(_37);
|
||||
if(_37.offsetWidth!==16){
|
||||
_37.style.fontSize=16/_37.offsetWidth+"em";
|
||||
}
|
||||
_37.style.width="";
|
||||
};
|
||||
var _3d=function(_3e){
|
||||
_37.style.width=_3e;
|
||||
var _3f=_37.offsetWidth;
|
||||
_37.style.width="";
|
||||
return _3f;
|
||||
};
|
||||
var _40=function(_41,_42){
|
||||
var l=_41.length;
|
||||
var min=(_41.substring(0,4)==="min-");
|
||||
var max=(!min&&_41.substring(0,4)==="max-");
|
||||
if(_42!==null){
|
||||
var _43;
|
||||
var _44;
|
||||
if(_38.LENGTH_UNIT.exec(_42)){
|
||||
_43="length";
|
||||
_44=_3d(_42);
|
||||
}else{
|
||||
if(_38.RESOLUTION_UNIT.exec(_42)){
|
||||
_43="resolution";
|
||||
_44=parseInt(_42,10);
|
||||
var _45=_42.substring((_44+"").length);
|
||||
}else{
|
||||
if(_38.ASPECT_RATIO.exec(_42)){
|
||||
_43="aspect-ratio";
|
||||
_44=_42.split("/");
|
||||
}else{
|
||||
if(_38.ABSOLUTE_VALUE){
|
||||
_43="absolute";
|
||||
_44=_42;
|
||||
}else{
|
||||
_43="unknown";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
var _46,_47;
|
||||
if("device-width"===_41.substring(l-12,l)){
|
||||
_46=screen.width;
|
||||
if(_42!==null){
|
||||
if(_43==="length"){
|
||||
return ((min&&_46>=_44)||(max&&_46<_44)||(!min&&!max&&_46===_44));
|
||||
}else{
|
||||
return false;
|
||||
}
|
||||
}else{
|
||||
return _46>0;
|
||||
}
|
||||
}else{
|
||||
if("device-height"===_41.substring(l-13,l)){
|
||||
_47=screen.height;
|
||||
if(_42!==null){
|
||||
if(_43==="length"){
|
||||
return ((min&&_47>=_44)||(max&&_47<_44)||(!min&&!max&&_47===_44));
|
||||
}else{
|
||||
return false;
|
||||
}
|
||||
}else{
|
||||
return _47>0;
|
||||
}
|
||||
}else{
|
||||
if("width"===_41.substring(l-5,l)){
|
||||
_46=document.documentElement.clientWidth||document.body.clientWidth;
|
||||
if(_42!==null){
|
||||
if(_43==="length"){
|
||||
return ((min&&_46>=_44)||(max&&_46<_44)||(!min&&!max&&_46===_44));
|
||||
}else{
|
||||
return false;
|
||||
}
|
||||
}else{
|
||||
return _46>0;
|
||||
}
|
||||
}else{
|
||||
if("height"===_41.substring(l-6,l)){
|
||||
_47=document.documentElement.clientHeight||document.body.clientHeight;
|
||||
if(_42!==null){
|
||||
if(_43==="length"){
|
||||
return ((min&&_47>=_44)||(max&&_47<_44)||(!min&&!max&&_47===_44));
|
||||
}else{
|
||||
return false;
|
||||
}
|
||||
}else{
|
||||
return _47>0;
|
||||
}
|
||||
}else{
|
||||
if("device-aspect-ratio"===_41.substring(l-19,l)){
|
||||
return _43==="aspect-ratio"&&screen.width*_44[1]===screen.height*_44[0];
|
||||
}else{
|
||||
if("color-index"===_41.substring(l-11,l)){
|
||||
var _48=Math.pow(2,screen.colorDepth);
|
||||
if(_42!==null){
|
||||
if(_43==="absolute"){
|
||||
return ((min&&_48>=_44)||(max&&_48<_44)||(!min&&!max&&_48===_44));
|
||||
}else{
|
||||
return false;
|
||||
}
|
||||
}else{
|
||||
return _48>0;
|
||||
}
|
||||
}else{
|
||||
if("color"===_41.substring(l-5,l)){
|
||||
var _49=screen.colorDepth;
|
||||
if(_42!==null){
|
||||
if(_43==="absolute"){
|
||||
return ((min&&_49>=_44)||(max&&_49<_44)||(!min&&!max&&_49===_44));
|
||||
}else{
|
||||
return false;
|
||||
}
|
||||
}else{
|
||||
return _49>0;
|
||||
}
|
||||
}else{
|
||||
if("resolution"===_41.substring(l-10,l)){
|
||||
var res;
|
||||
if(_45==="dpcm"){
|
||||
res=_3d("1cm");
|
||||
}else{
|
||||
res=_3d("1in");
|
||||
}
|
||||
if(_42!==null){
|
||||
if(_43==="resolution"){
|
||||
return ((min&&res>=_44)||(max&&res<_44)||(!min&&!max&&res===_44));
|
||||
}else{
|
||||
return false;
|
||||
}
|
||||
}else{
|
||||
return res>0;
|
||||
}
|
||||
}else{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
var _4a=function(mq){
|
||||
var _4b=mq.getValid();
|
||||
var _4c=mq.getExpressions();
|
||||
var l=_4c.length;
|
||||
if(l>0){
|
||||
for(var i=0;i<l&&_4b;i++){
|
||||
_4b=_40(_4c[i].mediaFeature,_4c[i].value);
|
||||
}
|
||||
var not=mq.getNot();
|
||||
return (_4b&&!not||not&&!_4b);
|
||||
}
|
||||
};
|
||||
var _4d=function(mql){
|
||||
var mqs=mql.getMediaQueries();
|
||||
var t={};
|
||||
for(var i=0;i<mqs.length;i++){
|
||||
if(_4a(mqs[i])){
|
||||
t[mqs[i].getMediaType()]=true;
|
||||
}
|
||||
}
|
||||
var s=[],c=0;
|
||||
for(var n in t){
|
||||
if(t.hasOwnProperty(n)){
|
||||
if(c>0){
|
||||
s[c++]=",";
|
||||
}
|
||||
s[c++]=n;
|
||||
}
|
||||
}
|
||||
if(s.length>0){
|
||||
_39[_39.length]=cssHelper.addStyle("@media "+s.join("")+"{"+mql.getCssText()+"}",false);
|
||||
}
|
||||
};
|
||||
var _4e=function(_4f){
|
||||
for(var i=0;i<_4f.length;i++){
|
||||
_4d(_4f[i]);
|
||||
}
|
||||
if(ua.ie){
|
||||
document.documentElement.style.display="block";
|
||||
setTimeout(function(){
|
||||
document.documentElement.style.display="";
|
||||
},0);
|
||||
setTimeout(function(){
|
||||
cssHelper.broadcast("cssMediaQueriesTested");
|
||||
},100);
|
||||
}else{
|
||||
cssHelper.broadcast("cssMediaQueriesTested");
|
||||
}
|
||||
};
|
||||
var _50=function(){
|
||||
for(var i=0;i<_39.length;i++){
|
||||
cssHelper.removeStyle(_39[i]);
|
||||
}
|
||||
_39=[];
|
||||
cssHelper.mediaQueryLists(_4e);
|
||||
};
|
||||
var _51=0;
|
||||
var _52=function(){
|
||||
var _53=cssHelper.getViewportWidth();
|
||||
var _54=cssHelper.getViewportHeight();
|
||||
if(ua.ie){
|
||||
var el=document.createElement("div");
|
||||
el.style.position="absolute";
|
||||
el.style.top="-9999em";
|
||||
el.style.overflow="scroll";
|
||||
document.body.appendChild(el);
|
||||
_51=el.offsetWidth-el.clientWidth;
|
||||
document.body.removeChild(el);
|
||||
}
|
||||
var _55;
|
||||
var _56=function(){
|
||||
var vpw=cssHelper.getViewportWidth();
|
||||
var vph=cssHelper.getViewportHeight();
|
||||
if(Math.abs(vpw-_53)>_51||Math.abs(vph-_54)>_51){
|
||||
_53=vpw;
|
||||
_54=vph;
|
||||
clearTimeout(_55);
|
||||
_55=setTimeout(function(){
|
||||
if(!_3a()){
|
||||
_50();
|
||||
}else{
|
||||
cssHelper.broadcast("cssMediaQueriesTested");
|
||||
}
|
||||
},500);
|
||||
}
|
||||
};
|
||||
window.onresize=function(){
|
||||
var x=window.onresize||function(){
|
||||
};
|
||||
return function(){
|
||||
x();
|
||||
_56();
|
||||
};
|
||||
}();
|
||||
};
|
||||
var _57=document.documentElement;
|
||||
_57.style.marginLeft="-32767px";
|
||||
setTimeout(function(){
|
||||
_57.style.marginTop="";
|
||||
},20000);
|
||||
return function(){
|
||||
if(!_3a()){
|
||||
cssHelper.addListener("newStyleParsed",function(el){
|
||||
_4e(el.cssHelperParsed.mediaQueryLists);
|
||||
});
|
||||
cssHelper.addListener("cssMediaQueriesTested",function(){
|
||||
if(ua.ie){
|
||||
_57.style.width="1px";
|
||||
}
|
||||
setTimeout(function(){
|
||||
_57.style.width="";
|
||||
_57.style.marginLeft="";
|
||||
},0);
|
||||
cssHelper.removeListener("cssMediaQueriesTested",arguments.callee);
|
||||
});
|
||||
_3c();
|
||||
_50();
|
||||
}else{
|
||||
_57.style.marginLeft="";
|
||||
}
|
||||
_52();
|
||||
};
|
||||
}());
|
||||
try{
|
||||
document.execCommand("BackgroundImageCache",false,true);
|
||||
}
|
||||
catch(e){
|
||||
}
|
||||
|
@ -1,518 +0,0 @@
|
||||
# ===========================================================================
|
||||
# http://www.gnu.org/software/autoconf-archive/ax_with_curses.html
|
||||
# ===========================================================================
|
||||
#
|
||||
# SYNOPSIS
|
||||
#
|
||||
# AX_WITH_CURSES
|
||||
#
|
||||
# DESCRIPTION
|
||||
#
|
||||
# This macro checks whether a SysV or X/Open-compatible Curses library is
|
||||
# present, along with the associated header file. The NcursesW
|
||||
# (wide-character) library is searched for first, followed by Ncurses,
|
||||
# then the system-default plain Curses. The first library found is the
|
||||
# one returned.
|
||||
#
|
||||
# The following options are understood: --with-ncursesw, --with-ncurses,
|
||||
# --without-ncursesw, --without-ncurses. The "--with" options force the
|
||||
# macro to use that particular library, terminating with an error if not
|
||||
# found. The "--without" options simply skip the check for that library.
|
||||
# The effect on the search pattern is:
|
||||
#
|
||||
# (no options) - NcursesW, Ncurses, Curses
|
||||
# --with-ncurses --with-ncursesw - NcursesW only [*]
|
||||
# --without-ncurses --with-ncursesw - NcursesW only [*]
|
||||
# --with-ncursesw - NcursesW only [*]
|
||||
# --with-ncurses --without-ncursesw - Ncurses only [*]
|
||||
# --with-ncurses - NcursesW, Ncurses [**]
|
||||
# --without-ncurses --without-ncursesw - Curses only
|
||||
# --without-ncursesw - Ncurses, Curses
|
||||
# --without-ncurses - NcursesW, Curses
|
||||
#
|
||||
# [*] If the library is not found, abort the configure script.
|
||||
#
|
||||
# [**] If the second library (Ncurses) is not found, abort configure.
|
||||
#
|
||||
# The following preprocessor symbols may be defined by this macro if the
|
||||
# appropriate conditions are met:
|
||||
#
|
||||
# HAVE_CURSES - if any SysV or X/Open Curses library found
|
||||
# HAVE_CURSES_ENHANCED - if library supports X/Open Enhanced functions
|
||||
# HAVE_CURSES_COLOR - if library supports color (enhanced functions)
|
||||
# HAVE_CURSES_OBSOLETE - if library supports certain obsolete features
|
||||
# HAVE_NCURSESW - if NcursesW (wide char) library is to be used
|
||||
# HAVE_NCURSES - if the Ncurses library is to be used
|
||||
#
|
||||
# HAVE_CURSES_H - if <curses.h> is present and should be used
|
||||
# HAVE_NCURSESW_H - if <ncursesw.h> should be used
|
||||
# HAVE_NCURSES_H - if <ncurses.h> should be used
|
||||
# HAVE_NCURSESW_CURSES_H - if <ncursesw/curses.h> should be used
|
||||
# HAVE_NCURSES_CURSES_H - if <ncurses/curses.h> should be used
|
||||
#
|
||||
# (These preprocessor symbols are discussed later in this document.)
|
||||
#
|
||||
# The following output variable is defined by this macro; it is precious
|
||||
# and may be overridden on the ./configure command line:
|
||||
#
|
||||
# CURSES_LIB - library to add to xxx_LDADD
|
||||
#
|
||||
# The library listed in CURSES_LIB is NOT added to LIBS by default. You
|
||||
# need to add CURSES_LIB to the appropriate xxx_LDADD line in your
|
||||
# Makefile.am. For example:
|
||||
#
|
||||
# prog_LDADD = @CURSES_LIB@
|
||||
#
|
||||
# If CURSES_LIB is set on the configure command line (such as by running
|
||||
# "./configure CURSES_LIB=-lmycurses"), then the only header searched for
|
||||
# is <curses.h>. The user may use the CPPFLAGS precious variable to
|
||||
# override the standard #include search path. If the user needs to
|
||||
# specify an alternative path for a library (such as for a non-standard
|
||||
# NcurseW), the user should use the LDFLAGS variable.
|
||||
#
|
||||
# The following shell variables may be defined by this macro:
|
||||
#
|
||||
# ax_cv_curses - set to "yes" if any Curses library found
|
||||
# ax_cv_curses_enhanced - set to "yes" if Enhanced functions present
|
||||
# ax_cv_curses_color - set to "yes" if color functions present
|
||||
# ax_cv_curses_obsolete - set to "yes" if obsolete features present
|
||||
#
|
||||
# ax_cv_ncursesw - set to "yes" if NcursesW library found
|
||||
# ax_cv_ncurses - set to "yes" if Ncurses library found
|
||||
# ax_cv_plaincurses - set to "yes" if plain Curses library found
|
||||
# ax_cv_curses_which - set to "ncursesw", "ncurses", "plaincurses" or "no"
|
||||
#
|
||||
# These variables can be used in your configure.ac to determine the level
|
||||
# of support you need from the Curses library. For example, if you must
|
||||
# have either Ncurses or NcursesW, you could include:
|
||||
#
|
||||
# AX_WITH_CURSES
|
||||
# if test "x$ax_cv_ncursesw" != xyes && test "x$ax_cv_ncurses" != xyes; then
|
||||
# AX_MSG_ERROR([requires either NcursesW or Ncurses library])
|
||||
# fi
|
||||
#
|
||||
# If any Curses library will do (but one must be present and must support
|
||||
# color), you could use:
|
||||
#
|
||||
# AX_WITH_CURSES
|
||||
# if test "x$ax_cv_curses" != xyes || test "x$ax_cv_curses_color" != xyes; then
|
||||
# AC_MSG_ERROR([requires an X/Open-compatible Curses library with color])
|
||||
# fi
|
||||
#
|
||||
# Certain preprocessor symbols and shell variables defined by this macro
|
||||
# can be used to determine various features of the Curses library. In
|
||||
# particular, HAVE_CURSES and ax_cv_curses are defined if the Curses
|
||||
# library found conforms to the traditional SysV and/or X/Open Base Curses
|
||||
# definition. Any working Curses library conforms to this level.
|
||||
#
|
||||
# HAVE_CURSES_ENHANCED and ax_cv_curses_enhanced are defined if the
|
||||
# library supports the X/Open Enhanced Curses definition. In particular,
|
||||
# the wide-character types attr_t, cchar_t and wint_t, the functions
|
||||
# wattr_set() and wget_wch() and the macros WA_NORMAL and _XOPEN_CURSES
|
||||
# are checked. The Ncurses library does NOT conform to this definition,
|
||||
# although NcursesW does.
|
||||
#
|
||||
# HAVE_CURSES_COLOR and ax_cv_curses_color are defined if the library
|
||||
# supports color functions and macros such as COLOR_PAIR, A_COLOR,
|
||||
# COLOR_WHITE, COLOR_RED and init_pair(). These are NOT part of the
|
||||
# X/Open Base Curses definition, but are part of the Enhanced set of
|
||||
# functions. The Ncurses library DOES support these functions, as does
|
||||
# NcursesW.
|
||||
#
|
||||
# HAVE_CURSES_OBSOLETE and ax_cv_curses_obsolete are defined if the
|
||||
# library supports certain features present in SysV and BSD Curses but not
|
||||
# defined in the X/Open definition. In particular, the functions
|
||||
# getattrs(), getcurx() and getmaxx() are checked.
|
||||
#
|
||||
# To use the HAVE_xxx_H preprocessor symbols, insert the following into
|
||||
# your system.h (or equivalent) header file:
|
||||
#
|
||||
# #if defined HAVE_NCURSESW_CURSES_H
|
||||
# # include <ncursesw/curses.h>
|
||||
# #elif defined HAVE_NCURSESW_H
|
||||
# # include <ncursesw.h>
|
||||
# #elif defined HAVE_NCURSES_CURSES_H
|
||||
# # include <ncurses/curses.h>
|
||||
# #elif defined HAVE_NCURSES_H
|
||||
# # include <ncurses.h>
|
||||
# #elif defined HAVE_CURSES_H
|
||||
# # include <curses.h>
|
||||
# #else
|
||||
# # error "SysV or X/Open-compatible Curses header file required"
|
||||
# #endif
|
||||
#
|
||||
# For previous users of this macro: you should not need to change anything
|
||||
# in your configure.ac or Makefile.am, as the previous (serial 10)
|
||||
# semantics are still valid. However, you should update your system.h (or
|
||||
# equivalent) header file to the fragment shown above. You are encouraged
|
||||
# also to make use of the extended functionality provided by this version
|
||||
# of AX_WITH_CURSES, as well as in the additional macros
|
||||
# AX_WITH_CURSES_PANEL, AX_WITH_CURSES_MENU and AX_WITH_CURSES_FORM.
|
||||
#
|
||||
# LICENSE
|
||||
#
|
||||
# Copyright (c) 2009 Mark Pulford <mark@kyne.com.au>
|
||||
# Copyright (c) 2009 Damian Pietras <daper@daper.net>
|
||||
# Copyright (c) 2012 Reuben Thomas <rrt@sc3d.org>
|
||||
# Copyright (c) 2011 John Zaitseff <J.Zaitseff@zap.org.au>
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify it
|
||||
# under the terms of the GNU General Public License as published by the
|
||||
# Free Software Foundation, either version 3 of the License, or (at your
|
||||
# option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful, but
|
||||
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
|
||||
# Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License along
|
||||
# with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
# As a special exception, the respective Autoconf Macro's copyright owner
|
||||
# gives unlimited permission to copy, distribute and modify the configure
|
||||
# scripts that are the output of Autoconf when processing the Macro. You
|
||||
# need not follow the terms of the GNU General Public License when using
|
||||
# or distributing such scripts, even though portions of the text of the
|
||||
# Macro appear in them. The GNU General Public License (GPL) does govern
|
||||
# all other use of the material that constitutes the Autoconf Macro.
|
||||
#
|
||||
# This special exception to the GPL applies to versions of the Autoconf
|
||||
# Macro released by the Autoconf Archive. When you make and distribute a
|
||||
# modified version of the Autoconf Macro, you may extend this special
|
||||
# exception to the GPL to apply to your modified version as well.
|
||||
|
||||
#serial 13
|
||||
|
||||
AU_ALIAS([MP_WITH_CURSES], [AX_WITH_CURSES])
|
||||
AC_DEFUN([AX_WITH_CURSES], [
|
||||
AC_ARG_VAR([CURSES_LIB], [linker library for Curses, e.g. -lcurses])
|
||||
AC_ARG_WITH([ncurses], [AS_HELP_STRING([--with-ncurses],
|
||||
[force the use of Ncurses or NcursesW])],
|
||||
[], [with_ncurses=check])
|
||||
AC_ARG_WITH([ncursesw], [AS_HELP_STRING([--without-ncursesw],
|
||||
[do not use NcursesW (wide character support)])],
|
||||
[], [with_ncursesw=check])
|
||||
|
||||
ax_saved_LIBS=$LIBS
|
||||
AS_IF([test "x$with_ncurses" = xyes || test "x$with_ncursesw" = xyes],
|
||||
[ax_with_plaincurses=no], [ax_with_plaincurses=check])
|
||||
|
||||
ax_cv_curses_which=no
|
||||
|
||||
# Test for NcursesW
|
||||
|
||||
AS_IF([test "x$CURSES_LIB" = x && test "x$with_ncursesw" != xno], [
|
||||
LIBS="$ax_saved_LIBS -lncursesw"
|
||||
|
||||
AC_CACHE_CHECK([for NcursesW wide-character library], [ax_cv_ncursesw], [
|
||||
AC_LINK_IFELSE([AC_LANG_CALL([], [initscr])],
|
||||
[ax_cv_ncursesw=yes], [ax_cv_ncursesw=no])
|
||||
])
|
||||
AS_IF([test "x$ax_cv_ncursesw" = xno && test "x$with_ncursesw" = xyes], [
|
||||
AC_MSG_ERROR([--with-ncursesw specified but could not find NcursesW library])
|
||||
])
|
||||
|
||||
AS_IF([test "x$ax_cv_ncursesw" = xyes], [
|
||||
ax_cv_curses=yes
|
||||
ax_cv_curses_which=ncursesw
|
||||
CURSES_LIB="-lncursesw"
|
||||
AC_DEFINE([HAVE_NCURSESW], [1], [Define to 1 if the NcursesW library is present])
|
||||
AC_DEFINE([HAVE_CURSES], [1], [Define to 1 if a SysV or X/Open compatible Curses library is present])
|
||||
|
||||
AC_CACHE_CHECK([for working ncursesw/curses.h], [ax_cv_header_ncursesw_curses_h], [
|
||||
AC_LINK_IFELSE([AC_LANG_PROGRAM([[
|
||||
@%:@define _XOPEN_SOURCE_EXTENDED 1
|
||||
@%:@include <ncursesw/curses.h>
|
||||
]], [[
|
||||
chtype a = A_BOLD;
|
||||
int b = KEY_LEFT;
|
||||
chtype c = COLOR_PAIR(1) & A_COLOR;
|
||||
attr_t d = WA_NORMAL;
|
||||
cchar_t e;
|
||||
wint_t f;
|
||||
int g = getattrs(stdscr);
|
||||
int h = getcurx(stdscr) + getmaxx(stdscr);
|
||||
initscr();
|
||||
init_pair(1, COLOR_WHITE, COLOR_RED);
|
||||
wattr_set(stdscr, d, 0, NULL);
|
||||
wget_wch(stdscr, &f);
|
||||
]])],
|
||||
[ax_cv_header_ncursesw_curses_h=yes],
|
||||
[ax_cv_header_ncursesw_curses_h=no])
|
||||
])
|
||||
AS_IF([test "x$ax_cv_header_ncursesw_curses_h" = xyes], [
|
||||
ax_cv_curses_enhanced=yes
|
||||
ax_cv_curses_color=yes
|
||||
ax_cv_curses_obsolete=yes
|
||||
AC_DEFINE([HAVE_CURSES_ENHANCED], [1], [Define to 1 if library supports X/Open Enhanced functions])
|
||||
AC_DEFINE([HAVE_CURSES_COLOR], [1], [Define to 1 if library supports color (enhanced functions)])
|
||||
AC_DEFINE([HAVE_CURSES_OBSOLETE], [1], [Define to 1 if library supports certain obsolete features])
|
||||
AC_DEFINE([HAVE_NCURSESW_CURSES_H], [1], [Define to 1 if <ncursesw/curses.h> is present])
|
||||
])
|
||||
|
||||
AC_CACHE_CHECK([for working ncursesw.h], [ax_cv_header_ncursesw_h], [
|
||||
AC_LINK_IFELSE([AC_LANG_PROGRAM([[
|
||||
@%:@define _XOPEN_SOURCE_EXTENDED 1
|
||||
@%:@include <ncursesw.h>
|
||||
]], [[
|
||||
chtype a = A_BOLD;
|
||||
int b = KEY_LEFT;
|
||||
chtype c = COLOR_PAIR(1) & A_COLOR;
|
||||
attr_t d = WA_NORMAL;
|
||||
cchar_t e;
|
||||
wint_t f;
|
||||
int g = getattrs(stdscr);
|
||||
int h = getcurx(stdscr) + getmaxx(stdscr);
|
||||
initscr();
|
||||
init_pair(1, COLOR_WHITE, COLOR_RED);
|
||||
wattr_set(stdscr, d, 0, NULL);
|
||||
wget_wch(stdscr, &f);
|
||||
]])],
|
||||
[ax_cv_header_ncursesw_h=yes],
|
||||
[ax_cv_header_ncursesw_h=no])
|
||||
])
|
||||
AS_IF([test "x$ax_cv_header_ncursesw_h" = xyes], [
|
||||
ax_cv_curses_enhanced=yes
|
||||
ax_cv_curses_color=yes
|
||||
ax_cv_curses_obsolete=yes
|
||||
AC_DEFINE([HAVE_CURSES_ENHANCED], [1], [Define to 1 if library supports X/Open Enhanced functions])
|
||||
AC_DEFINE([HAVE_CURSES_COLOR], [1], [Define to 1 if library supports color (enhanced functions)])
|
||||
AC_DEFINE([HAVE_CURSES_OBSOLETE], [1], [Define to 1 if library supports certain obsolete features])
|
||||
AC_DEFINE([HAVE_NCURSESW_H], [1], [Define to 1 if <ncursesw.h> is present])
|
||||
])
|
||||
|
||||
AC_CACHE_CHECK([for working ncurses.h], [ax_cv_header_ncurses_h_with_ncursesw], [
|
||||
AC_LINK_IFELSE([AC_LANG_PROGRAM([[
|
||||
@%:@define _XOPEN_SOURCE_EXTENDED 1
|
||||
@%:@include <ncurses.h>
|
||||
]], [[
|
||||
chtype a = A_BOLD;
|
||||
int b = KEY_LEFT;
|
||||
chtype c = COLOR_PAIR(1) & A_COLOR;
|
||||
attr_t d = WA_NORMAL;
|
||||
cchar_t e;
|
||||
wint_t f;
|
||||
int g = getattrs(stdscr);
|
||||
int h = getcurx(stdscr) + getmaxx(stdscr);
|
||||
initscr();
|
||||
init_pair(1, COLOR_WHITE, COLOR_RED);
|
||||
wattr_set(stdscr, d, 0, NULL);
|
||||
wget_wch(stdscr, &f);
|
||||
]])],
|
||||
[ax_cv_header_ncurses_h_with_ncursesw=yes],
|
||||
[ax_cv_header_ncurses_h_with_ncursesw=no])
|
||||
])
|
||||
AS_IF([test "x$ax_cv_header_ncurses_h_with_ncursesw" = xyes], [
|
||||
ax_cv_curses_enhanced=yes
|
||||
ax_cv_curses_color=yes
|
||||
ax_cv_curses_obsolete=yes
|
||||
AC_DEFINE([HAVE_CURSES_ENHANCED], [1], [Define to 1 if library supports X/Open Enhanced functions])
|
||||
AC_DEFINE([HAVE_CURSES_COLOR], [1], [Define to 1 if library supports color (enhanced functions)])
|
||||
AC_DEFINE([HAVE_CURSES_OBSOLETE], [1], [Define to 1 if library supports certain obsolete features])
|
||||
AC_DEFINE([HAVE_NCURSES_H], [1], [Define to 1 if <ncurses.h> is present])
|
||||
])
|
||||
|
||||
AS_IF([test "x$ax_cv_header_ncursesw_curses_h" = xno && test "x$ax_cv_header_ncursesw_h" = xno && test "x$ax_cv_header_ncurses_h_with_ncursesw" = xno], [
|
||||
AC_MSG_WARN([could not find a working ncursesw/curses.h, ncursesw.h or ncurses.h])
|
||||
])
|
||||
])
|
||||
])
|
||||
|
||||
# Test for Ncurses
|
||||
|
||||
AS_IF([test "x$CURSES_LIB" = x && test "x$with_ncurses" != xno && test "x$ax_cv_curses_which" = xno], [
|
||||
LIBS="$ax_saved_LIBS -lncurses"
|
||||
|
||||
AC_CACHE_CHECK([for Ncurses library], [ax_cv_ncurses], [
|
||||
AC_LINK_IFELSE([AC_LANG_CALL([], [initscr])],
|
||||
[ax_cv_ncurses=yes], [ax_cv_ncurses=no])
|
||||
])
|
||||
AS_IF([test "x$ax_cv_ncurses" = xno && test "x$with_ncurses" = xyes], [
|
||||
AC_MSG_ERROR([--with-ncurses specified but could not find Ncurses library])
|
||||
])
|
||||
|
||||
AS_IF([test "x$ax_cv_ncurses" = xyes], [
|
||||
ax_cv_curses=yes
|
||||
ax_cv_curses_which=ncurses
|
||||
CURSES_LIB="-lncurses"
|
||||
AC_DEFINE([HAVE_NCURSES], [1], [Define to 1 if the Ncurses library is present])
|
||||
AC_DEFINE([HAVE_CURSES], [1], [Define to 1 if a SysV or X/Open compatible Curses library is present])
|
||||
|
||||
AC_CACHE_CHECK([for working ncurses/curses.h], [ax_cv_header_ncurses_curses_h], [
|
||||
AC_LINK_IFELSE([AC_LANG_PROGRAM([[
|
||||
@%:@include <ncurses/curses.h>
|
||||
]], [[
|
||||
chtype a = A_BOLD;
|
||||
int b = KEY_LEFT;
|
||||
chtype c = COLOR_PAIR(1) & A_COLOR;
|
||||
int g = getattrs(stdscr);
|
||||
int h = getcurx(stdscr) + getmaxx(stdscr);
|
||||
initscr();
|
||||
init_pair(1, COLOR_WHITE, COLOR_RED);
|
||||
]])],
|
||||
[ax_cv_header_ncurses_curses_h=yes],
|
||||
[ax_cv_header_ncurses_curses_h=no])
|
||||
])
|
||||
AS_IF([test "x$ax_cv_header_ncurses_curses_h" = xyes], [
|
||||
ax_cv_curses_color=yes
|
||||
ax_cv_curses_obsolete=yes
|
||||
AC_DEFINE([HAVE_CURSES_COLOR], [1], [Define to 1 if library supports color (enhanced functions)])
|
||||
AC_DEFINE([HAVE_CURSES_OBSOLETE], [1], [Define to 1 if library supports certain obsolete features])
|
||||
AC_DEFINE([HAVE_NCURSES_CURSES_H], [1], [Define to 1 if <ncurses/curses.h> is present])
|
||||
])
|
||||
|
||||
AC_CACHE_CHECK([for working ncurses.h], [ax_cv_header_ncurses_h], [
|
||||
AC_LINK_IFELSE([AC_LANG_PROGRAM([[
|
||||
@%:@include <ncurses.h>
|
||||
]], [[
|
||||
chtype a = A_BOLD;
|
||||
int b = KEY_LEFT;
|
||||
chtype c = COLOR_PAIR(1) & A_COLOR;
|
||||
int g = getattrs(stdscr);
|
||||
int h = getcurx(stdscr) + getmaxx(stdscr);
|
||||
initscr();
|
||||
init_pair(1, COLOR_WHITE, COLOR_RED);
|
||||
]])],
|
||||
[ax_cv_header_ncurses_h=yes],
|
||||
[ax_cv_header_ncurses_h=no])
|
||||
])
|
||||
AS_IF([test "x$ax_cv_header_ncurses_h" = xyes], [
|
||||
ax_cv_curses_color=yes
|
||||
ax_cv_curses_obsolete=yes
|
||||
AC_DEFINE([HAVE_CURSES_COLOR], [1], [Define to 1 if library supports color (enhanced functions)])
|
||||
AC_DEFINE([HAVE_CURSES_OBSOLETE], [1], [Define to 1 if library supports certain obsolete features])
|
||||
AC_DEFINE([HAVE_NCURSES_H], [1], [Define to 1 if <ncurses.h> is present])
|
||||
])
|
||||
|
||||
AS_IF([test "x$ax_cv_header_ncurses_curses_h" = xno && test "x$ax_cv_header_ncurses_h" = xno], [
|
||||
AC_MSG_WARN([could not find a working ncurses/curses.h or ncurses.h])
|
||||
])
|
||||
])
|
||||
])
|
||||
|
||||
# Test for plain Curses (or if CURSES_LIB was set by user)
|
||||
|
||||
AS_IF([test "x$with_plaincurses" != xno && test "x$ax_cv_curses_which" = xno], [
|
||||
AS_IF([test "x$CURSES_LIB" != x], [
|
||||
LIBS="$ax_saved_LIBS $CURSES_LIB"
|
||||
], [
|
||||
LIBS="$ax_saved_LIBS -lcurses"
|
||||
])
|
||||
|
||||
AC_CACHE_CHECK([for Curses library], [ax_cv_plaincurses], [
|
||||
AC_LINK_IFELSE([AC_LANG_CALL([], [initscr])],
|
||||
[ax_cv_plaincurses=yes], [ax_cv_plaincurses=no])
|
||||
])
|
||||
|
||||
AS_IF([test "x$ax_cv_plaincurses" = xyes], [
|
||||
ax_cv_curses=yes
|
||||
ax_cv_curses_which=plaincurses
|
||||
AS_IF([test "x$CURSES_LIB" = x], [
|
||||
CURSES_LIB="-lcurses"
|
||||
])
|
||||
AC_DEFINE([HAVE_CURSES], [1], [Define to 1 if a SysV or X/Open compatible Curses library is present])
|
||||
|
||||
# Check for base conformance (and header file)
|
||||
|
||||
AC_CACHE_CHECK([for working curses.h], [ax_cv_header_curses_h], [
|
||||
AC_LINK_IFELSE([AC_LANG_PROGRAM([[
|
||||
@%:@include <curses.h>
|
||||
]], [[
|
||||
chtype a = A_BOLD;
|
||||
int b = KEY_LEFT;
|
||||
initscr();
|
||||
]])],
|
||||
[ax_cv_header_curses_h=yes],
|
||||
[ax_cv_header_curses_h=no])
|
||||
])
|
||||
AS_IF([test "x$ax_cv_header_curses_h" = xyes], [
|
||||
AC_DEFINE([HAVE_CURSES_H], [1], [Define to 1 if <curses.h> is present])
|
||||
|
||||
# Check for X/Open Enhanced conformance
|
||||
|
||||
AC_CACHE_CHECK([for X/Open Enhanced Curses conformance], [ax_cv_plaincurses_enhanced], [
|
||||
AC_LINK_IFELSE([AC_LANG_PROGRAM([[
|
||||
@%:@define _XOPEN_SOURCE_EXTENDED 1
|
||||
@%:@include <curses.h>
|
||||
@%:@ifndef _XOPEN_CURSES
|
||||
@%:@error "this Curses library is not enhanced"
|
||||
"this Curses library is not enhanced"
|
||||
@%:@endif
|
||||
]], [[
|
||||
chtype a = A_BOLD;
|
||||
int b = KEY_LEFT;
|
||||
chtype c = COLOR_PAIR(1) & A_COLOR;
|
||||
attr_t d = WA_NORMAL;
|
||||
cchar_t e;
|
||||
wint_t f;
|
||||
initscr();
|
||||
init_pair(1, COLOR_WHITE, COLOR_RED);
|
||||
wattr_set(stdscr, d, 0, NULL);
|
||||
wget_wch(stdscr, &f);
|
||||
]])],
|
||||
[ax_cv_plaincurses_enhanced=yes],
|
||||
[ax_cv_plaincurses_enhanced=no])
|
||||
])
|
||||
AS_IF([test "x$ax_cv_plaincurses_enhanced" = xyes], [
|
||||
ax_cv_curses_enhanced=yes
|
||||
ax_cv_curses_color=yes
|
||||
AC_DEFINE([HAVE_CURSES_ENHANCED], [1], [Define to 1 if library supports X/Open Enhanced functions])
|
||||
AC_DEFINE([HAVE_CURSES_COLOR], [1], [Define to 1 if library supports color (enhanced functions)])
|
||||
])
|
||||
|
||||
# Check for color functions
|
||||
|
||||
AC_CACHE_CHECK([for Curses color functions], [ax_cv_plaincurses_color], [
|
||||
AC_LINK_IFELSE([AC_LANG_PROGRAM([[
|
||||
@%:@define _XOPEN_SOURCE_EXTENDED 1
|
||||
@%:@include <curses.h>
|
||||
]], [[
|
||||
chtype a = A_BOLD;
|
||||
int b = KEY_LEFT;
|
||||
chtype c = COLOR_PAIR(1) & A_COLOR;
|
||||
initscr();
|
||||
init_pair(1, COLOR_WHITE, COLOR_RED);
|
||||
]])],
|
||||
[ax_cv_plaincurses_color=yes],
|
||||
[ax_cv_plaincurses_color=no])
|
||||
])
|
||||
AS_IF([test "x$ax_cv_plaincurses_color" = xyes], [
|
||||
ax_cv_curses_color=yes
|
||||
AC_DEFINE([HAVE_CURSES_COLOR], [1], [Define to 1 if library supports color (enhanced functions)])
|
||||
])
|
||||
|
||||
# Check for obsolete functions
|
||||
|
||||
AC_CACHE_CHECK([for obsolete Curses functions], [ax_cv_plaincurses_obsolete], [
|
||||
AC_LINK_IFELSE([AC_LANG_PROGRAM([[
|
||||
@%:@include <curses.h>
|
||||
]], [[
|
||||
chtype a = A_BOLD;
|
||||
int b = KEY_LEFT;
|
||||
int g = getattrs(stdscr);
|
||||
int h = getcurx(stdscr) + getmaxx(stdscr);
|
||||
initscr();
|
||||
]])],
|
||||
[ax_cv_plaincurses_obsolete=yes],
|
||||
[ax_cv_plaincurses_obsolete=no])
|
||||
])
|
||||
AS_IF([test "x$ax_cv_plaincurses_obsolete" = xyes], [
|
||||
ax_cv_curses_obsolete=yes
|
||||
AC_DEFINE([HAVE_CURSES_OBSOLETE], [1], [Define to 1 if library supports certain obsolete features])
|
||||
])
|
||||
])
|
||||
|
||||
AS_IF([test "x$ax_cv_header_curses_h" = xno], [
|
||||
AC_MSG_WARN([could not find a working curses.h])
|
||||
])
|
||||
])
|
||||
])
|
||||
|
||||
AS_IF([test "x$ax_cv_curses" != xyes], [ax_cv_curses=no])
|
||||
AS_IF([test "x$ax_cv_curses_enhanced" != xyes], [ax_cv_curses_enhanced=no])
|
||||
AS_IF([test "x$ax_cv_curses_color" != xyes], [ax_cv_curses_color=no])
|
||||
AS_IF([test "x$ax_cv_curses_obsolete" != xyes], [ax_cv_curses_obsolete=no])
|
||||
|
||||
LIBS=$ax_saved_LIBS
|
||||
])dnl
|
@ -1,3 +0,0 @@
|
||||
# -*- Makefile -*-
|
||||
|
||||
dist_man8_MANS = bmon.8
|
237
man/bmon.8
@ -1,237 +0,0 @@
|
||||
.TH "bmon" "8" "" "Bandwidth Monitor" "bmon"
|
||||
.SH "NAME"
|
||||
bmon \- bandwidth monitor and rate estimator
|
||||
.SH "SYNOPSIS"
|
||||
.B bmon
|
||||
[\fB\-\-show\-all\fR]
|
||||
[\fB\-\-use\-si\fR]
|
||||
[\fB\-\-input\fR=\fIMODULE\fR]
|
||||
[\fB\-\-output\fR=\fIMODULE\fR]
|
||||
[OPTIONS...]
|
||||
|
||||
.SH "DESCRIPTION"
|
||||
bmon is a monitoring and debugging tool to capture networking related
|
||||
statistics and prepare them visually in a human friendly way. It
|
||||
features various output methods including an interactive curses user
|
||||
interface and a programmable text output for scripting.
|
||||
|
||||
.SH "OPTIONS"
|
||||
.PP
|
||||
\fB \-h\fR, \fB\-\-help\fR
|
||||
.RS 4
|
||||
Prints a short help text and exits\&.
|
||||
.RE
|
||||
.PP
|
||||
\fB \-V\fR, \fB\-\-version\fR
|
||||
.RS 4
|
||||
Prints the versioning identifier and exits\&.
|
||||
.RE
|
||||
.PP
|
||||
\fB \-i\fR, \fB\-\-input=\fRMODULE[:OPTIONS][,MODULE...]
|
||||
.RS 4
|
||||
Set list of input modules to load and use. Multiple modules can be used
|
||||
in parallel. bmon automatically loads a useful and working input module
|
||||
by default. See INPUT MODULES for more details.
|
||||
.RE
|
||||
.PP
|
||||
\fB \-o\fR, \fB\-\-output\fRMODULE[:OPTIONS][,MODULE...]
|
||||
.RS 4
|
||||
Set list of output modules to load and use. Multiple modules can be used
|
||||
in parallel. By default, bmon will use the curses output mode, if that is
|
||||
not available due to an incompatible console it will fall back to a simple
|
||||
text mode. See OUTPUT MODULES for more details.
|
||||
.RE
|
||||
.PP
|
||||
\fB \-U\fR, \fB\-\-use\-si\fR
|
||||
.RS 4
|
||||
Use SI unit system (1KB = 1'000 bytes) instead of 1KB = 1'024 bytes.
|
||||
.RE
|
||||
.PP
|
||||
\fB \-f\fR, \fB\-\-configfile=\fRFILE
|
||||
.RS 4
|
||||
Set alternative path to configuration file.
|
||||
.RE
|
||||
.PP
|
||||
\fB \-p\fR, \fB\-\-policy=\fRPOLICY
|
||||
.RS 4
|
||||
Set policy defining which network interfaces to display. See
|
||||
INTERFACE SELECTION for more details.
|
||||
.RE
|
||||
.PP
|
||||
\fB \-a\fR, \fB\-\-show\-all=\fR
|
||||
.RS 4
|
||||
Display all interfaces, even interface that are administratively down.
|
||||
.RE
|
||||
.PP
|
||||
\fB \-r\fR, \fB\-\-read\-interval=\fRFLOAT
|
||||
.RS 4
|
||||
Set interval in seconds in which input modules read statistics from their
|
||||
source. The default is 1.0 seconds.
|
||||
.RE
|
||||
.PP
|
||||
\fB \-R\fR, \fB\-\-rate\-interval=\fRFLOAT
|
||||
.RS 4
|
||||
Set interval in seconds in which the rate per counter is calculated.
|
||||
The default is 1.0 seconds.
|
||||
.RE
|
||||
.PP
|
||||
\fB \-b\fR, \fB\-\-use\-bit\fR
|
||||
.RS 4
|
||||
Show rates in bits per second instead of bytes per second.
|
||||
.RE
|
||||
.PP
|
||||
\fB \-L\fR, \fB\-\-lifetime=\fRFLOAT
|
||||
.RS 4
|
||||
Set lifetime of an element in seconds before it is no longer displayed
|
||||
without receiving any statistical updates. The default is 30 seconds.
|
||||
.RE
|
||||
|
||||
.SH "INPUT MODULES"
|
||||
.PP
|
||||
Input modules provide statistical data about elements. Each element consists
|
||||
of attributes which represents a counter, a rate, or a percentage. Elements
|
||||
may carry additional child elements to represent a hierarchy. Each element is
|
||||
assigned to a group defined by the input module. Input modules are polled in
|
||||
the frequence of the configured read interval.
|
||||
.PP
|
||||
The following input modules are available:
|
||||
.TP
|
||||
\fBnetlink\fR
|
||||
Uses the Netlink protocol to collect interface and traffic control statistics
|
||||
from the kernel. This is the default input module.
|
||||
|
||||
.TP
|
||||
\fBproc\fR
|
||||
Reads interface statistics from the /proc/net/dev file. This is considered a
|
||||
legacy interface and provided for backwards compatibily reasons. This is a
|
||||
fallback module if the Netlink interface is not available.
|
||||
|
||||
.TP
|
||||
\fBdummy\fR
|
||||
Programmable input module for debugging and testing purposes.
|
||||
|
||||
.TP
|
||||
\fBnull\fR
|
||||
No data collected.
|
||||
|
||||
.PP
|
||||
To receive additional information about a module, run the module with the
|
||||
"help" option set like this:
|
||||
|
||||
.PP
|
||||
.RS 4
|
||||
bmon \-i netlink:help
|
||||
.RE
|
||||
|
||||
See MODULE CONFIGURATION for more details.
|
||||
|
||||
.SH "OUTPUT MODULES"
|
||||
.PP
|
||||
Output modules display or export the statistical data collected by input
|
||||
modules. Multiple output modules can be run at the same time. bmon will
|
||||
not prevent possible conflicts such as multiple output modules writing to
|
||||
the console.
|
||||
.PP
|
||||
The following output modules exist:
|
||||
|
||||
.TP
|
||||
\fBcurses\fR
|
||||
Interactive curses based text user interface providing real time rate
|
||||
estimations and a graphical representatio nof each attribute. Press '?'
|
||||
to display the quick reference guide. This is the default output mode.
|
||||
|
||||
.TP
|
||||
\fBascii\fR
|
||||
Simple programmable text output intended for human consumption. Capable
|
||||
of printing list of interfaces, detailed counters and graphs to the
|
||||
console. This is the default fallback output mode if curses is not
|
||||
available.
|
||||
|
||||
.TP
|
||||
\fBformat\fR
|
||||
Fully scriptable output mode inteded for consumption by other programs.
|
||||
See the module help text for additional information.
|
||||
|
||||
.TP
|
||||
\fBnull\fR
|
||||
Disable output.
|
||||
|
||||
.PP
|
||||
To receive additional information about a module, run the module with the
|
||||
"help" option set like this:
|
||||
|
||||
.PP
|
||||
.RS 4
|
||||
bmon \-o curses:help
|
||||
.RE
|
||||
|
||||
See MODULE CONFIGURATION for more details.
|
||||
|
||||
.SH "MODULE CONFIGURATION"
|
||||
.PP
|
||||
The syntax to configure modules is as follows:
|
||||
.PP
|
||||
.RS 4
|
||||
ARGUMENT ::= mod1[:OPTS][,mod2[:OPTS]...]
|
||||
.br
|
||||
OPTS ::= OPTION[;OPTION...]
|
||||
.br
|
||||
OPTION ::= option[=value]
|
||||
.RE
|
||||
|
||||
.PP
|
||||
Run the module with option "help" to receive the list of options for each
|
||||
module:
|
||||
|
||||
.PP
|
||||
.RS 4
|
||||
bmon \-i module:help
|
||||
.RE
|
||||
|
||||
.SH "INTERFACE SELECTION"
|
||||
.PP
|
||||
The following syntax is used to define the interface selection policy:
|
||||
.PP
|
||||
.RS 4
|
||||
SELECTION ::= NAME[,NAME[,...]]
|
||||
.br
|
||||
NAME ::= [!]interface
|
||||
.RE
|
||||
|
||||
.PP
|
||||
The interface name may contain the character '*' which will act as a wildcard
|
||||
and represents any number of any character type, e.g. eth*, h*0, ...
|
||||
|
||||
.PP
|
||||
Examples:
|
||||
|
||||
.PP
|
||||
.RS 4
|
||||
lo,eth0,eth1
|
||||
.br
|
||||
eth*,!eth0
|
||||
.RE
|
||||
|
||||
.SH "EXAMPLES"
|
||||
.PP
|
||||
To run bmon in curses mode monitoring the interfaces eth0
|
||||
and eth1:
|
||||
.PP
|
||||
.RS 4
|
||||
\fBbmon \-p eth0,eth1 \-o curses\fP
|
||||
.RE
|
||||
|
||||
.SH "FILES"
|
||||
/etc/bmon.conf
|
||||
.br
|
||||
$HOME/.bmonrc
|
||||
|
||||
.SH "SEE ALSO"
|
||||
.PP
|
||||
\fBip\fR(8),
|
||||
\fBnetstat\fR(8),
|
||||
\fBifconfig\fR(8),
|
||||
\fBnetlink\fR(7),
|
||||
|
||||
.SH "AUTHOR"
|
||||
Thomas Graf <tgraf@suug.ch> among others
|
1
params.json
Normal file
@ -0,0 +1 @@
|
||||
{"name":"Bmon","tagline":"bandwidth monitor and rate estimator","body":"# bmon\r\n\r\n## bandwidth monitor and rate estimator\r\n\r\nbmon is a monitoring and debugging tool to capture networking related\r\nstatistics and prepare them visually in a human friendly way. It\r\nfeatures various output methods including an interactive curses user\r\ninterface and a programmable text output for scripting.","google":"","note":"Don't delete this file! It's used internally to help with page regeneration."}
|
2
src/.gitignore
vendored
@ -1,2 +0,0 @@
|
||||
*.o
|
||||
bmon
|
@ -1,44 +0,0 @@
|
||||
# -*- Makefile -*-
|
||||
|
||||
bin_PROGRAMS = bmon
|
||||
|
||||
bmon_CFLAGS = \
|
||||
-I${top_srcdir}/include \
|
||||
-I${top_builddir}/include \
|
||||
-DSYSCONFDIR=\"$(sysconfdir)\" \
|
||||
-D_GNU_SOURCE \
|
||||
-Wall \
|
||||
$(CURSES_CFLAGS) \
|
||||
$(CONFUSE_CFLAGS) \
|
||||
$(LIBNL_CFLAGS) \
|
||||
$(LIBNL_ROUTE_CFLAGS)
|
||||
|
||||
bmon_LDADD = \
|
||||
$(CURSES_LIB) \
|
||||
$(CONFUSE_LIBS) \
|
||||
$(LIBNL_LIBS) \
|
||||
$(LIBNL_ROUTE_LIBS)
|
||||
|
||||
bmon_SOURCES = \
|
||||
utils.c \
|
||||
unit.c \
|
||||
conf.c \
|
||||
input.c \
|
||||
output.c \
|
||||
group.c \
|
||||
element.c \
|
||||
attr.c \
|
||||
element_cfg.c \
|
||||
history.c \
|
||||
graph.c \
|
||||
bmon.c \
|
||||
module.c \
|
||||
in_netlink.c \
|
||||
in_null.c \
|
||||
in_dummy.c \
|
||||
in_proc.c \
|
||||
in_sysctl.c \
|
||||
out_null.c \
|
||||
out_format.c \
|
||||
out_ascii.c \
|
||||
out_curses.c
|
635
src/attr.c
@ -1,635 +0,0 @@
|
||||
/*
|
||||
* attr.c Attributes
|
||||
*
|
||||
* Copyright (c) 2001-2013 Thomas Graf <tgraf@suug.ch>
|
||||
* Copyright (c) 2013 Red Hat, Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included
|
||||
* in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <bmon/bmon.h>
|
||||
#include <bmon/conf.h>
|
||||
#include <bmon/attr.h>
|
||||
#include <bmon/history.h>
|
||||
#include <bmon/element.h>
|
||||
#include <bmon/unit.h>
|
||||
#include <bmon/input.h>
|
||||
#include <bmon/utils.h>
|
||||
|
||||
#if 0
|
||||
|
||||
#define MAX_POLICY 255
|
||||
|
||||
static char * allowed_attrs[MAX_POLICY];
|
||||
static char * denied_attrs[MAX_POLICY];
|
||||
static int allow_all_attrs;
|
||||
|
||||
#endif
|
||||
|
||||
static LIST_HEAD(attr_def_list);
|
||||
static int attr_id_gen = 1;
|
||||
|
||||
struct attr_def *attr_def_lookup(const char *name)
|
||||
{
|
||||
struct attr_def *def;
|
||||
|
||||
list_for_each_entry(def, &attr_def_list, ad_list)
|
||||
if (!strcmp(name, def->ad_name))
|
||||
return def;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
struct attr_def *attr_def_lookup_id(int id)
|
||||
{
|
||||
struct attr_def *def;
|
||||
|
||||
list_for_each_entry(def, &attr_def_list, ad_list)
|
||||
if (def->ad_id == id)
|
||||
return def;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#if 0
|
||||
int foreach_attr_type(int (*cb)(struct attr_type *, void *), void *arg)
|
||||
{
|
||||
int i, err = 0;
|
||||
|
||||
for (i = 0; i < NAME_HASHSIZ; i++) {
|
||||
struct attr_type *t;
|
||||
for (t = attr_ht_name[i]; t; t = t->at_next_name) {
|
||||
err = cb(t, arg);
|
||||
if (err < 0)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
#endif
|
||||
|
||||
int attr_def_add(const char *name, const char *desc, struct unit *unit,
|
||||
int type, int flags)
|
||||
{
|
||||
struct attr_def *def;
|
||||
|
||||
if ((def = attr_def_lookup(name)))
|
||||
return def->ad_id;
|
||||
|
||||
def = xcalloc(1, sizeof(*def));
|
||||
|
||||
def->ad_id = attr_id_gen++;
|
||||
def->ad_name = strdup(name);
|
||||
|
||||
def->ad_description = strdup(desc ? : "");
|
||||
def->ad_type = type;
|
||||
def->ad_unit = unit;
|
||||
def->ad_flags = flags;
|
||||
|
||||
list_add_tail(&def->ad_list, &attr_def_list);
|
||||
|
||||
DBG("New attribute %s desc=\"%s\" unit=%s type=%d",
|
||||
def->ad_name, def->ad_description, def->ad_unit->u_name, type);
|
||||
|
||||
return def->ad_id;
|
||||
}
|
||||
|
||||
static void attr_def_free(struct attr_def *def)
|
||||
{
|
||||
if (!def)
|
||||
return;
|
||||
|
||||
xfree(def->ad_name);
|
||||
xfree(def->ad_description);
|
||||
xfree(def);
|
||||
}
|
||||
|
||||
int attr_map_load(struct attr_map *map, size_t size)
|
||||
{
|
||||
int i, nfailed = 0;
|
||||
|
||||
for (i = 0; i < size; i++) {
|
||||
struct attr_map *m = &map[i];
|
||||
struct unit *u;
|
||||
|
||||
if (!(u = unit_lookup(m->unit))) {
|
||||
nfailed++;
|
||||
continue;
|
||||
}
|
||||
|
||||
m->attrid = attr_def_add(m->name, m->description, u,
|
||||
m->type, m->flags);
|
||||
}
|
||||
|
||||
return nfailed;
|
||||
}
|
||||
|
||||
static inline unsigned int attr_hash(int id)
|
||||
{
|
||||
return id % ATTR_HASH_SIZE;
|
||||
}
|
||||
|
||||
struct attr *attr_lookup(const struct element *e, int id)
|
||||
{
|
||||
unsigned int hash = attr_hash(id);
|
||||
struct attr *attr;
|
||||
|
||||
list_for_each_entry(attr, &e->e_attrhash[hash], a_list)
|
||||
if (attr->a_def->ad_id == id)
|
||||
return attr;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static int collect_history(struct element *e, struct attr_def *def)
|
||||
{
|
||||
int n;
|
||||
|
||||
if (def->ad_flags & ATTR_FORCE_HISTORY)
|
||||
return 1;
|
||||
|
||||
for (n = 0; n <= GT_MAX; n++)
|
||||
if (e->e_key_attr[n] == def)
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
#if 0
|
||||
if (!allowed_attrs[0] && !denied_attrs[0]) {
|
||||
if (!strcmp(ad->ad_name, "bytes") ||
|
||||
!strcmp(ad->ad_name, "packets"))
|
||||
return 1;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!allowed_attrs[0]) {
|
||||
for (n = 0; n < MAX_POLICY && denied_attrs[n]; n++)
|
||||
if (!strcasecmp(denied_attrs[n], ad->ad_name))
|
||||
return 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
for (n = 0; n < MAX_POLICY && denied_attrs[n]; n++)
|
||||
if (!strcasecmp(denied_attrs[n], ad->ad_name))
|
||||
return 0;
|
||||
|
||||
for (n=0; n < MAX_POLICY && allowed_attrs[n]; n++)
|
||||
if (!strcasecmp(allowed_attrs[n], ad->ad_name))
|
||||
return 1;
|
||||
#endif
|
||||
}
|
||||
|
||||
#if 0
|
||||
|
||||
void attr_parse_policy(const char *policy)
|
||||
{
|
||||
static int set = 0;
|
||||
int i, a = 0, d = 0, f = 0;
|
||||
char *p, *s;
|
||||
|
||||
if (set)
|
||||
return;
|
||||
set = 1;
|
||||
|
||||
if (!strcasecmp(policy, "all")) {
|
||||
allow_all_attrs = 1;
|
||||
return ;
|
||||
}
|
||||
|
||||
s = strdup(policy);
|
||||
|
||||
for (i = 0, p = s; ; i++) {
|
||||
if (s[i] == ',' || s[i] == '\0') {
|
||||
|
||||
f = s[i] == '\0' ? 1 : 0;
|
||||
s[i] = '\0';
|
||||
|
||||
if ('!' == *p) {
|
||||
if (d > (MAX_POLICY - 1))
|
||||
break;
|
||||
denied_attrs[d++] = strdup(++p);
|
||||
} else {
|
||||
if(a > (MAX_POLICY - 1))
|
||||
break;
|
||||
allowed_attrs[a++] = strdup(p);
|
||||
}
|
||||
|
||||
if (f)
|
||||
break;
|
||||
|
||||
p = &s[i+1];
|
||||
}
|
||||
}
|
||||
|
||||
xfree(s);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
void attr_start_collecting_history(struct attr *attr)
|
||||
{
|
||||
if (attr->a_flags & ATTR_DOING_HISTORY)
|
||||
return;
|
||||
|
||||
DBG("Starting to collect history for attribute %s",
|
||||
attr->a_def->ad_name);
|
||||
|
||||
history_attach(attr);
|
||||
attr->a_flags |= ATTR_DOING_HISTORY;
|
||||
}
|
||||
|
||||
static int attrcmp(struct element *e, struct attr *a, struct attr *b)
|
||||
{
|
||||
/* major key attribute is always first */
|
||||
if (e->e_key_attr[GT_MAJOR] == b->a_def)
|
||||
return 1;
|
||||
|
||||
/* minor key attribte is always second */
|
||||
if (e->e_key_attr[GT_MINOR] == b->a_def)
|
||||
return (e->e_key_attr[GT_MAJOR] == a->a_def) ? -1 : 1;
|
||||
|
||||
/* otherwise sort by alphabet */
|
||||
return strcasecmp(a->a_def->ad_description, b->a_def->ad_description);
|
||||
}
|
||||
|
||||
void attr_update(struct element *e, int id, uint64_t rx, uint64_t tx, int flags)
|
||||
{
|
||||
struct attr *attr, *n;
|
||||
int update_ts = 0;
|
||||
|
||||
if (!(attr = attr_lookup(e, id))) {
|
||||
unsigned int hash = attr_hash(id);
|
||||
struct attr_def *def;
|
||||
|
||||
if (!(def = attr_def_lookup_id(id)))
|
||||
return;
|
||||
|
||||
DBG("Tracking new attribute %d (\"%s\") of element %s",
|
||||
def->ad_id, def->ad_name, e->e_name);
|
||||
|
||||
attr = xcalloc(1, sizeof(*attr));
|
||||
attr->a_def = def;
|
||||
attr->a_flags = def->ad_flags;
|
||||
|
||||
init_list_head(&attr->a_history_list);
|
||||
|
||||
if (collect_history(e, def))
|
||||
attr_start_collecting_history(attr);
|
||||
|
||||
list_add_tail(&attr->a_list, &e->e_attrhash[hash]);
|
||||
e->e_nattrs++;
|
||||
|
||||
list_for_each_entry(n, &e->e_attr_sorted, a_sort_list) {
|
||||
if (attrcmp(e, attr, n) < 0) {
|
||||
list_add_tail(&attr->a_sort_list,
|
||||
&n->a_sort_list);
|
||||
goto inserted;
|
||||
}
|
||||
}
|
||||
|
||||
list_add_tail(&attr->a_sort_list, &e->e_attr_sorted);
|
||||
}
|
||||
|
||||
inserted:
|
||||
if (flags & UPDATE_FLAG_RX) {
|
||||
attr->a_rx_rate.r_current = rx;
|
||||
attr->a_flags |= ATTR_RX_ENABLED;
|
||||
update_ts = 1;
|
||||
}
|
||||
|
||||
if (flags & UPDATE_FLAG_TX) {
|
||||
attr->a_tx_rate.r_current = tx;
|
||||
attr->a_flags |= ATTR_TX_ENABLED;
|
||||
update_ts = 1;
|
||||
}
|
||||
|
||||
if (update_ts)
|
||||
update_timestamp(&attr->a_last_update);
|
||||
|
||||
DBG("Updated attribute %d (\"%s\") of element %s", id, attr->a_def->ad_name, e->e_name);
|
||||
}
|
||||
|
||||
void attr_free(struct attr *a)
|
||||
{
|
||||
struct history *h, *n;
|
||||
|
||||
list_for_each_entry_safe(h, n, &a->a_history_list, h_list)
|
||||
history_free(h);
|
||||
|
||||
list_del(&a->a_list);
|
||||
|
||||
xfree(a);
|
||||
}
|
||||
|
||||
void attr_rate2float(struct attr *a, double *rx, char **rxu, int *rxprec,
|
||||
double *tx, char **txu, int *txprec)
|
||||
{
|
||||
struct unit *u = a->a_def->ad_unit;
|
||||
|
||||
*rx = unit_value2str(a->a_rx_rate.r_rate, u, rxu, rxprec);
|
||||
*tx = unit_value2str(a->a_tx_rate.r_rate, u, txu, txprec);
|
||||
}
|
||||
|
||||
struct attr *attr_select_first(void)
|
||||
{
|
||||
struct element *e;
|
||||
|
||||
if (!(e = element_current()))
|
||||
return NULL;
|
||||
|
||||
if (list_empty(&e->e_attr_sorted))
|
||||
e->e_current_attr = NULL;
|
||||
else
|
||||
e->e_current_attr = list_first_entry(&e->e_attr_sorted,
|
||||
struct attr, a_sort_list);
|
||||
|
||||
return e->e_current_attr;
|
||||
}
|
||||
|
||||
struct attr *attr_select_last(void)
|
||||
{
|
||||
struct element *e;
|
||||
|
||||
if (!(e = element_current()))
|
||||
return NULL;
|
||||
|
||||
if (list_empty(&e->e_attr_sorted))
|
||||
e->e_current_attr = NULL;
|
||||
else
|
||||
e->e_current_attr = list_entry(&e->e_attr_sorted,
|
||||
struct attr, a_sort_list);
|
||||
|
||||
return e->e_current_attr;
|
||||
}
|
||||
|
||||
struct attr *attr_select_next(void)
|
||||
{
|
||||
struct element *e;
|
||||
struct attr *a;
|
||||
|
||||
if (!(e = element_current()))
|
||||
return NULL;
|
||||
|
||||
if (!(a = e->e_current_attr))
|
||||
return attr_select_first();
|
||||
|
||||
if (a->a_sort_list.next != &e->e_attr_sorted)
|
||||
e->e_current_attr = list_entry(a->a_sort_list.next,
|
||||
struct attr, a_sort_list);
|
||||
else
|
||||
return attr_select_first();
|
||||
|
||||
return e->e_current_attr;
|
||||
}
|
||||
|
||||
struct attr *attr_select_prev(void)
|
||||
{
|
||||
struct element *e;
|
||||
struct attr *a;
|
||||
|
||||
if (!(e = element_current()))
|
||||
return NULL;
|
||||
|
||||
if (!(a = e->e_current_attr))
|
||||
return attr_select_last();
|
||||
|
||||
if (a->a_sort_list.prev != &e->e_attr_sorted)
|
||||
e->e_current_attr = list_entry(a->a_sort_list.prev,
|
||||
struct attr, a_sort_list);
|
||||
else
|
||||
return attr_select_last();
|
||||
|
||||
return e->e_current_attr;
|
||||
|
||||
}
|
||||
|
||||
struct attr *attr_current(void)
|
||||
{
|
||||
struct element *e;
|
||||
|
||||
if (!(e = element_current()))
|
||||
return NULL;
|
||||
|
||||
if (!e->e_current_attr)
|
||||
return attr_select_first();
|
||||
|
||||
return e->e_current_attr;
|
||||
}
|
||||
|
||||
#if 0
|
||||
int __first_attr(struct item *item, int graph)
|
||||
{
|
||||
int i;
|
||||
struct attr *a;
|
||||
|
||||
for (i = 0; i < ATTR_HASH_MAX; i++) {
|
||||
for (a = item->i_attrs[i]; a; a = a->a_next) {
|
||||
if (a->a_flags & ATTR_FLAG_HISTORY) {
|
||||
item->i_attr_sel[graph] = a;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return EMPTY_LIST;
|
||||
}
|
||||
|
||||
int __next_attr(struct item *item, int graph)
|
||||
{
|
||||
int hash;
|
||||
struct attr *attr, *next;
|
||||
|
||||
if (item->i_attr_sel[graph] == NULL)
|
||||
return __first_attr(item, graph);
|
||||
|
||||
attr = item->i_attr_sel[graph];
|
||||
hash = attr_hash(attr->a_def->ad_id);
|
||||
next = attr->a_next;
|
||||
|
||||
if (next == NULL)
|
||||
hash++;
|
||||
|
||||
for (; hash < ATTR_HASH_MAX; hash++) {
|
||||
if (next) {
|
||||
attr = next;
|
||||
next = NULL;
|
||||
} else
|
||||
attr = item->i_attrs[hash];
|
||||
|
||||
for (; attr; attr = attr->a_next) {
|
||||
if (!(attr->a_flags & ATTR_FLAG_HISTORY))
|
||||
continue;
|
||||
item->i_attr_sel[graph] = attr;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
return __first_attr(item, graph);
|
||||
}
|
||||
|
||||
struct attr *attr_current(struct item *item, int graph)
|
||||
{
|
||||
if (item->i_attr_sel[graph] == NULL)
|
||||
__first_attr(item, graph);
|
||||
|
||||
return item->i_attr_sel[graph];
|
||||
}
|
||||
|
||||
int attr_first(void)
|
||||
{
|
||||
struct item *item = item_current();
|
||||
|
||||
if (item == NULL)
|
||||
return EMPTY_LIST;
|
||||
|
||||
return __first_attr(item, item->i_graph_sel);
|
||||
}
|
||||
|
||||
int attr_next(void)
|
||||
{
|
||||
struct item *item = item_current();
|
||||
|
||||
if (item == NULL)
|
||||
return EMPTY_LIST;
|
||||
|
||||
return __next_attr(item, item->i_graph_sel);
|
||||
}
|
||||
#endif
|
||||
|
||||
static float __calc_usage(double rate, uint64_t max)
|
||||
{
|
||||
if (!max)
|
||||
return FLT_MAX;
|
||||
|
||||
if (!rate)
|
||||
return 0.0f;
|
||||
|
||||
return 100.0f / ((double) max / (rate * cfg_rate_interval));
|
||||
}
|
||||
|
||||
void attr_calc_usage(struct attr *a, float *rx, float *tx,
|
||||
uint64_t rxmax, uint64_t txmax)
|
||||
{
|
||||
if (a->a_def->ad_type == ATTR_TYPE_PERCENT) {
|
||||
*rx = a->a_rx_rate.r_total;
|
||||
*tx = a->a_tx_rate.r_total;
|
||||
} else {
|
||||
*rx = __calc_usage(a->a_rx_rate.r_rate, rxmax);
|
||||
*tx = __calc_usage(a->a_tx_rate.r_rate, txmax);
|
||||
}
|
||||
}
|
||||
|
||||
static void calc_counter_rate(struct attr *a, struct rate *rate,
|
||||
timestamp_t *ts)
|
||||
{
|
||||
uint64_t delta, prev_total;
|
||||
float diff, old_rate;
|
||||
|
||||
if (rate->r_current < rate->r_prev) {
|
||||
/* Overflow detected */
|
||||
if (a->a_flags & ATTR_IGNORE_OVERFLOWS)
|
||||
delta = rate->r_current;
|
||||
else {
|
||||
if (a->a_flags & ATTR_TRUE_64BIT)
|
||||
delta = 0xFFFFFFFFFFFFFFFFULL - rate->r_prev;
|
||||
else
|
||||
delta = 0xFFFFFFFFULL - rate->r_prev;
|
||||
|
||||
delta += rate->r_current + 1;
|
||||
}
|
||||
} else
|
||||
delta = rate->r_current - rate->r_prev;
|
||||
|
||||
prev_total = rate->r_total;
|
||||
rate->r_total += delta;
|
||||
rate->r_prev = rate->r_current;
|
||||
|
||||
if (!prev_total) {
|
||||
/*
|
||||
* No previous records exists, reset time to now to
|
||||
* avoid doing unnecessary calculation, this behaviour
|
||||
* continues as long as the counter stays 0.
|
||||
*/
|
||||
goto out;
|
||||
}
|
||||
|
||||
diff = timestamp_diff(&rate->r_last_calc, ts);
|
||||
if (diff < (cfg_rate_interval - cfg_rate_variance))
|
||||
return;
|
||||
|
||||
old_rate = rate->r_rate;
|
||||
|
||||
if (rate->r_total < prev_total) {
|
||||
/* overflow */
|
||||
delta = 0xFFFFFFFFFFFFFFFFULL - prev_total;
|
||||
delta += rate->r_total + 1;
|
||||
} else
|
||||
delta = rate->r_total - prev_total;
|
||||
|
||||
rate->r_rate = delta / diff;
|
||||
|
||||
if (old_rate)
|
||||
rate->r_rate = ((rate->r_rate * 3.0f) + old_rate) / 4.0f;
|
||||
|
||||
out:
|
||||
copy_timestamp(&rate->r_last_calc, ts);
|
||||
}
|
||||
|
||||
static void calc_rate_total(struct attr *a, struct rate *rate, timestamp_t *ts)
|
||||
{
|
||||
rate->r_prev = rate->r_rate = rate->r_total = rate->r_current;
|
||||
copy_timestamp(&rate->r_last_calc, ts);
|
||||
}
|
||||
|
||||
void attr_notify_update(struct attr *a, timestamp_t *ts)
|
||||
{
|
||||
switch (a->a_def->ad_type) {
|
||||
case ATTR_TYPE_RATE:
|
||||
case ATTR_TYPE_PERCENT:
|
||||
calc_rate_total(a, &a->a_rx_rate, ts);
|
||||
calc_rate_total(a, &a->a_tx_rate, ts);
|
||||
break;
|
||||
|
||||
case ATTR_TYPE_COUNTER:
|
||||
calc_counter_rate(a, &a->a_rx_rate, ts);
|
||||
calc_counter_rate(a, &a->a_tx_rate, ts);
|
||||
break;
|
||||
default:
|
||||
DBG("Attribute update of unknown type");
|
||||
break;
|
||||
}
|
||||
|
||||
if (a->a_flags & ATTR_DOING_HISTORY) {
|
||||
struct history *h;
|
||||
|
||||
DBG("Updating history of attribute %d (\"%s\")", a->a_def->ad_id, a->a_def->ad_name);
|
||||
|
||||
list_for_each_entry(h, &a->a_history_list, h_list)
|
||||
history_update(a, h, ts);
|
||||
}
|
||||
}
|
||||
|
||||
static void __exit attr_exit(void)
|
||||
{
|
||||
struct attr_def *ad, *n;
|
||||
|
||||
list_for_each_entry_safe(ad, n, &attr_def_list, ad_list)
|
||||
attr_def_free(ad);
|
||||
}
|
390
src/bmon.c
@ -1,390 +0,0 @@
|
||||
/*
|
||||
* src/bmon.c Bandwidth Monitor
|
||||
*
|
||||
* Copyright (c) 2001-2013 Thomas Graf <tgraf@suug.ch>
|
||||
* Copyright (c) 2013 Red Hat, Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included
|
||||
* in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <bmon/bmon.h>
|
||||
#include <bmon/conf.h>
|
||||
#include <bmon/attr.h>
|
||||
#include <bmon/utils.h>
|
||||
#include <bmon/input.h>
|
||||
#include <bmon/output.h>
|
||||
#include <bmon/module.h>
|
||||
#include <bmon/group.h>
|
||||
|
||||
int start_time;
|
||||
|
||||
struct reader_timing rtiming;
|
||||
|
||||
static char *usage_text =
|
||||
"Usage: bmon [OPTION]...\n" \
|
||||
"\n" \
|
||||
"Options:\n" \
|
||||
"Startup:\n" \
|
||||
" -i, --input=MODPARM Input module(s)\n" \
|
||||
" -o, --output=MODPARM Output module(s)\n" \
|
||||
" -f, --configfile=PATH Alternative path to configuration file\n" \
|
||||
" -h, --help Show this help text\n" \
|
||||
" -V, --version Show version\n" \
|
||||
"\n" \
|
||||
"Input:\n" \
|
||||
" -p, --policy=POLICY Element display policy (see below)\n" \
|
||||
" -a, --show-all Show all elements (even disabled elements)\n" \
|
||||
" -r, --read-interval=FLOAT Read interval in seconds (float)\n" \
|
||||
" -R, --rate-interval=FLOAT Rate interval in seconds (float)\n" \
|
||||
" -s, --sleep-interval=FLOAT Sleep time in seconds (float)\n" \
|
||||
" -L, --lifetime=LIFETIME Lifetime of an element in seconds (float)\n" \
|
||||
"\n" \
|
||||
"Output:\n" \
|
||||
" -U, --use-si Use SI units\n" \
|
||||
" -b, --use-bit Display in bits instead of bytes\n" \
|
||||
"\n" \
|
||||
"Module configuration:\n" \
|
||||
" modparm := MODULE:optlist,MODULE:optlist,...\n" \
|
||||
" optlist := option;option;...\n" \
|
||||
" option := TYPE[=VALUE]\n" \
|
||||
"\n" \
|
||||
" Examples:\n" \
|
||||
" -o curses:ngraph=2\n" \
|
||||
" -o list # Shows a list of available modules\n" \
|
||||
" -o curses:help # Shows a help text for html module\n" \
|
||||
"\n" \
|
||||
"Interface selection:\n" \
|
||||
" policy := [!]simple_regexp,[!]simple_regexp,...\n" \
|
||||
"\n" \
|
||||
" Example: -p 'eth*,lo*,!eth1'\n" \
|
||||
"\n" \
|
||||
"Please see the bmon(1) man pages for full documentation.\n";
|
||||
|
||||
static void do_shutdown(void)
|
||||
{
|
||||
static int done;
|
||||
|
||||
if (!done) {
|
||||
done = 1;
|
||||
module_shutdown();
|
||||
}
|
||||
}
|
||||
|
||||
static void sig_exit(void)
|
||||
{
|
||||
do_shutdown();
|
||||
}
|
||||
|
||||
void quit(const char *fmt, ...)
|
||||
{
|
||||
static int done;
|
||||
va_list args;
|
||||
|
||||
va_start(args, fmt);
|
||||
vfprintf(stderr, fmt, args);
|
||||
va_end(args);
|
||||
|
||||
if (!done) {
|
||||
done = 1;
|
||||
do_shutdown();
|
||||
}
|
||||
|
||||
exit(1);
|
||||
}
|
||||
|
||||
static inline void print_version(void)
|
||||
{
|
||||
printf("bmon %s\n", PACKAGE_VERSION);
|
||||
printf("Copyright (C) 2001-2015 by Thomas Graf <tgraf@suug.ch>\n");
|
||||
printf("Copyright (C) 2013 Red Hat, Inc.\n");
|
||||
printf("bmon comes with ABSOLUTELY NO WARRANTY. This is free " \
|
||||
"software, and you\nare welcome to redistribute it under " \
|
||||
"certain conditions. See the source\ncode for details.\n");
|
||||
}
|
||||
|
||||
static void parse_args_pre(int argc, char *argv[])
|
||||
{
|
||||
DBG("Parsing arguments pre state");
|
||||
|
||||
for (;;)
|
||||
{
|
||||
char *gostr = "+:hvVf:";
|
||||
|
||||
struct option long_opts[] = {
|
||||
{"help", 0, NULL, 'h'},
|
||||
{"version", 0, NULL, 'v'},
|
||||
{"configfile", 1, NULL, 'f'},
|
||||
{NULL, 0, NULL, 0},
|
||||
};
|
||||
int c = getopt_long(argc, argv, gostr, long_opts, NULL);
|
||||
if (c == -1)
|
||||
break;
|
||||
|
||||
switch (c)
|
||||
{
|
||||
case 'f':
|
||||
set_configfile(optarg);
|
||||
break;
|
||||
|
||||
case 'h':
|
||||
print_version();
|
||||
printf("\n%s", usage_text);
|
||||
exit(1);
|
||||
case 'V':
|
||||
case 'v':
|
||||
print_version();
|
||||
exit(0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static int parse_args_post(int argc, char *argv[])
|
||||
{
|
||||
DBG("Parsing arguments post state");
|
||||
|
||||
optind = 1;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
char *gostr = "i:o:p:r:R:s:aUb" \
|
||||
"L:hvVf:";
|
||||
|
||||
struct option long_opts[] = {
|
||||
{"input", 1, NULL, 'i'},
|
||||
{"output", 1, NULL, 'o'},
|
||||
{"policy", 1, NULL, 'p'},
|
||||
{"read-interval", 1, NULL, 'r'},
|
||||
{"rate-interval", 1, NULL, 'R'},
|
||||
{"sleep-interval", 1, NULL, 's'},
|
||||
{"show-all", 0, NULL, 'a'},
|
||||
{"use-si", 0, NULL, 'U'},
|
||||
{"use-bit", 0, NULL, 'b'},
|
||||
{"lifetime", 1, NULL, 'L'},
|
||||
{NULL, 0, NULL, 0},
|
||||
};
|
||||
int c = getopt_long(argc, argv, gostr, long_opts, NULL);
|
||||
if (c == -1)
|
||||
break;
|
||||
|
||||
switch (c)
|
||||
{
|
||||
case 'i':
|
||||
if (input_set(optarg))
|
||||
return 1;
|
||||
break;
|
||||
|
||||
case 'o':
|
||||
if (output_set(optarg))
|
||||
return 1;
|
||||
break;
|
||||
|
||||
case 'p':
|
||||
cfg_setstr(cfg, "policy", optarg);
|
||||
break;
|
||||
|
||||
case 'r':
|
||||
cfg_setfloat(cfg, "read_interval", strtod(optarg, NULL));
|
||||
break;
|
||||
|
||||
case 'R':
|
||||
cfg_setfloat(cfg, "rate_interval", strtod(optarg, NULL));
|
||||
break;
|
||||
|
||||
case 's':
|
||||
cfg_setint(cfg, "sleep_time", strtoul(optarg, NULL, 0));
|
||||
break;
|
||||
|
||||
case 'a':
|
||||
cfg_setbool(cfg, "show_all", cfg_true);
|
||||
break;
|
||||
|
||||
case 'U':
|
||||
cfg_setbool(cfg, "use_si", cfg_true);
|
||||
break;
|
||||
|
||||
case 'b':
|
||||
cfg_setbool(cfg, "use_bit", cfg_true);
|
||||
break;
|
||||
|
||||
case 'L':
|
||||
cfg_setint(cfg, "lifetime", strtoul(optarg, NULL, 0));
|
||||
break;
|
||||
|
||||
case 'f':
|
||||
/* Already handled in pre getopt loop */
|
||||
break;
|
||||
|
||||
default:
|
||||
quit("Aborting...\n");
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if 0
|
||||
static void calc_variance(timestamp_t *c, timestamp_t *ri)
|
||||
{
|
||||
float v = (ts_to_float(c) / ts_to_float(ri)) * 100.0f;
|
||||
|
||||
rtiming.rt_variance.v_error = v;
|
||||
rtiming.rt_variance.v_total += v;
|
||||
|
||||
if (v > rtiming.rt_variance.v_max)
|
||||
rtiming.rt_variance.v_max = v;
|
||||
|
||||
if (v < rtiming.rt_variance.v_min)
|
||||
rtiming.rt_variance.v_min = v;
|
||||
}
|
||||
#endif
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
unsigned long sleep_time;
|
||||
double read_interval;
|
||||
|
||||
start_time = time(NULL);
|
||||
memset(&rtiming, 0, sizeof(rtiming));
|
||||
rtiming.rt_variance.v_min = FLT_MAX;
|
||||
|
||||
/*
|
||||
* Early initialization before reading config
|
||||
*/
|
||||
conf_init_pre();
|
||||
parse_args_pre(argc, argv);
|
||||
|
||||
/*
|
||||
* Reading the configuration file */
|
||||
configfile_read();
|
||||
|
||||
/*
|
||||
* Late initialization after reading config
|
||||
*/
|
||||
if (parse_args_post(argc, argv))
|
||||
return 1;
|
||||
conf_init_post();
|
||||
|
||||
module_init();
|
||||
|
||||
read_interval = cfg_read_interval;
|
||||
sleep_time = cfg_getint(cfg, "sleep_time");
|
||||
|
||||
if (((double) sleep_time / 1000000.0f) > read_interval)
|
||||
sleep_time = (unsigned long) (read_interval * 1000000.0f);
|
||||
|
||||
DBG("Entering mainloop...");
|
||||
|
||||
do {
|
||||
/*
|
||||
* E := Elapsed time
|
||||
* NR := Next Read
|
||||
* LR := Last Read
|
||||
* RI := Read Interval
|
||||
* ST := Sleep Time
|
||||
* C := Correction
|
||||
*/
|
||||
timestamp_t e, ri, tmp;
|
||||
unsigned long st;
|
||||
|
||||
float_to_timestamp(&ri, read_interval);
|
||||
|
||||
/*
|
||||
* NR := NOW
|
||||
*/
|
||||
update_timestamp(&rtiming.rt_next_read);
|
||||
|
||||
for (;;) {
|
||||
output_pre();
|
||||
|
||||
/*
|
||||
* E := NOW
|
||||
*/
|
||||
update_timestamp(&e);
|
||||
|
||||
/*
|
||||
* IF NR <= E THEN
|
||||
*/
|
||||
if (timestamp_le(&rtiming.rt_next_read, &e)) {
|
||||
timestamp_t c;
|
||||
|
||||
/*
|
||||
* C := (NR - E)
|
||||
*/
|
||||
timestamp_sub(&c, &rtiming.rt_next_read, &e);
|
||||
|
||||
//calc_variance(&c, &ri);
|
||||
|
||||
/*
|
||||
* LR := E
|
||||
*/
|
||||
copy_timestamp(&rtiming.rt_last_read, &e);
|
||||
|
||||
/*
|
||||
* NR := E + RI + C
|
||||
*/
|
||||
timestamp_add(&rtiming.rt_next_read, &e, &ri);
|
||||
timestamp_add(&rtiming.rt_next_read,
|
||||
&rtiming.rt_next_read, &c);
|
||||
|
||||
|
||||
reset_update_flags();
|
||||
input_read();
|
||||
free_unused_elements();
|
||||
output_draw();
|
||||
output_post();
|
||||
}
|
||||
|
||||
/*
|
||||
* ST := Configured ST
|
||||
*/
|
||||
st = sleep_time;
|
||||
|
||||
/*
|
||||
* IF (NR - E) < ST THEN
|
||||
*/
|
||||
timestamp_sub(&tmp, &rtiming.rt_next_read, &e);
|
||||
|
||||
if (tmp.tv_sec < 0)
|
||||
continue;
|
||||
|
||||
if (tmp.tv_sec == 0 && tmp.tv_usec < st) {
|
||||
if (tmp.tv_usec < 0)
|
||||
continue;
|
||||
/*
|
||||
* ST := (NR - E)
|
||||
*/
|
||||
st = tmp.tv_usec;
|
||||
}
|
||||
|
||||
/*
|
||||
* SLEEP(ST)
|
||||
*/
|
||||
usleep(st);
|
||||
}
|
||||
} while (0);
|
||||
|
||||
return 0; /* buddha says i'll never be reached */
|
||||
}
|
||||
|
||||
static void __init bmon_init(void)
|
||||
{
|
||||
atexit(&sig_exit);
|
||||
}
|
608
src/conf.c
@ -1,608 +0,0 @@
|
||||
/*
|
||||
* conf.c Config Crap
|
||||
*
|
||||
* Copyright (c) 2001-2013 Thomas Graf <tgraf@suug.ch>
|
||||
* Copyright (c) 2013 Red Hat, Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included
|
||||
* in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <bmon/bmon.h>
|
||||
#include <bmon/conf.h>
|
||||
#include <bmon/unit.h>
|
||||
#include <bmon/attr.h>
|
||||
#include <bmon/element.h>
|
||||
#include <bmon/element_cfg.h>
|
||||
#include <bmon/history.h>
|
||||
#include <bmon/utils.h>
|
||||
|
||||
cfg_t *cfg;
|
||||
|
||||
static cfg_opt_t element_opts[] = {
|
||||
CFG_STR("description", NULL, CFGF_NONE),
|
||||
CFG_BOOL("show", cfg_true, CFGF_NONE),
|
||||
CFG_INT("rxmax", 0, CFGF_NONE),
|
||||
CFG_INT("txmax", 0, CFGF_NONE),
|
||||
CFG_INT("max", 0, CFGF_NONE),
|
||||
CFG_END()
|
||||
};
|
||||
|
||||
static cfg_opt_t history_opts[] = {
|
||||
CFG_FLOAT("interval", 1.0f, CFGF_NONE),
|
||||
CFG_INT("size", 60, CFGF_NONE),
|
||||
CFG_STR("type", "64bit", CFGF_NONE),
|
||||
CFG_END()
|
||||
};
|
||||
|
||||
static cfg_opt_t attr_opts[] = {
|
||||
CFG_STR("description", "", CFGF_NONE),
|
||||
CFG_STR("unit", "", CFGF_NONE),
|
||||
CFG_STR("type", "counter", CFGF_NONE),
|
||||
CFG_BOOL("history", cfg_false, CFGF_NONE),
|
||||
CFG_END()
|
||||
};
|
||||
|
||||
static cfg_opt_t variant_opts[] = {
|
||||
CFG_FLOAT_LIST("div", "{}", CFGF_NONE),
|
||||
CFG_STR_LIST("txt", "", CFGF_NONE),
|
||||
CFG_END()
|
||||
};
|
||||
|
||||
static cfg_opt_t unit_opts[] = {
|
||||
CFG_SEC("variant", variant_opts, CFGF_MULTI | CFGF_TITLE),
|
||||
CFG_END()
|
||||
};
|
||||
|
||||
static cfg_opt_t global_opts[] = {
|
||||
CFG_FLOAT("read_interval", 1.0f, CFGF_NONE),
|
||||
CFG_FLOAT("rate_interval", 1.0f, CFGF_NONE),
|
||||
CFG_FLOAT("lifetime", 30.0f, CFGF_NONE),
|
||||
CFG_FLOAT("history_variance", 0.1f, CFGF_NONE),
|
||||
CFG_FLOAT("variance", 0.1f, CFGF_NONE),
|
||||
CFG_BOOL("show_all", cfg_false, CFGF_NONE),
|
||||
CFG_INT("unit_exp", -1, CFGF_NONE),
|
||||
CFG_INT("sleep_time", 20000UL, CFGF_NONE),
|
||||
CFG_BOOL("use_si", 0, CFGF_NONE),
|
||||
CFG_BOOL("use_bit", 0, CFGF_NONE),
|
||||
CFG_STR("uid", NULL, CFGF_NONE),
|
||||
CFG_STR("gid", NULL, CFGF_NONE),
|
||||
CFG_STR("policy", "", CFGF_NONE),
|
||||
CFG_SEC("unit", unit_opts, CFGF_MULTI | CFGF_TITLE),
|
||||
CFG_SEC("attr", attr_opts, CFGF_MULTI | CFGF_TITLE),
|
||||
CFG_SEC("history", history_opts, CFGF_MULTI | CFGF_TITLE),
|
||||
CFG_SEC("element", element_opts, CFGF_MULTI | CFGF_TITLE),
|
||||
CFG_END()
|
||||
};
|
||||
|
||||
float cfg_read_interval;
|
||||
float cfg_rate_interval;
|
||||
float cfg_rate_variance;
|
||||
float cfg_history_variance;
|
||||
int cfg_show_all;
|
||||
int cfg_unit_exp = DYNAMIC_EXP;
|
||||
|
||||
static char * configfile = NULL;
|
||||
|
||||
#if defined HAVE_CURSES
|
||||
#if defined HAVE_USE_DEFAULT_COLORS
|
||||
struct layout cfg_layout[] =
|
||||
{
|
||||
{-1, -1, 0}, /* dummy, not used */
|
||||
{-1, -1, 0}, /* default */
|
||||
{-1, -1, A_REVERSE}, /* statusbar */
|
||||
{-1, -1, 0}, /* header */
|
||||
{-1, -1, 0}, /* list */
|
||||
{-1, -1, A_REVERSE}, /* selected */
|
||||
};
|
||||
#else
|
||||
struct layout cfg_layout[] =
|
||||
{
|
||||
{0, 0, 0}, /* dummy, not used */
|
||||
{COLOR_BLACK, COLOR_WHITE, 0}, /* default */
|
||||
{COLOR_BLACK, COLOR_WHITE, A_REVERSE}, /* statusbar */
|
||||
{COLOR_BLACK, COLOR_WHITE, 0}, /* header */
|
||||
{COLOR_BLACK, COLOR_WHITE, 0}, /* list */
|
||||
{COLOR_BLACK, COLOR_WHITE, A_REVERSE}, /* selected */
|
||||
};
|
||||
#endif
|
||||
#endif
|
||||
|
||||
tv_t * parse_tv(char *data)
|
||||
{
|
||||
char *value;
|
||||
tv_t *tv = xcalloc(1, sizeof(tv_t));
|
||||
|
||||
init_list_head(&tv->tv_list);
|
||||
|
||||
value = strchr(data, '=');
|
||||
|
||||
if (value) {
|
||||
*value = '\0';
|
||||
++value;
|
||||
tv->tv_value = strdup(value);
|
||||
}
|
||||
|
||||
tv->tv_type = strdup(data);
|
||||
return tv;
|
||||
}
|
||||
|
||||
module_conf_t * parse_module(char *data)
|
||||
{
|
||||
char *name = data, *opts = data, *next;
|
||||
module_conf_t *m;
|
||||
|
||||
if (!*name)
|
||||
quit("No module name given");
|
||||
|
||||
m = xcalloc(1, sizeof(module_conf_t));
|
||||
|
||||
init_list_head(&m->m_attrs);
|
||||
|
||||
opts = strchr(data, ':');
|
||||
|
||||
if (opts) {
|
||||
*opts = '\0';
|
||||
opts++;
|
||||
|
||||
do {
|
||||
tv_t *tv;
|
||||
next = strchr(opts, ';');
|
||||
|
||||
if (next) {
|
||||
*next = '\0';
|
||||
++next;
|
||||
}
|
||||
|
||||
tv = parse_tv(opts);
|
||||
list_add_tail(&tv->tv_list, &m->m_attrs);
|
||||
|
||||
opts = next;
|
||||
} while(next);
|
||||
}
|
||||
|
||||
m->m_name = strdup(name);
|
||||
return m;
|
||||
}
|
||||
|
||||
|
||||
int parse_module_param(const char *data, struct list_head *list)
|
||||
{
|
||||
char *buf = strdup(data);
|
||||
char *next;
|
||||
char *current = buf;
|
||||
module_conf_t *m;
|
||||
int n = 0;
|
||||
|
||||
do {
|
||||
next = strchr(current, ',');
|
||||
|
||||
if (next) {
|
||||
*next = '\0';
|
||||
++next;
|
||||
}
|
||||
|
||||
m = parse_module(current);
|
||||
if (m) {
|
||||
list_add_tail(&m->m_list, list);
|
||||
n++;
|
||||
}
|
||||
|
||||
current = next;
|
||||
} while (next);
|
||||
|
||||
free(buf);
|
||||
|
||||
return n;
|
||||
}
|
||||
|
||||
static void configfile_read_history(void)
|
||||
{
|
||||
int i, nhistory;
|
||||
|
||||
nhistory = cfg_size(cfg, "history");
|
||||
|
||||
for (i = 0; i < nhistory; i++) {
|
||||
struct history_def *def;
|
||||
cfg_t *history;
|
||||
const char *name, *type;
|
||||
float interval;
|
||||
int size;
|
||||
|
||||
if (!(history = cfg_getnsec(cfg, "history", i)))
|
||||
BUG();
|
||||
|
||||
if (!(name = cfg_title(history)))
|
||||
BUG();
|
||||
|
||||
interval = cfg_getfloat(history, "interval");
|
||||
size = cfg_getint(history, "size");
|
||||
type = cfg_getstr(history, "type");
|
||||
|
||||
if (interval == 0.0f)
|
||||
interval = cfg_getfloat(cfg, "read_interval");
|
||||
|
||||
def = history_def_alloc(name);
|
||||
def->hd_interval = interval;
|
||||
def->hd_size = size;
|
||||
|
||||
if (!strcasecmp(type, "8bit"))
|
||||
def->hd_type = HISTORY_TYPE_8;
|
||||
else if (!strcasecmp(type, "16bit"))
|
||||
def->hd_type = HISTORY_TYPE_16;
|
||||
else if (!strcasecmp(type, "32bit"))
|
||||
def->hd_type = HISTORY_TYPE_32;
|
||||
else if (!strcasecmp(type, "64bit"))
|
||||
def->hd_type = HISTORY_TYPE_64;
|
||||
else
|
||||
quit("Invalid type \'%s\', must be \"(8|16|32|64)bit\""
|
||||
" in history definition #%d\n", type, i+1);
|
||||
}
|
||||
}
|
||||
|
||||
static void configfile_read_element_cfg(void)
|
||||
{
|
||||
int i, nelement;
|
||||
|
||||
nelement = cfg_size(cfg, "element");
|
||||
|
||||
for (i = 0; i < nelement; i++) {
|
||||
struct element_cfg *ec;
|
||||
cfg_t *element;
|
||||
const char *name, *description;
|
||||
long max;
|
||||
|
||||
if (!(element = cfg_getnsec(cfg, "element", i)))
|
||||
BUG();
|
||||
|
||||
if (!(name = cfg_title(element)))
|
||||
BUG();
|
||||
|
||||
ec = element_cfg_alloc(name);
|
||||
|
||||
if ((description = cfg_getstr(element, "description")))
|
||||
ec->ec_description = strdup(description);
|
||||
|
||||
if ((max = cfg_getint(element, "max")))
|
||||
ec->ec_rxmax = ec->ec_txmax = max;
|
||||
|
||||
if ((max = cfg_getint(element, "rxmax")))
|
||||
ec->ec_rxmax = max;
|
||||
|
||||
if ((max = cfg_getint(element, "txmax")))
|
||||
ec->ec_txmax = max;
|
||||
|
||||
if (cfg_getbool(element, "show"))
|
||||
ec->ec_flags |= ELEMENT_CFG_SHOW;
|
||||
else
|
||||
ec->ec_flags |= ELEMENT_CFG_HIDE;
|
||||
}
|
||||
}
|
||||
|
||||
static void add_div(struct unit *unit, int type, cfg_t *variant)
|
||||
{
|
||||
int ndiv, n, ntxt;
|
||||
|
||||
if (!(ndiv = cfg_size(variant, "div")))
|
||||
return;
|
||||
|
||||
ntxt = cfg_size(variant, "txt");
|
||||
if (ntxt != ndiv)
|
||||
quit("Number of elements for div and txt not equal\n");
|
||||
|
||||
if (!list_empty(&unit->u_div[type])) {
|
||||
struct fraction *f, *n;
|
||||
|
||||
list_for_each_entry_safe(f, n, &unit->u_div[type], f_list)
|
||||
fraction_free(f);
|
||||
}
|
||||
|
||||
for (n = 0; n < ndiv; n++) {
|
||||
char *txt;
|
||||
float div;
|
||||
|
||||
div = cfg_getnfloat(variant, "div", n);
|
||||
txt = cfg_getnstr(variant, "txt", n);
|
||||
|
||||
unit_add_div(unit, type, txt, div);
|
||||
}
|
||||
}
|
||||
|
||||
static void configfile_read_units(void)
|
||||
{
|
||||
int i, nunits;
|
||||
struct unit *u;
|
||||
|
||||
nunits = cfg_size(cfg, "unit");
|
||||
|
||||
for (i = 0; i < nunits; i++) {
|
||||
int nvariants, n;
|
||||
cfg_t *unit;
|
||||
const char *name;
|
||||
|
||||
if (!(unit = cfg_getnsec(cfg, "unit", i)))
|
||||
BUG();
|
||||
|
||||
if (!(name = cfg_title(unit)))
|
||||
BUG();
|
||||
|
||||
if (!(nvariants = cfg_size(unit, "variant")))
|
||||
continue;
|
||||
|
||||
if (!(u = unit_add(name)))
|
||||
continue;
|
||||
|
||||
for (n = 0; n < nvariants; n++) {
|
||||
cfg_t *variant;
|
||||
const char *vtitle;
|
||||
|
||||
if (!(variant = cfg_getnsec(unit, "variant", n)))
|
||||
BUG();
|
||||
|
||||
if (!(vtitle = cfg_title(variant)))
|
||||
BUG();
|
||||
|
||||
if (!strcasecmp(vtitle, "default"))
|
||||
add_div(u, UNIT_DEFAULT, variant);
|
||||
else if (!strcasecmp(vtitle, "si"))
|
||||
add_div(u, UNIT_SI, variant);
|
||||
else if (!strcasecmp(vtitle, "bit"))
|
||||
add_div(u, UNIT_BIT, variant);
|
||||
else
|
||||
quit("Unknown unit variant \'%s\'\n", vtitle);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void configfile_read_attrs(void)
|
||||
{
|
||||
int i, nattrs, t = 0;
|
||||
|
||||
nattrs = cfg_size(cfg, "attr");
|
||||
|
||||
for (i = 0; i < nattrs; i++) {
|
||||
struct unit *u;
|
||||
cfg_t *attr;
|
||||
const char *name, *description, *unit, *type;
|
||||
int flags = 0;
|
||||
|
||||
if (!(attr = cfg_getnsec(cfg, "attr", i)))
|
||||
BUG();
|
||||
|
||||
if (!(name = cfg_title(attr)))
|
||||
BUG();
|
||||
|
||||
description = cfg_getstr(attr, "description");
|
||||
unit = cfg_getstr(attr, "unit");
|
||||
type = cfg_getstr(attr, "type");
|
||||
|
||||
if (!unit)
|
||||
quit("Attribute '%s' is missing unit specification\n",
|
||||
name);
|
||||
|
||||
if (!type)
|
||||
quit("Attribute '%s' is missing type specification\n",
|
||||
name);
|
||||
|
||||
if (!(u = unit_lookup(unit)))
|
||||
quit("Unknown unit \'%s\' attribute '%s'\n",
|
||||
unit, name);
|
||||
|
||||
if (!strcasecmp(type, "counter"))
|
||||
t = ATTR_TYPE_COUNTER;
|
||||
else if (!strcasecmp(type, "rate"))
|
||||
t = ATTR_TYPE_RATE;
|
||||
else if (!strcasecmp(type, "percent"))
|
||||
t = ATTR_TYPE_PERCENT;
|
||||
else
|
||||
quit("Unknown type \'%s\' in attribute '%s'\n",
|
||||
type, name);
|
||||
|
||||
if (cfg_getbool(attr, "history"))
|
||||
flags |= ATTR_FORCE_HISTORY;
|
||||
|
||||
if (cfg_getbool(attr, "ignore_overflows"))
|
||||
flags |= ATTR_IGNORE_OVERFLOWS;
|
||||
|
||||
attr_def_add(name, description, u, t, flags);
|
||||
}
|
||||
}
|
||||
|
||||
static void conf_read(const char *path, int must)
|
||||
{
|
||||
int err;
|
||||
|
||||
DBG("Reading configfile %s...", path);
|
||||
|
||||
if (access(path, R_OK) != 0) {
|
||||
if (must)
|
||||
quit("Error: Unable to read configfile \"%s\": %s\n",
|
||||
path, strerror(errno));
|
||||
else
|
||||
return;
|
||||
}
|
||||
|
||||
err = cfg_parse(cfg, path);
|
||||
if (err == CFG_FILE_ERROR) {
|
||||
quit("Error while reading configfile \"%s\": %s\n",
|
||||
path, strerror(errno));
|
||||
} else if (err == CFG_PARSE_ERROR) {
|
||||
quit("Error while reading configfile \"%s\": parse error\n",
|
||||
path);
|
||||
}
|
||||
|
||||
configfile_read_units();
|
||||
configfile_read_history();
|
||||
configfile_read_attrs();
|
||||
configfile_read_element_cfg();
|
||||
}
|
||||
|
||||
static const char default_config[] = \
|
||||
"unit byte {" \
|
||||
" variant default {" \
|
||||
" div = { 1, 1024, 1048576, 1073741824, 1099511627776}" \
|
||||
" txt = { \"B\", \"KiB\", \"MiB\", \"GiB\", \"TiB\" }" \
|
||||
" }" \
|
||||
" variant si {" \
|
||||
" div = { 1, 1000, 1000000, 1000000000, 1000000000000 }" \
|
||||
" txt = { \"B\", \"KB\", \"MB\", \"GB\", \"TB\" }" \
|
||||
" }" \
|
||||
" variant bit {" \
|
||||
" div = { 0.125, 125, 125000, 125000000, 125000000000 }" \
|
||||
" txt = { \"b\", \"Kb\", \"Mb\", \"Gb\", \"Tb\" }" \
|
||||
" }" \
|
||||
" }" \
|
||||
"unit bit {" \
|
||||
" variant default {" \
|
||||
" div = { 1, 1000, 1000000, 1000000000, 1000000000000 }" \
|
||||
" txt = { \"b\", \"Kb\", \"Mb\", \"Gb\", \"Tb\" }" \
|
||||
" }" \
|
||||
" variant si {" \
|
||||
" div = { 1, 1000, 1000000, 1000000000, 1000000000000 }" \
|
||||
" txt = { \"b\", \"Kb\", \"Mb\", \"Gb\", \"Tb\" }" \
|
||||
" }" \
|
||||
" variant bit {" \
|
||||
" div = { 1, 1000, 1000000, 1000000000, 1000000000000 }" \
|
||||
" txt = { \"b\", \"Kb\", \"Mb\", \"Gb\", \"Tb\" }" \
|
||||
" }" \
|
||||
"}" \
|
||||
"unit number {" \
|
||||
" variant default {" \
|
||||
" div = { 1, 1000, 1000000, 1000000000, 1000000000000 }" \
|
||||
" txt = { \"\", \"K\", \"M\", \"G\", \"T\" }" \
|
||||
" }" \
|
||||
"}" \
|
||||
"unit percent {" \
|
||||
" variant default {" \
|
||||
" div = { 1. }" \
|
||||
" txt = { \"%\" }" \
|
||||
" }" \
|
||||
"}" \
|
||||
"history second {" \
|
||||
" interval = 1.0" \
|
||||
" size = 60" \
|
||||
"}" \
|
||||
"history minute {" \
|
||||
" interval = 60.0" \
|
||||
" size = 60" \
|
||||
"}" \
|
||||
"history hour {" \
|
||||
" interval = 3600.0" \
|
||||
" size = 60" \
|
||||
"}" \
|
||||
"history day {" \
|
||||
" interval = 86400.0" \
|
||||
" size = 60" \
|
||||
"}";
|
||||
|
||||
static void conf_read_default(void)
|
||||
{
|
||||
int err;
|
||||
|
||||
DBG("Reading default config");
|
||||
|
||||
err = cfg_parse_buf(cfg, default_config);
|
||||
if (err)
|
||||
quit("Error while parsing default config\n");
|
||||
|
||||
configfile_read_units();
|
||||
configfile_read_history();
|
||||
configfile_read_attrs();
|
||||
configfile_read_element_cfg();
|
||||
}
|
||||
|
||||
void configfile_read(void)
|
||||
{
|
||||
if (configfile)
|
||||
conf_read(configfile, 1);
|
||||
else {
|
||||
conf_read(SYSCONFDIR "/bmon.conf", 0);
|
||||
|
||||
if (getenv("HOME")) {
|
||||
char path[FILENAME_MAX+1];
|
||||
snprintf(path, sizeof(path), "%s/.bmonrc",
|
||||
getenv("HOME"));
|
||||
conf_read(path, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void conf_init_pre(void)
|
||||
{
|
||||
conf_read_default();
|
||||
}
|
||||
|
||||
void conf_init_post(void)
|
||||
{
|
||||
cfg_read_interval = cfg_getfloat(cfg, "read_interval");
|
||||
cfg_rate_interval = cfg_getfloat(cfg, "rate_interval");
|
||||
cfg_rate_variance = cfg_getfloat(cfg, "variance") * cfg_rate_interval;
|
||||
cfg_history_variance = cfg_getfloat(cfg, "history_variance");
|
||||
cfg_show_all = cfg_getbool(cfg, "show_all");
|
||||
cfg_unit_exp = cfg_getint(cfg, "unit_exp");
|
||||
|
||||
element_parse_policy(cfg_getstr(cfg, "policy"));
|
||||
}
|
||||
|
||||
void set_configfile(const char *file)
|
||||
{
|
||||
static int set = 0;
|
||||
if (!set) {
|
||||
configfile = strdup(file);
|
||||
set = 1;
|
||||
}
|
||||
}
|
||||
|
||||
void set_unit_exp(const char *name)
|
||||
{
|
||||
if (tolower(*name) == 'b')
|
||||
cfg_setint(cfg, "unit_exp", 0);
|
||||
else if (tolower(*name) == 'k')
|
||||
cfg_setint(cfg, "unit_exp", 1);
|
||||
else if (tolower(*name) == 'm')
|
||||
cfg_setint(cfg, "unit_exp", 2);
|
||||
else if (tolower(*name) == 'g')
|
||||
cfg_setint(cfg, "unit_exp", 3);
|
||||
else if (tolower(*name) == 't')
|
||||
cfg_setint(cfg, "unit_exp", 4);
|
||||
else if (tolower(*name) == 'd')
|
||||
cfg_setint(cfg, "unit_exp", DYNAMIC_EXP);
|
||||
else
|
||||
quit("Unknown unit exponent '%s'\n", name);
|
||||
}
|
||||
|
||||
unsigned int get_lifecycles(void)
|
||||
{
|
||||
return (unsigned int)
|
||||
(cfg_getfloat(cfg, "lifetime") / cfg_getfloat(cfg, "read_interval"));
|
||||
}
|
||||
|
||||
static void __exit conf_shutdown(void)
|
||||
{
|
||||
cfg_free(cfg);
|
||||
}
|
||||
|
||||
static void __init __conf_init(void)
|
||||
{
|
||||
DBG("init");
|
||||
|
||||
cfg = cfg_init(global_opts, CFGF_NOCASE);
|
||||
|
||||
/* FIXME: Add validation functions */
|
||||
//cfg_set_validate_func(cfg, "bookmark", &cb_validate_bookmark);
|
||||
}
|
536
src/element.c
@ -1,536 +0,0 @@
|
||||
/*
|
||||
* src/element.c Elements
|
||||
*
|
||||
* Copyright (c) 2001-2013 Thomas Graf <tgraf@suug.ch>
|
||||
* Copyright (c) 2013 Red Hat, Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included
|
||||
* in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <bmon/bmon.h>
|
||||
#include <bmon/conf.h>
|
||||
#include <bmon/element.h>
|
||||
#include <bmon/element_cfg.h>
|
||||
#include <bmon/group.h>
|
||||
#include <bmon/input.h>
|
||||
#include <bmon/utils.h>
|
||||
|
||||
static LIST_HEAD(allowed);
|
||||
static LIST_HEAD(denied);
|
||||
|
||||
static int match_mask(const struct policy *p, const char *str)
|
||||
{
|
||||
int i, n;
|
||||
char c;
|
||||
|
||||
if (!p || !str)
|
||||
return 0;
|
||||
|
||||
for (i = 0, n = 0; p->p_rule[i] != '\0'; i++) {
|
||||
if (p->p_rule[i] == '*') {
|
||||
c = tolower(p->p_rule[i + 1]);
|
||||
|
||||
if (c == '\0')
|
||||
return 1;
|
||||
|
||||
while (tolower(str[n]) != c)
|
||||
if (str[n++] == '\0')
|
||||
return 0;
|
||||
} else if (tolower(p->p_rule[i]) != tolower(str[n++]))
|
||||
return 0;
|
||||
}
|
||||
|
||||
return str[n] == '\0' ? 1 : 0;
|
||||
}
|
||||
|
||||
int element_allowed(const char *name, struct element_cfg *cfg)
|
||||
{
|
||||
struct policy *p;
|
||||
|
||||
if (cfg) {
|
||||
if (cfg->ec_flags & ELEMENT_CFG_HIDE)
|
||||
return 0;
|
||||
else if (cfg->ec_flags & ELEMENT_CFG_SHOW)
|
||||
return 1;
|
||||
}
|
||||
|
||||
list_for_each_entry(p, &denied, p_list)
|
||||
if (match_mask(p, name))
|
||||
return 0;
|
||||
|
||||
if (!list_empty(&allowed)) {
|
||||
list_for_each_entry(p, &allowed, p_list)
|
||||
if (match_mask(p, name))
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
void element_parse_policy(const char *policy)
|
||||
{
|
||||
char *start, *copy, *save = NULL, *tok;
|
||||
struct policy *p;
|
||||
|
||||
if (!policy)
|
||||
return;
|
||||
|
||||
copy = strdup(policy);
|
||||
start = copy;
|
||||
|
||||
while ((tok = strtok_r(start, ",", &save)) != NULL) {
|
||||
start = NULL;
|
||||
|
||||
p = xcalloc(1, sizeof(*p));
|
||||
|
||||
if (*tok == '!') {
|
||||
p->p_rule = strdup(++tok);
|
||||
list_add_tail(&p->p_list, &denied);
|
||||
} else {
|
||||
p->p_rule = strdup(tok);
|
||||
list_add_tail(&p->p_list, &allowed);
|
||||
}
|
||||
}
|
||||
|
||||
xfree(copy);
|
||||
}
|
||||
|
||||
static struct element *__lookup_element(struct element_group *group,
|
||||
const char *name, uint32_t id,
|
||||
struct element *parent)
|
||||
{
|
||||
struct list_head *list;
|
||||
struct element *e;
|
||||
|
||||
if (parent)
|
||||
list = &parent->e_childs;
|
||||
else
|
||||
list = &group->g_elements;
|
||||
|
||||
list_for_each_entry(e, list, e_list)
|
||||
if (!strcmp(name, e->e_name) && e->e_id == id)
|
||||
return e;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
struct element *element_lookup(struct element_group *group, const char *name,
|
||||
uint32_t id, struct element *parent, int flags)
|
||||
{
|
||||
struct element_cfg *cfg;
|
||||
struct element *e;
|
||||
int i;
|
||||
|
||||
if (!group)
|
||||
BUG();
|
||||
|
||||
if ((e = __lookup_element(group, name, id, parent)))
|
||||
return e;
|
||||
|
||||
if (!(flags & ELEMENT_CREAT))
|
||||
return NULL;
|
||||
|
||||
cfg = element_cfg_lookup(name);
|
||||
if (!element_allowed(name, cfg))
|
||||
return NULL;
|
||||
|
||||
DBG("Creating element %d \"%s\"", id, name);
|
||||
|
||||
e = xcalloc(1, sizeof(*e));
|
||||
|
||||
init_list_head(&e->e_list);
|
||||
init_list_head(&e->e_childs);
|
||||
init_list_head(&e->e_info_list);
|
||||
init_list_head(&e->e_attr_sorted);
|
||||
|
||||
for (i = 0; i < ATTR_HASH_SIZE; i++)
|
||||
init_list_head(&e->e_attrhash[i]);
|
||||
|
||||
e->e_name = strdup(name);
|
||||
e->e_id = id;
|
||||
e->e_parent = parent;
|
||||
e->e_group = group;
|
||||
e->e_lifecycles = get_lifecycles();
|
||||
e->e_flags = ELEMENT_FLAG_CREATED;
|
||||
e->e_cfg = cfg;
|
||||
|
||||
if (e->e_cfg) {
|
||||
if (e->e_cfg->ec_description)
|
||||
element_update_info(e, "Description",
|
||||
e->e_cfg->ec_description);
|
||||
|
||||
element_set_rxmax(e, e->e_cfg->ec_rxmax);
|
||||
element_set_txmax(e, e->e_cfg->ec_txmax);
|
||||
}
|
||||
|
||||
if (parent) {
|
||||
DBG("Attached to parent %d \"%s\"", parent->e_id, parent->e_name);
|
||||
list_add_tail(&e->e_list, &parent->e_childs);
|
||||
} else {
|
||||
DBG("Attached to group %s", group->g_name);
|
||||
list_add_tail(&e->e_list, &group->g_elements);
|
||||
}
|
||||
|
||||
group->g_nelements++;
|
||||
|
||||
return e;
|
||||
}
|
||||
|
||||
void element_free(struct element *e)
|
||||
{
|
||||
struct info *info, *ninfo;
|
||||
struct element *c, *cnext;
|
||||
struct attr *a, *an;
|
||||
int i;
|
||||
|
||||
if (e->e_group->g_current == e) {
|
||||
element_select_prev();
|
||||
if (e->e_group->g_current == e)
|
||||
e->e_group->g_current = NULL;
|
||||
}
|
||||
|
||||
list_for_each_entry_safe(c, cnext, &e->e_childs, e_list)
|
||||
element_free(c);
|
||||
|
||||
list_for_each_entry_safe(info, ninfo, &e->e_info_list, i_list) {
|
||||
xfree(info->i_name);
|
||||
xfree(info->i_value);
|
||||
list_del(&info->i_list);
|
||||
xfree(info);
|
||||
}
|
||||
|
||||
for (i = 0; i < ATTR_HASH_SIZE; i++)
|
||||
list_for_each_entry_safe(a, an, &e->e_attrhash[i], a_list)
|
||||
attr_free(a);
|
||||
|
||||
list_del(&e->e_list);
|
||||
e->e_group->g_nelements--;
|
||||
|
||||
xfree(e->e_name);
|
||||
xfree(e);
|
||||
}
|
||||
|
||||
#if 0
|
||||
if (item->i_group->g_selected == item) {
|
||||
if (item_select_prev() == END_OF_LIST) {
|
||||
if (group_select_prev() == END_OF_LIST) {
|
||||
if (node_select_prev() != END_OF_LIST)
|
||||
item_select_last();
|
||||
} else
|
||||
item_select_last();
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
|
||||
void item_delete(struct item *item)
|
||||
{
|
||||
int m;
|
||||
struct item *child;
|
||||
|
||||
for (m = 0; m < ATTR_HASH_MAX; m++) {
|
||||
struct attr *a, *next;
|
||||
for (a = item->i_attrs[m]; a; a = next) {
|
||||
next = a->a_next;
|
||||
xfree(a);
|
||||
}
|
||||
}
|
||||
|
||||
if (item->i_group->g_selected == item) {
|
||||
if (item_select_prev() == END_OF_LIST) {
|
||||
if (group_select_prev() == END_OF_LIST) {
|
||||
if (node_select_prev() != END_OF_LIST)
|
||||
item_select_last();
|
||||
} else
|
||||
item_select_last();
|
||||
}
|
||||
}
|
||||
|
||||
unlink_item(item);
|
||||
item->i_group->g_nitems--;
|
||||
|
||||
for (child = item->i_childs; child; child = child->i_next)
|
||||
item_delete(child);
|
||||
|
||||
if (item->i_path)
|
||||
xfree(item->i_path);
|
||||
|
||||
xfree(item);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
void element_reset_update_flag(struct element_group *g,
|
||||
struct element *e, void *arg)
|
||||
{
|
||||
DBG("Reseting update flag of %s", e->e_name);
|
||||
e->e_flags &= ~ELEMENT_FLAG_UPDATED;
|
||||
}
|
||||
|
||||
/**
|
||||
* Needs to be called after updating all attributes of an element
|
||||
*/
|
||||
void element_notify_update(struct element *e, timestamp_t *ts)
|
||||
{
|
||||
struct attr *a;
|
||||
int i;
|
||||
|
||||
e->e_flags |= ELEMENT_FLAG_UPDATED;
|
||||
|
||||
if (ts == NULL)
|
||||
ts = &rtiming.rt_last_read;
|
||||
|
||||
for (i = 0; i < ATTR_HASH_SIZE; i++)
|
||||
list_for_each_entry(a, &e->e_attrhash[i], a_list)
|
||||
attr_notify_update(a, ts);
|
||||
|
||||
if (e->e_usage_attr && e->e_cfg &&
|
||||
(a = attr_lookup(e, e->e_usage_attr->ad_id))) {
|
||||
attr_calc_usage(a, &e->e_rx_usage, &e->e_tx_usage,
|
||||
e->e_cfg->ec_rxmax, e->e_cfg->ec_txmax);
|
||||
} else {
|
||||
e->e_rx_usage = FLT_MAX;
|
||||
e->e_tx_usage = FLT_MAX;
|
||||
}
|
||||
}
|
||||
|
||||
void element_lifesign(struct element *e, int n)
|
||||
{
|
||||
e->e_lifecycles = n * get_lifecycles();
|
||||
}
|
||||
|
||||
void element_check_if_dead(struct element_group *g,
|
||||
struct element *e, void *arg)
|
||||
{
|
||||
if (--(e->e_lifecycles) <= 0) {
|
||||
element_free(e);
|
||||
DBG("Deleting dead element %s", e->e_name);
|
||||
}
|
||||
}
|
||||
|
||||
void element_foreach_attr(struct element *e,
|
||||
void (*cb)(struct element *e,
|
||||
struct attr *, void *),
|
||||
void *arg)
|
||||
{
|
||||
struct attr *a;
|
||||
|
||||
list_for_each_entry(a, &e->e_attr_sorted, a_sort_list)
|
||||
cb(e, a, arg);
|
||||
}
|
||||
|
||||
int element_set_key_attr(struct element *e, const char *major,
|
||||
const char * minor)
|
||||
{
|
||||
if (!(e->e_key_attr[GT_MAJOR] = attr_def_lookup(major)))
|
||||
return -ENOENT;
|
||||
|
||||
if (!(e->e_key_attr[GT_MINOR] = attr_def_lookup(minor)))
|
||||
return -ENOENT;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int element_set_usage_attr(struct element *e, const char *usage)
|
||||
{
|
||||
if (!(e->e_usage_attr = attr_def_lookup(usage)))
|
||||
return -ENOENT;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct element *element_current(void)
|
||||
{
|
||||
struct element_group *g;
|
||||
|
||||
if (!(g = group_current()))
|
||||
return NULL;
|
||||
|
||||
if (!g->g_current)
|
||||
element_select_first();
|
||||
|
||||
return g->g_current;
|
||||
}
|
||||
|
||||
struct element *element_select_first(void)
|
||||
{
|
||||
struct element_group *g;
|
||||
|
||||
if (!(g = group_current()))
|
||||
return NULL;
|
||||
|
||||
if (list_empty(&g->g_elements))
|
||||
g->g_current = NULL;
|
||||
else
|
||||
g->g_current = list_first_entry(&g->g_elements,
|
||||
struct element, e_list);
|
||||
|
||||
return g->g_current;
|
||||
}
|
||||
|
||||
struct element *element_select_last(void)
|
||||
{
|
||||
struct element_group *g;
|
||||
|
||||
if (!(g = group_current()))
|
||||
return NULL;
|
||||
|
||||
if (list_empty(&g->g_elements))
|
||||
g->g_current = NULL;
|
||||
else {
|
||||
struct element *e;
|
||||
|
||||
e = list_entry(g->g_elements.prev, struct element, e_list);
|
||||
|
||||
while (!list_empty(&e->e_childs))
|
||||
e = list_entry(e->e_childs.prev, struct element,
|
||||
e_list);
|
||||
|
||||
g->g_current = e;
|
||||
}
|
||||
|
||||
return g->g_current;
|
||||
}
|
||||
|
||||
struct element *element_select_next(void)
|
||||
{
|
||||
struct element_group *g;
|
||||
struct element *e;
|
||||
|
||||
if (!(g = group_current()))
|
||||
return NULL;
|
||||
|
||||
if (!(e = g->g_current))
|
||||
return element_select_first();
|
||||
|
||||
if (!list_empty(&e->e_childs))
|
||||
e = list_first_entry(&e->e_childs, struct element, e_list);
|
||||
else {
|
||||
/*
|
||||
* move upwards until we have no parent or there is a next
|
||||
* entry in the list
|
||||
*/
|
||||
while (e->e_parent && e->e_list.next == &e->e_parent->e_childs)
|
||||
e = e->e_parent;
|
||||
|
||||
if (!e->e_parent && e->e_list.next == &g->g_elements) {
|
||||
group_select_next();
|
||||
return element_select_first();
|
||||
} else
|
||||
e = list_entry(e->e_list.next, struct element, e_list);
|
||||
}
|
||||
|
||||
g->g_current = e;
|
||||
|
||||
return e;
|
||||
}
|
||||
|
||||
struct element *element_select_prev(void)
|
||||
{
|
||||
struct element_group *g;
|
||||
struct element *e;
|
||||
|
||||
if (!(g = group_current()))
|
||||
return NULL;
|
||||
|
||||
if (!(e = g->g_current))
|
||||
return element_select_last();
|
||||
|
||||
if (!e->e_parent && e->e_list.prev == &g->g_elements) {
|
||||
group_select_prev();
|
||||
return element_select_last();
|
||||
}
|
||||
|
||||
if (e->e_parent && e->e_list.prev == &e->e_parent->e_childs)
|
||||
e = e->e_parent;
|
||||
else {
|
||||
e = list_entry(e->e_list.prev, struct element, e_list);
|
||||
|
||||
while (!list_empty(&e->e_childs))
|
||||
e = list_entry(e->e_childs.prev, struct element,
|
||||
e_list);
|
||||
}
|
||||
|
||||
g->g_current = e;
|
||||
|
||||
return e;
|
||||
}
|
||||
|
||||
static struct info *element_info_lookup(struct element *e, const char *name)
|
||||
{
|
||||
struct info *i;
|
||||
|
||||
list_for_each_entry(i, &e->e_info_list, i_list)
|
||||
if (!strcmp(i->i_name, name))
|
||||
return i;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void element_update_info(struct element *e, const char *name, const char *value)
|
||||
{
|
||||
struct info *i;
|
||||
|
||||
if ((i = element_info_lookup(e, name))) {
|
||||
xfree(i->i_value);
|
||||
i->i_value = strdup(value);
|
||||
return;
|
||||
}
|
||||
|
||||
DBG("Created element info %s (\"%s\")", name, value);
|
||||
|
||||
i = xcalloc(1, sizeof(*i));
|
||||
i->i_name = strdup(name);
|
||||
i->i_value = strdup(value);
|
||||
|
||||
e->e_ninfo++;
|
||||
|
||||
list_add_tail(&i->i_list, &e->e_info_list);
|
||||
}
|
||||
|
||||
void element_set_txmax(struct element *e, uint64_t max)
|
||||
{
|
||||
char buf[32];
|
||||
|
||||
if (!e->e_cfg)
|
||||
e->e_cfg = element_cfg_create(e->e_name);
|
||||
|
||||
if (e->e_cfg->ec_txmax != max)
|
||||
e->e_cfg->ec_txmax = max;
|
||||
|
||||
unit_bit2str(e->e_cfg->ec_txmax * 8, buf, sizeof(buf));
|
||||
element_update_info(e, "TxMax", buf);
|
||||
}
|
||||
|
||||
void element_set_rxmax(struct element *e, uint64_t max)
|
||||
{
|
||||
char buf[32];
|
||||
|
||||
if (!e->e_cfg)
|
||||
e->e_cfg = element_cfg_create(e->e_name);
|
||||
|
||||
if (e->e_cfg->ec_rxmax != max)
|
||||
e->e_cfg->ec_rxmax = max;
|
||||
|
||||
unit_bit2str(e->e_cfg->ec_rxmax * 8, buf, sizeof(buf));
|
||||
element_update_info(e, "RxMax", buf);
|
||||
}
|
@ -1,96 +0,0 @@
|
||||
/*
|
||||
* element_cfg.c Element Configuration
|
||||
*
|
||||
* Copyright (c) 2001-2013 Thomas Graf <tgraf@suug.ch>
|
||||
* Copyright (c) 2013 Red Hat, Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included
|
||||
* in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <bmon/bmon.h>
|
||||
#include <bmon/conf.h>
|
||||
#include <bmon/element.h>
|
||||
#include <bmon/element_cfg.h>
|
||||
#include <bmon/utils.h>
|
||||
|
||||
static LIST_HEAD(cfg_list);
|
||||
|
||||
struct element_cfg *element_cfg_alloc(const char *name)
|
||||
{
|
||||
struct element_cfg *ec;
|
||||
|
||||
if ((ec = element_cfg_lookup(name))) {
|
||||
ec->ec_refcnt++;
|
||||
return ec;
|
||||
}
|
||||
|
||||
ec = xcalloc(1, sizeof(*ec));
|
||||
ec->ec_name = strdup(name);
|
||||
ec->ec_refcnt = 1;
|
||||
|
||||
list_add_tail(&ec->ec_list, &cfg_list);
|
||||
|
||||
return ec;
|
||||
}
|
||||
|
||||
struct element_cfg *element_cfg_create(const char *name)
|
||||
{
|
||||
struct element_cfg *cfg;
|
||||
|
||||
if (!(cfg = element_cfg_lookup(name)))
|
||||
cfg = element_cfg_alloc(name);
|
||||
|
||||
return cfg;
|
||||
}
|
||||
|
||||
static void __element_cfg_free(struct element_cfg *ec)
|
||||
{
|
||||
list_del(&ec->ec_list);
|
||||
|
||||
xfree(ec->ec_name);
|
||||
xfree(ec->ec_description);
|
||||
xfree(ec);
|
||||
}
|
||||
|
||||
void element_cfg_free(struct element_cfg *ec)
|
||||
{
|
||||
if (!ec || --ec->ec_refcnt)
|
||||
return;
|
||||
|
||||
__element_cfg_free(ec);
|
||||
}
|
||||
|
||||
struct element_cfg *element_cfg_lookup(const char *name)
|
||||
{
|
||||
struct element_cfg *ec;
|
||||
|
||||
list_for_each_entry(ec, &cfg_list, ec_list)
|
||||
if (!strcmp(name, ec->ec_name))
|
||||
return ec;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void __exit __element_cfg_exit(void)
|
||||
{
|
||||
struct element_cfg *ec, *n;
|
||||
|
||||
list_for_each_entry_safe(ec, n, &cfg_list, ec_list)
|
||||
__element_cfg_free(ec);
|
||||
}
|
216
src/graph.c
@ -1,216 +0,0 @@
|
||||
/*
|
||||
* graph.c Graph creation utility
|
||||
*
|
||||
* Copyright (c) 2001-2013 Thomas Graf <tgraf@suug.ch>
|
||||
* Copyright (c) 2013 Red Hat, Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included
|
||||
* in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <bmon/bmon.h>
|
||||
#include <bmon/graph.h>
|
||||
#include <bmon/input.h>
|
||||
#include <bmon/conf.h>
|
||||
#include <bmon/history.h>
|
||||
#include <bmon/conf.h>
|
||||
#include <bmon/unit.h>
|
||||
#include <bmon/utils.h>
|
||||
|
||||
size_t graph_row_size(struct graph_cfg *cfg)
|
||||
{
|
||||
/* +1 for trailing \0 */
|
||||
return cfg->gc_width + 1;
|
||||
}
|
||||
|
||||
static inline size_t table_size(struct graph_cfg *cfg)
|
||||
{
|
||||
return cfg->gc_height * graph_row_size(cfg);
|
||||
}
|
||||
|
||||
static inline char *at_row(struct graph_cfg *cfg, char *col, int nrow)
|
||||
{
|
||||
return col + (nrow * graph_row_size(cfg));
|
||||
}
|
||||
|
||||
static inline char *at_col(char *row, int ncol)
|
||||
{
|
||||
return row + ncol;
|
||||
}
|
||||
|
||||
static inline char *tbl_pos(struct graph_cfg *cfg, char *tbl, int nrow, int ncol)
|
||||
{
|
||||
return at_col(at_row(cfg, tbl, nrow), ncol);
|
||||
}
|
||||
|
||||
static void fill_table(struct graph *g, struct graph_table *tbl,
|
||||
struct history *h, struct history_store *data)
|
||||
{
|
||||
struct graph_cfg *cfg = &g->g_cfg;
|
||||
uint64_t max = 0;
|
||||
double v;
|
||||
int i, n, t;
|
||||
float half_step, step;
|
||||
|
||||
if (!tbl->gt_table) {
|
||||
tbl->gt_table = xcalloc(table_size(cfg), sizeof(char));
|
||||
tbl->gt_scale = xcalloc(cfg->gc_height, sizeof(double));
|
||||
}
|
||||
|
||||
memset(tbl->gt_table, cfg->gc_background, table_size(cfg));
|
||||
|
||||
/* end each line with a \0 */
|
||||
for (i = 0; i < cfg->gc_height; i++)
|
||||
*tbl_pos(cfg, tbl->gt_table, i, cfg->gc_width) = '\0';
|
||||
|
||||
/* leave table blank if there is no data */
|
||||
if (!h || !data->hs_data)
|
||||
return;
|
||||
|
||||
if (cfg->gc_width > h->h_definition->hd_size)
|
||||
BUG();
|
||||
|
||||
/* find the largest peak */
|
||||
for (n = h->h_index, i = 0; i < cfg->gc_width; i++) {
|
||||
if (--n < 0)
|
||||
n = h->h_definition->hd_size - 1;
|
||||
v = history_data(h, data, n);
|
||||
if (v != HISTORY_UNKNOWN && max < v)
|
||||
max = v;
|
||||
}
|
||||
|
||||
step = (double) max / (double) cfg->gc_height;
|
||||
half_step = step / 2.0f;
|
||||
|
||||
for (i = 0; i < cfg->gc_height; i++)
|
||||
tbl->gt_scale[i] = (double) (i + 1) * step;
|
||||
|
||||
for (n = h->h_index, i = 0; i < cfg->gc_width; i++) {
|
||||
char * col = at_col(tbl->gt_table, i);
|
||||
|
||||
if (--n < 0)
|
||||
n = h->h_definition->hd_size - 1;
|
||||
v = history_data(h, data, n);
|
||||
|
||||
if (v == HISTORY_UNKNOWN) {
|
||||
for (t = 0; t < cfg->gc_height; t++)
|
||||
*(at_row(cfg, col, t)) = cfg->gc_unknown;
|
||||
} else if (v > 0) {
|
||||
*(at_row(cfg, col, 0)) = cfg->gc_noise;
|
||||
|
||||
for (t = 0; t < cfg->gc_height; t++)
|
||||
if (v >= (tbl->gt_scale[t] - half_step))
|
||||
*(at_row(cfg, col, t)) = cfg->gc_foreground;
|
||||
}
|
||||
}
|
||||
|
||||
n = (cfg->gc_height / 3) * 2;
|
||||
if (n >= cfg->gc_height)
|
||||
n = (cfg->gc_height - 1);
|
||||
|
||||
v = unit_divisor(tbl->gt_scale[n], cfg->gc_unit,
|
||||
&tbl->gt_y_unit, NULL);
|
||||
|
||||
for (i = 0; i < cfg->gc_height; i++)
|
||||
tbl->gt_scale[i] /= v;
|
||||
}
|
||||
|
||||
struct graph *graph_alloc(struct history *h, struct graph_cfg *cfg)
|
||||
{
|
||||
struct graph *g;
|
||||
|
||||
if (!cfg->gc_height)
|
||||
BUG();
|
||||
|
||||
g = xcalloc(1, sizeof(*g));
|
||||
|
||||
memcpy(&g->g_cfg, cfg, sizeof(*cfg));
|
||||
|
||||
if (h != NULL &&
|
||||
(cfg->gc_width > h->h_definition->hd_size || !cfg->gc_width))
|
||||
g->g_cfg.gc_width = h->h_definition->hd_size;
|
||||
|
||||
if (!g->g_cfg.gc_width)
|
||||
BUG();
|
||||
|
||||
return g;
|
||||
}
|
||||
|
||||
void graph_refill(struct graph *g, struct history *h)
|
||||
{
|
||||
fill_table(g, &g->g_rx, h, h ? &h->h_rx : NULL);
|
||||
fill_table(g, &g->g_tx, h, h ? &h->h_tx : NULL);
|
||||
}
|
||||
|
||||
void graph_free(struct graph *g)
|
||||
{
|
||||
if (!g)
|
||||
return;
|
||||
|
||||
xfree(g->g_rx.gt_table);
|
||||
xfree(g->g_rx.gt_scale);
|
||||
xfree(g->g_tx.gt_table);
|
||||
xfree(g->g_tx.gt_scale);
|
||||
xfree(g);
|
||||
}
|
||||
|
||||
#if 0
|
||||
|
||||
void new_graph(void)
|
||||
{
|
||||
if (ngraphs >= (MAX_GRAPHS - 1))
|
||||
return;
|
||||
set_ngraphs_hard(ngraphs + 1);
|
||||
}
|
||||
|
||||
void del_graph(void)
|
||||
{
|
||||
if (ngraphs <= 1)
|
||||
return;
|
||||
set_ngraphs_hard(ngraphs - 1);
|
||||
}
|
||||
|
||||
int next_graph(void)
|
||||
{
|
||||
struct item *it = item_current();
|
||||
if (it == NULL)
|
||||
return EMPTY_LIST;
|
||||
|
||||
if (it->i_graph_sel >= (ngraphs - 1))
|
||||
it->i_graph_sel = 0;
|
||||
else
|
||||
it->i_graph_sel++;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int prev_graph(void)
|
||||
{
|
||||
struct item *it = item_current();
|
||||
if (it == NULL)
|
||||
return EMPTY_LIST;
|
||||
|
||||
if (it->i_graph_sel <= 0)
|
||||
it->i_graph_sel = ngraphs - 1;
|
||||
else
|
||||
it->i_graph_sel--;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
278
src/group.c
@ -1,278 +0,0 @@
|
||||
/*
|
||||
* group.c Group Management
|
||||
*
|
||||
* Copyright (c) 2001-2013 Thomas Graf <tgraf@suug.ch>
|
||||
* Copyright (c) 2013 Red Hat, Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included
|
||||
* in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <bmon/bmon.h>
|
||||
#include <bmon/element.h>
|
||||
#include <bmon/group.h>
|
||||
#include <bmon/utils.h>
|
||||
|
||||
static LIST_HEAD(titles_list);
|
||||
static LIST_HEAD(group_list);
|
||||
static unsigned int ngroups;
|
||||
static struct element_group *current_group;
|
||||
|
||||
static void __group_foreach_element(struct element_group *g,
|
||||
struct list_head *list,
|
||||
void (*cb)(struct element_group *,
|
||||
struct element *, void *),
|
||||
void *arg)
|
||||
{
|
||||
struct element *e, *n;
|
||||
|
||||
list_for_each_entry_safe(e, n, list, e_list) {
|
||||
cb(g, e, arg);
|
||||
|
||||
if (!list_empty(&e->e_childs))
|
||||
__group_foreach_element(g, &e->e_childs, cb, arg);
|
||||
}
|
||||
}
|
||||
|
||||
void group_foreach_element(struct element_group *g,
|
||||
void (*cb)(struct element_group *,
|
||||
struct element *, void *),
|
||||
void *arg)
|
||||
{
|
||||
__group_foreach_element(g, &g->g_elements, cb, arg);
|
||||
}
|
||||
|
||||
void group_foreach_recursive(void (*cb)(struct element_group *,
|
||||
struct element *, void *),
|
||||
void *arg)
|
||||
{
|
||||
struct element_group *g, *n;
|
||||
|
||||
list_for_each_entry_safe(g, n, &group_list, g_list)
|
||||
__group_foreach_element(g, &g->g_elements, cb, arg);
|
||||
}
|
||||
|
||||
void group_foreach(void (*cb)(struct element_group *, void *), void *arg)
|
||||
{
|
||||
struct element_group *g, *n;
|
||||
|
||||
list_for_each_entry_safe(g, n, &group_list, g_list)
|
||||
cb(g, arg);
|
||||
}
|
||||
|
||||
struct element_group *group_select_first(void)
|
||||
{
|
||||
if (list_empty(&group_list))
|
||||
current_group = NULL;
|
||||
else
|
||||
current_group = list_first_entry(&group_list,
|
||||
struct element_group, g_list);
|
||||
|
||||
return current_group;
|
||||
}
|
||||
|
||||
struct element_group *group_select_last(void)
|
||||
{
|
||||
if (list_empty(&group_list))
|
||||
current_group = NULL;
|
||||
else
|
||||
current_group = list_entry(group_list.prev,
|
||||
struct element_group, g_list);
|
||||
|
||||
return current_group;
|
||||
}
|
||||
|
||||
struct element_group *group_select_next(void)
|
||||
{
|
||||
if (!current_group)
|
||||
return group_select_first();
|
||||
|
||||
if (current_group->g_list.next != &group_list)
|
||||
current_group = list_entry(current_group->g_list.next,
|
||||
struct element_group,
|
||||
g_list);
|
||||
else
|
||||
return group_select_first();
|
||||
|
||||
return current_group;
|
||||
}
|
||||
|
||||
struct element_group *group_select_prev(void)
|
||||
{
|
||||
if (!current_group)
|
||||
return group_select_last();
|
||||
|
||||
if (current_group->g_list.prev != &group_list)
|
||||
current_group = list_entry(current_group->g_list.prev,
|
||||
struct element_group,
|
||||
g_list);
|
||||
else
|
||||
return group_select_last();
|
||||
|
||||
return current_group;
|
||||
}
|
||||
|
||||
struct element_group *group_current(void)
|
||||
{
|
||||
if (current_group == NULL)
|
||||
current_group = group_select_first();
|
||||
|
||||
return current_group;
|
||||
}
|
||||
|
||||
struct element_group *group_lookup(const char *name, int flags)
|
||||
{
|
||||
struct element_group *g;
|
||||
struct group_hdr *hdr;
|
||||
|
||||
list_for_each_entry(g, &group_list, g_list)
|
||||
if (!strcmp(name, g->g_name))
|
||||
return g;
|
||||
|
||||
if (!(flags & GROUP_CREATE))
|
||||
return NULL;
|
||||
|
||||
if (!(hdr = group_lookup_hdr(name))) {
|
||||
fprintf(stderr, "Cannot find title for group \"%s\"\n", name);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
g = xcalloc(1, sizeof(*g));
|
||||
|
||||
init_list_head(&g->g_elements);
|
||||
|
||||
g->g_name = hdr->gh_name;
|
||||
g->g_hdr = hdr;
|
||||
|
||||
list_add_tail(&g->g_list, &group_list);
|
||||
ngroups++;
|
||||
|
||||
return g;
|
||||
}
|
||||
|
||||
static void group_free(struct element_group *g)
|
||||
{
|
||||
struct element *e, *n;
|
||||
struct element_group *next;
|
||||
|
||||
if (current_group == g) {
|
||||
next = group_select_next();
|
||||
if (!next || next == g)
|
||||
current_group = NULL;
|
||||
}
|
||||
|
||||
list_for_each_entry_safe(e, n, &g->g_elements, e_list)
|
||||
element_free(e);
|
||||
|
||||
xfree(g);
|
||||
}
|
||||
|
||||
void reset_update_flags(void)
|
||||
{
|
||||
group_foreach_recursive(&element_reset_update_flag, NULL);
|
||||
}
|
||||
|
||||
void free_unused_elements(void)
|
||||
{
|
||||
group_foreach_recursive(&element_check_if_dead, NULL);
|
||||
}
|
||||
|
||||
struct group_hdr *group_lookup_hdr(const char *name)
|
||||
{
|
||||
struct group_hdr *hdr;
|
||||
|
||||
list_for_each_entry(hdr, &titles_list, gh_list)
|
||||
if (!strcmp(hdr->gh_name, name))
|
||||
return hdr;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int group_new_hdr(const char *name, const char *title,
|
||||
const char *col1, const char *col2,
|
||||
const char *col3, const char *col4)
|
||||
{
|
||||
struct group_hdr *hdr;
|
||||
|
||||
if (group_lookup_hdr(name))
|
||||
return -EEXIST;
|
||||
|
||||
hdr = xcalloc(1, sizeof(*hdr));
|
||||
|
||||
init_list_head(&hdr->gh_list);
|
||||
|
||||
hdr->gh_name = strdup(name);
|
||||
hdr->gh_title = strdup(title);
|
||||
|
||||
hdr->gh_column[0] = strdup(col1);
|
||||
hdr->gh_column[1] = strdup(col2);
|
||||
hdr->gh_column[2] = strdup(col3);
|
||||
hdr->gh_column[3] = strdup(col4);
|
||||
|
||||
list_add_tail(&hdr->gh_list, &titles_list);
|
||||
|
||||
DBG("New group title %s \"%s\"", name, title);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int group_new_derived_hdr(const char *name, const char *title,
|
||||
const char *template)
|
||||
{
|
||||
struct group_hdr *t;
|
||||
|
||||
if (group_lookup_hdr(name))
|
||||
return -EEXIST;
|
||||
|
||||
if (!(t = group_lookup_hdr(template)))
|
||||
return -ENOENT;
|
||||
|
||||
return group_new_hdr(name, title, t->gh_column[0], t->gh_column[1],
|
||||
t->gh_column[2], t->gh_column[3]);
|
||||
}
|
||||
|
||||
static void group_hdr_free(struct group_hdr *hdr)
|
||||
{
|
||||
xfree(hdr->gh_name);
|
||||
xfree(hdr->gh_title);
|
||||
xfree(hdr->gh_column[0]);
|
||||
xfree(hdr->gh_column[1]);
|
||||
xfree(hdr->gh_column[2]);
|
||||
xfree(hdr->gh_column[3]);
|
||||
xfree(hdr);
|
||||
}
|
||||
|
||||
static void __init group_init(void)
|
||||
{
|
||||
DBG("init");
|
||||
|
||||
group_new_hdr("intf", "Interfaces",
|
||||
"RX bps", "pps", "TX bps", "pps");
|
||||
}
|
||||
|
||||
static void __exit group_exit(void)
|
||||
{
|
||||
struct element_group *g, *next;
|
||||
struct group_hdr *hdr, *gnext;
|
||||
|
||||
list_for_each_entry_safe(g, next, &group_list, g_list)
|
||||
group_free(g);
|
||||
|
||||
list_for_each_entry_safe(hdr, gnext, &titles_list, gh_list)
|
||||
group_hdr_free(hdr);
|
||||
}
|
318
src/history.c
@ -1,318 +0,0 @@
|
||||
/*
|
||||
* history.c History Management
|
||||
*
|
||||
* Copyright (c) 2001-2013 Thomas Graf <tgraf@suug.ch>
|
||||
* Copyright (c) 2013 Red Hat, Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included
|
||||
* in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <bmon/bmon.h>
|
||||
#include <bmon/conf.h>
|
||||
#include <bmon/history.h>
|
||||
#include <bmon/utils.h>
|
||||
|
||||
static LIST_HEAD(def_list);
|
||||
|
||||
static struct history_def *current_history;
|
||||
|
||||
struct history_def *history_def_lookup(const char *name)
|
||||
{
|
||||
struct history_def *def;
|
||||
|
||||
list_for_each_entry(def, &def_list, hd_list)
|
||||
if (!strcmp(def->hd_name, name))
|
||||
return def;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
struct history_def *history_def_alloc(const char *name)
|
||||
{
|
||||
struct history_def *def;
|
||||
|
||||
if ((def = history_def_lookup(name)))
|
||||
return def;
|
||||
|
||||
def = xcalloc(1, sizeof(*def));
|
||||
def->hd_name = strdup(name);
|
||||
|
||||
list_add_tail(&def->hd_list, &def_list);
|
||||
|
||||
DBG("New history definition %s", name);
|
||||
|
||||
return def;
|
||||
}
|
||||
|
||||
static void history_def_free(struct history_def *def)
|
||||
{
|
||||
if (!def)
|
||||
return;
|
||||
|
||||
xfree(def->hd_name);
|
||||
xfree(def);
|
||||
}
|
||||
|
||||
static void *history_alloc_data(struct history_def *def)
|
||||
{
|
||||
return xcalloc(def->hd_size, def->hd_type);
|
||||
}
|
||||
|
||||
static void history_store_data(struct history *h, struct history_store *hs,
|
||||
uint64_t total, float diff)
|
||||
{
|
||||
uint64_t delta;
|
||||
|
||||
if (!hs->hs_data) {
|
||||
if (total == HISTORY_UNKNOWN)
|
||||
return;
|
||||
|
||||
hs->hs_data = history_alloc_data(h->h_definition);
|
||||
}
|
||||
|
||||
if (total == HISTORY_UNKNOWN)
|
||||
delta = HISTORY_UNKNOWN;
|
||||
else {
|
||||
delta = (total - hs->hs_prev_total);
|
||||
|
||||
if (delta > 0)
|
||||
delta /= diff;
|
||||
hs->hs_prev_total = total;
|
||||
}
|
||||
|
||||
switch (h->h_definition->hd_type) {
|
||||
case HISTORY_TYPE_8:
|
||||
((uint8_t *) hs->hs_data)[h->h_index] = (uint8_t) delta;
|
||||
break;
|
||||
|
||||
case HISTORY_TYPE_16:
|
||||
((uint16_t *) hs->hs_data)[h->h_index] = (uint16_t) delta;
|
||||
break;
|
||||
|
||||
case HISTORY_TYPE_32:
|
||||
((uint32_t *) hs->hs_data)[h->h_index] = (uint32_t) delta;
|
||||
break;
|
||||
|
||||
case HISTORY_TYPE_64:
|
||||
((uint64_t *) hs->hs_data)[h->h_index] = (uint64_t) delta;
|
||||
break;
|
||||
|
||||
default:
|
||||
BUG();
|
||||
}
|
||||
}
|
||||
|
||||
static inline void inc_history_index(struct history *h)
|
||||
{
|
||||
if (h->h_index < (h->h_definition->hd_size - 1))
|
||||
h->h_index++;
|
||||
else
|
||||
h->h_index = 0;
|
||||
}
|
||||
|
||||
uint64_t history_data(struct history *h, struct history_store *hs, int index)
|
||||
{
|
||||
switch (h->h_definition->hd_type) {
|
||||
case HISTORY_TYPE_8: {
|
||||
uint8_t v = ((uint8_t *) hs->hs_data)[index];
|
||||
return (v == (uint8_t) -1) ? HISTORY_UNKNOWN : v;
|
||||
}
|
||||
|
||||
case HISTORY_TYPE_16: {
|
||||
uint16_t v = ((uint16_t *) hs->hs_data)[index];
|
||||
return (v == (uint16_t) -1) ? HISTORY_UNKNOWN : v;
|
||||
}
|
||||
|
||||
case HISTORY_TYPE_32: {
|
||||
uint32_t v = ((uint32_t *) hs->hs_data)[index];
|
||||
return (v == (uint32_t) -1) ? HISTORY_UNKNOWN : v;
|
||||
}
|
||||
|
||||
case HISTORY_TYPE_64: {
|
||||
uint64_t v = ((uint64_t *) hs->hs_data)[index];
|
||||
return (v == (uint64_t) -1) ? HISTORY_UNKNOWN : v;
|
||||
}
|
||||
|
||||
default:
|
||||
BUG();
|
||||
}
|
||||
}
|
||||
|
||||
void history_update(struct attr *a, struct history *h, timestamp_t *ts)
|
||||
{
|
||||
struct history_def *def = h->h_definition;
|
||||
float timediff;
|
||||
|
||||
if (h->h_last_update.tv_sec)
|
||||
timediff = timestamp_diff(&h->h_last_update, ts);
|
||||
else {
|
||||
timediff = 0.0f; /* initial history update */
|
||||
|
||||
/* Need a delta when working with counters */
|
||||
if (a->a_def->ad_type == ATTR_TYPE_COUNTER)
|
||||
goto update_prev_total;
|
||||
}
|
||||
|
||||
/*
|
||||
* A read interval greater than the desired history interval
|
||||
* can't possibly result in anything useful. Discard it and
|
||||
* mark history data as invalid. The user has to adjust the
|
||||
* read interval.
|
||||
*/
|
||||
if (cfg_read_interval > def->hd_interval)
|
||||
goto discard;
|
||||
|
||||
/*
|
||||
* If the history interval matches the read interval it makes
|
||||
* sense to update upon every read. The reader timing already
|
||||
* took care of being as close as possible to the desired
|
||||
* interval.
|
||||
*/
|
||||
if (cfg_read_interval == def->hd_interval)
|
||||
goto update;
|
||||
|
||||
if (timediff > h->h_max_interval)
|
||||
goto discard;
|
||||
|
||||
if (timediff < h->h_min_interval)
|
||||
return;
|
||||
|
||||
update:
|
||||
history_store_data(h, &h->h_rx, a->a_rx_rate.r_total, timediff);
|
||||
history_store_data(h, &h->h_tx, a->a_tx_rate.r_total, timediff);
|
||||
inc_history_index(h);
|
||||
|
||||
goto update_ts;
|
||||
|
||||
discard:
|
||||
while(timediff >= (def->hd_interval / 2)) {
|
||||
history_store_data(h, &h->h_rx, HISTORY_UNKNOWN, 0.0f);
|
||||
history_store_data(h, &h->h_tx, HISTORY_UNKNOWN, 0.0f);
|
||||
|
||||
inc_history_index(h);
|
||||
timediff -= def->hd_interval;
|
||||
}
|
||||
|
||||
update_prev_total:
|
||||
h->h_rx.hs_prev_total = a->a_rx_rate.r_total;
|
||||
h->h_tx.hs_prev_total = a->a_tx_rate.r_total;
|
||||
|
||||
update_ts:
|
||||
copy_timestamp(&h->h_last_update, ts);
|
||||
}
|
||||
|
||||
struct history *history_alloc(struct history_def *def)
|
||||
{
|
||||
struct history *h;
|
||||
|
||||
h = xcalloc(1, sizeof(*h));
|
||||
|
||||
init_list_head(&h->h_list);
|
||||
|
||||
h->h_definition = def;
|
||||
|
||||
h->h_min_interval = (def->hd_interval - (cfg_read_interval / 2.0f));
|
||||
h->h_max_interval = (def->hd_interval / cfg_history_variance);
|
||||
|
||||
return h;
|
||||
}
|
||||
|
||||
void history_free(struct history *h)
|
||||
{
|
||||
if (!h)
|
||||
return;
|
||||
|
||||
xfree(h->h_rx.hs_data);
|
||||
xfree(h->h_tx.hs_data);
|
||||
|
||||
list_del(&h->h_list);
|
||||
|
||||
xfree(h);
|
||||
}
|
||||
|
||||
void history_attach(struct attr *attr)
|
||||
{
|
||||
struct history_def *def;
|
||||
struct history *h;
|
||||
|
||||
list_for_each_entry(def, &def_list, hd_list) {
|
||||
h = history_alloc(def);
|
||||
list_add_tail(&h->h_list, &attr->a_history_list);
|
||||
}
|
||||
}
|
||||
|
||||
struct history_def *history_select_first(void)
|
||||
{
|
||||
if (list_empty(&def_list))
|
||||
current_history = NULL;
|
||||
else
|
||||
current_history = list_first_entry(&def_list,
|
||||
struct history_def, hd_list);
|
||||
|
||||
return current_history;
|
||||
}
|
||||
|
||||
struct history_def *history_select_last(void)
|
||||
{
|
||||
if (list_empty(&def_list))
|
||||
current_history = NULL;
|
||||
else
|
||||
current_history = list_entry(def_list.prev,
|
||||
struct history_def, hd_list);
|
||||
|
||||
return current_history;
|
||||
}
|
||||
|
||||
struct history_def *history_select_next(void)
|
||||
{
|
||||
if (current_history && current_history->hd_list.next != &def_list) {
|
||||
current_history = list_entry(current_history->hd_list.next,
|
||||
struct history_def, hd_list);
|
||||
return current_history;
|
||||
}
|
||||
|
||||
return history_select_first();
|
||||
}
|
||||
|
||||
struct history_def *history_select_prev(void)
|
||||
{
|
||||
if (current_history && current_history->hd_list.prev != &def_list) {
|
||||
current_history = list_entry(current_history->hd_list.prev,
|
||||
struct history_def, hd_list);
|
||||
return current_history;
|
||||
}
|
||||
|
||||
return history_select_last();
|
||||
}
|
||||
|
||||
struct history_def *history_current(void)
|
||||
{
|
||||
if (!current_history)
|
||||
current_history = history_select_first();
|
||||
|
||||
return current_history;
|
||||
}
|
||||
|
||||
static void __exit history_exit(void)
|
||||
{
|
||||
struct history_def *def, *n;
|
||||
|
||||
list_for_each_entry_safe(def, n, &def_list, hd_list)
|
||||
history_def_free(def);
|
||||
}
|
243
src/in_dummy.c
@ -1,243 +0,0 @@
|
||||
/*
|
||||
* in_dummy.c Dummy Input Method
|
||||
*
|
||||
* Copyright (c) 2001-2013 Thomas Graf <tgraf@suug.ch>
|
||||
* Copyright (c) 2013 Red Hat, Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included
|
||||
* in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <bmon/bmon.h>
|
||||
#include <bmon/input.h>
|
||||
#include <bmon/group.h>
|
||||
#include <bmon/element.h>
|
||||
#include <bmon/attr.h>
|
||||
#include <bmon/utils.h>
|
||||
|
||||
#define MAXDEVS 32
|
||||
|
||||
static uint64_t c_rx_b_inc = 1000000000;
|
||||
static uint64_t c_tx_b_inc = 80000000;
|
||||
static uint64_t c_rx_p_inc = 1000;
|
||||
static uint64_t c_tx_p_inc = 800;
|
||||
static int c_numdev = 5;
|
||||
static int c_randomize = 0;
|
||||
static int c_mtu = 1540;
|
||||
static int c_maxpps = 100000;
|
||||
static int c_numgroups = 2;
|
||||
|
||||
static uint64_t *cnts;
|
||||
|
||||
enum {
|
||||
DUMMY_BYTES,
|
||||
DUMMY_PACKETS,
|
||||
NUM_DUMMY_VALUE,
|
||||
};
|
||||
|
||||
static struct attr_map link_attrs[NUM_DUMMY_VALUE] = {
|
||||
{
|
||||
.name = "bytes",
|
||||
.type = ATTR_TYPE_COUNTER,
|
||||
.unit = UNIT_BYTE,
|
||||
.description = "Bytes",
|
||||
},
|
||||
{
|
||||
.name = "packets",
|
||||
.type = ATTR_TYPE_COUNTER,
|
||||
.unit = UNIT_NUMBER,
|
||||
.description = "Packets",
|
||||
}
|
||||
};
|
||||
|
||||
/* cnts[ngroups][ndevs][2][2] */
|
||||
|
||||
static inline int cnt_size(void)
|
||||
{
|
||||
return c_numgroups * c_numdev * 2 * 2;
|
||||
}
|
||||
|
||||
static inline uint64_t *cnt(int group, int dev, int unit,
|
||||
int direction)
|
||||
{
|
||||
return cnts + (group * c_numdev * 2 * 2) +
|
||||
(dev * 2 * 2) +
|
||||
(unit * 2) +
|
||||
direction;
|
||||
}
|
||||
|
||||
static void dummy_read(void)
|
||||
{
|
||||
int gidx, n;
|
||||
|
||||
for (gidx = 0; gidx < c_numgroups; gidx++) {
|
||||
char gname[32];
|
||||
struct element_group *group;
|
||||
|
||||
snprintf(gname, sizeof(gname), "group%02d", gidx);
|
||||
group = group_lookup(gname, GROUP_CREATE);
|
||||
|
||||
for (n = 0; n < c_numdev; n++) {
|
||||
char ifname[IFNAMSIZ];
|
||||
struct element *e;
|
||||
int i;
|
||||
|
||||
snprintf(ifname, sizeof(ifname), "dummy%d", n);
|
||||
|
||||
if (!(e = element_lookup(group, ifname, 0, NULL, ELEMENT_CREAT)))
|
||||
return;
|
||||
|
||||
if (e->e_flags & ELEMENT_FLAG_CREATED) {
|
||||
if (element_set_key_attr(e, "bytes", "packets") ||
|
||||
element_set_usage_attr(e, "bytes"))
|
||||
BUG();
|
||||
e->e_flags &= ~ELEMENT_FLAG_CREATED;
|
||||
}
|
||||
|
||||
if (e->e_flags & ELEMENT_FLAG_UPDATED)
|
||||
continue;
|
||||
|
||||
if (c_randomize) {
|
||||
uint64_t rx = rand() % c_maxpps;
|
||||
uint64_t tx = rand() % c_maxpps;
|
||||
|
||||
*cnt(gidx, n, 0, 0) += rx;
|
||||
*cnt(gidx, n, 0, 1) += tx;
|
||||
*cnt(gidx, n, 1, 0) += rx * (rand() % c_mtu);
|
||||
*cnt(gidx, n, 1, 1) += tx * (rand() % c_mtu);
|
||||
} else {
|
||||
*cnt(gidx, n, 0, 0) += c_rx_p_inc;
|
||||
*cnt(gidx, n, 0, 1) += c_tx_p_inc;
|
||||
*cnt(gidx, n, 1, 0) += c_rx_b_inc;
|
||||
*cnt(gidx, n, 1, 1) += c_tx_b_inc;
|
||||
}
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(link_attrs); i++) {
|
||||
struct attr_map *m = &link_attrs[i];
|
||||
|
||||
attr_update(e, m->attrid,
|
||||
*cnt(gidx, n, i, 0),
|
||||
*cnt(gidx, n, i, 1),
|
||||
UPDATE_FLAG_RX | UPDATE_FLAG_TX |
|
||||
UPDATE_FLAG_64BIT);
|
||||
}
|
||||
|
||||
element_notify_update(e, NULL);
|
||||
element_lifesign(e, 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void print_help(void)
|
||||
{
|
||||
printf(
|
||||
"dummy - Statistic generator module (dummy)\n" \
|
||||
"\n" \
|
||||
" Basic statistic generator for testing purposes. Can produce a\n" \
|
||||
" constant or random statistic flow with configurable parameters.\n" \
|
||||
" Author: Thomas Graf <tgraf@suug.ch>\n" \
|
||||
"\n" \
|
||||
" Options:\n" \
|
||||
" rxb=NUM RX bytes increment amount (default: 10^9)\n" \
|
||||
" txb=NUM TX bytes increment amount (default: 8*10^7)\n" \
|
||||
" rxp=NUM RX packets increment amount (default: 1K)\n" \
|
||||
" txp=NUM TX packets increment amount (default: 800)\n" \
|
||||
" num=NUM Number of devices (default: 5)\n" \
|
||||
" numgroups=NUM Number of groups (default: 2)\n" \
|
||||
" randomize Randomize counters (default: off)\n" \
|
||||
" seed=NUM Seed for randomizer (default: time(0))\n" \
|
||||
" mtu=NUM Maximal Transmission Unit (default: 1540)\n" \
|
||||
" maxpps=NUM Upper limit for packets per second (default: 100K)\n" \
|
||||
"\n" \
|
||||
" Randomizer:\n" \
|
||||
" RX-packets := Rand() %% maxpps\n" \
|
||||
" TX-packets := Rand() %% maxpps\n" \
|
||||
" RX-bytes := RX-packets * (Rand() %% mtu)\n" \
|
||||
" TX-bytes := TX-packets * (Rand() %% mtu)\n");
|
||||
}
|
||||
|
||||
static void dummy_parse_opt(const char *type, const char *value)
|
||||
{
|
||||
if (!strcasecmp(type, "rxb") && value)
|
||||
c_rx_b_inc = strtol(value, NULL, 0);
|
||||
else if (!strcasecmp(type, "txb") && value)
|
||||
c_tx_b_inc = strtol(value, NULL, 0);
|
||||
else if (!strcasecmp(type, "rxp") && value)
|
||||
c_rx_p_inc = strtol(value, NULL, 0);
|
||||
else if (!strcasecmp(type, "txp") && value)
|
||||
c_tx_p_inc = strtol(value, NULL, 0);
|
||||
else if (!strcasecmp(type, "num") && value)
|
||||
c_numdev = strtol(value, NULL, 0);
|
||||
else if (!strcasecmp(type, "randomize")) {
|
||||
c_randomize = 1;
|
||||
srand(time(NULL));
|
||||
} else if (!strcasecmp(type, "seed") && value)
|
||||
srand(strtol(value, NULL, 0));
|
||||
else if (!strcasecmp(type, "mtu") && value)
|
||||
c_mtu = strtol(value, NULL, 0);
|
||||
else if (!strcasecmp(type, "maxpps") && value)
|
||||
c_maxpps = strtol(value, NULL, 0);
|
||||
else if (!strcasecmp(type, "numgroups") && value)
|
||||
c_numgroups = strtol(value, NULL, 0);
|
||||
else if (!strcasecmp(type, "help")) {
|
||||
print_help();
|
||||
exit(0);
|
||||
}
|
||||
}
|
||||
|
||||
static int dummy_do_init(void)
|
||||
{
|
||||
if (attr_map_load(link_attrs, ARRAY_SIZE(link_attrs)))
|
||||
BUG();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int dummy_probe(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (c_numdev >= MAXDEVS) {
|
||||
fprintf(stderr, "numdev must be in range 0..%d\n", MAXDEVS);
|
||||
return 0;
|
||||
}
|
||||
|
||||
cnts = xcalloc(cnt_size(), sizeof(uint64_t));
|
||||
|
||||
for (i = 0; i < c_numgroups; i++) {
|
||||
char groupname[32];
|
||||
snprintf(groupname, sizeof(groupname), "group%02d", i);
|
||||
|
||||
group_new_derived_hdr(groupname, groupname, DEFAULT_GROUP);
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static struct bmon_module dummy_ops = {
|
||||
.m_name = "dummy",
|
||||
.m_do = dummy_read,
|
||||
.m_parse_opt = dummy_parse_opt,
|
||||
.m_probe = dummy_probe,
|
||||
.m_init = dummy_do_init,
|
||||
};
|
||||
|
||||
static void __init dummy_init(void)
|
||||
{
|
||||
input_register(&dummy_ops);
|
||||
}
|
957
src/in_netlink.c
@ -1,957 +0,0 @@
|
||||
/*
|
||||
* in_netlink.c Netlink input
|
||||
*
|
||||
* Copyright (c) 2001-2013 Thomas Graf <tgraf@suug.ch>
|
||||
* Copyright (c) 2013 Red Hat, Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included
|
||||
* in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <bmon/bmon.h>
|
||||
#include <bmon/input.h>
|
||||
#include <bmon/element.h>
|
||||
#include <bmon/attr.h>
|
||||
#include <bmon/conf.h>
|
||||
#include <bmon/input.h>
|
||||
#include <bmon/utils.h>
|
||||
|
||||
#ifndef SYS_BSD
|
||||
|
||||
static int c_notc = 0;
|
||||
static struct element_group *grp;
|
||||
static struct bmon_module netlink_ops;
|
||||
|
||||
#include <linux/if.h>
|
||||
|
||||
#include <netlink/netlink.h>
|
||||
#include <netlink/cache.h>
|
||||
#include <netlink/utils.h>
|
||||
#include <netlink/route/link.h>
|
||||
#include <netlink/route/tc.h>
|
||||
#include <netlink/route/qdisc.h>
|
||||
#include <netlink/route/class.h>
|
||||
#include <netlink/route/classifier.h>
|
||||
#include <netlink/route/qdisc/htb.h>
|
||||
|
||||
/* These counters are not available prior to libnl 3.2.25. Set them to -1 so
|
||||
* rtnl_link_get_stat() won't be called for them. */
|
||||
#if LIBNL_CURRENT < 220
|
||||
# define RTNL_LINK_ICMP6_CSUMERRORS -1
|
||||
# define RTNL_LINK_IP6_CSUMERRORS -1
|
||||
# define RTNL_LINK_IP6_NOECTPKTS -1
|
||||
# define RTNL_LINK_IP6_ECT1PKTS -1
|
||||
# define RTNL_LINK_IP6_ECT0PKTS -1
|
||||
# define RTNL_LINK_IP6_CEPKTS -1
|
||||
#endif
|
||||
|
||||
static struct attr_map link_attrs[] = {
|
||||
{
|
||||
.name = "bytes",
|
||||
.type = ATTR_TYPE_COUNTER,
|
||||
.unit = UNIT_BYTE,
|
||||
.description = "Bytes",
|
||||
.rxid = RTNL_LINK_RX_BYTES,
|
||||
.txid = RTNL_LINK_TX_BYTES,
|
||||
},
|
||||
{
|
||||
.name = "packets",
|
||||
.type = ATTR_TYPE_COUNTER,
|
||||
.unit = UNIT_NUMBER,
|
||||
.description = "Packets",
|
||||
.rxid = RTNL_LINK_RX_PACKETS,
|
||||
.txid = RTNL_LINK_TX_PACKETS,
|
||||
},
|
||||
{
|
||||
.name = "errors",
|
||||
.type = ATTR_TYPE_COUNTER,
|
||||
.unit = UNIT_NUMBER,
|
||||
.description = "Errors",
|
||||
.rxid = RTNL_LINK_RX_ERRORS,
|
||||
.txid = RTNL_LINK_TX_ERRORS,
|
||||
},
|
||||
{
|
||||
.name = "drop",
|
||||
.type = ATTR_TYPE_COUNTER,
|
||||
.unit = UNIT_NUMBER,
|
||||
.description = "Dropped",
|
||||
.rxid = RTNL_LINK_RX_DROPPED,
|
||||
.txid = RTNL_LINK_TX_DROPPED,
|
||||
},
|
||||
{
|
||||
.name = "compressed",
|
||||
.type = ATTR_TYPE_COUNTER,
|
||||
.unit = UNIT_NUMBER,
|
||||
.description = "Compressed",
|
||||
.rxid = RTNL_LINK_RX_COMPRESSED,
|
||||
.txid = RTNL_LINK_TX_COMPRESSED,
|
||||
},
|
||||
{
|
||||
.name = "fifoerr",
|
||||
.type = ATTR_TYPE_COUNTER,
|
||||
.unit = UNIT_NUMBER,
|
||||
.description = "FIFO Error",
|
||||
.rxid = RTNL_LINK_RX_FIFO_ERR,
|
||||
.txid = RTNL_LINK_TX_FIFO_ERR,
|
||||
},
|
||||
{
|
||||
.name = "lenerr",
|
||||
.type = ATTR_TYPE_COUNTER,
|
||||
.unit = UNIT_NUMBER,
|
||||
.description = "Length Error",
|
||||
.rxid = RTNL_LINK_RX_LEN_ERR,
|
||||
.txid = -1,
|
||||
},
|
||||
{
|
||||
.name = "overerr",
|
||||
.type = ATTR_TYPE_COUNTER,
|
||||
.unit = UNIT_NUMBER,
|
||||
.description = "Over Error",
|
||||
.rxid = RTNL_LINK_RX_OVER_ERR,
|
||||
.txid = -1,
|
||||
},
|
||||
{
|
||||
.name = "crcerr",
|
||||
.type = ATTR_TYPE_COUNTER,
|
||||
.unit = UNIT_NUMBER,
|
||||
.description = "CRC Error",
|
||||
.rxid = RTNL_LINK_RX_CRC_ERR,
|
||||
.txid = -1,
|
||||
},
|
||||
{
|
||||
.name = "frameerr",
|
||||
.type = ATTR_TYPE_COUNTER,
|
||||
.unit = UNIT_NUMBER,
|
||||
.description = "Frame Error",
|
||||
.rxid = RTNL_LINK_RX_FRAME_ERR,
|
||||
.txid = -1,
|
||||
},
|
||||
{
|
||||
.name = "misserr",
|
||||
.type = ATTR_TYPE_COUNTER,
|
||||
.unit = UNIT_NUMBER,
|
||||
.description = "Missed Error",
|
||||
.rxid = RTNL_LINK_RX_MISSED_ERR,
|
||||
.txid = -1,
|
||||
},
|
||||
{
|
||||
.name = "aborterr",
|
||||
.type = ATTR_TYPE_COUNTER,
|
||||
.unit = UNIT_NUMBER,
|
||||
.description = "Abort Error",
|
||||
.rxid = -1,
|
||||
.txid = RTNL_LINK_TX_ABORT_ERR,
|
||||
},
|
||||
{
|
||||
.name = "carrerr",
|
||||
.type = ATTR_TYPE_COUNTER,
|
||||
.unit = UNIT_NUMBER,
|
||||
.description = "Carrier Error",
|
||||
.rxid = -1,
|
||||
.txid = RTNL_LINK_TX_CARRIER_ERR,
|
||||
},
|
||||
{
|
||||
.name = "hbeaterr",
|
||||
.type = ATTR_TYPE_COUNTER,
|
||||
.unit = UNIT_NUMBER,
|
||||
.description = "Heartbeat Error",
|
||||
.rxid = -1,
|
||||
.txid = RTNL_LINK_TX_HBEAT_ERR,
|
||||
},
|
||||
{
|
||||
.name = "winerr",
|
||||
.type = ATTR_TYPE_COUNTER,
|
||||
.unit = UNIT_NUMBER,
|
||||
.description = "Window Error",
|
||||
.rxid = -1,
|
||||
.txid = RTNL_LINK_TX_WIN_ERR,
|
||||
},
|
||||
{
|
||||
.name = "coll",
|
||||
.type = ATTR_TYPE_COUNTER,
|
||||
.unit = UNIT_NUMBER,
|
||||
.description = "Collisions",
|
||||
.rxid = -1,
|
||||
.txid = RTNL_LINK_COLLISIONS,
|
||||
},
|
||||
{
|
||||
.name = "mcast",
|
||||
.type = ATTR_TYPE_COUNTER,
|
||||
.unit = UNIT_NUMBER,
|
||||
.description = "Multicast",
|
||||
.rxid = -1,
|
||||
.txid = RTNL_LINK_MULTICAST,
|
||||
},
|
||||
{
|
||||
.name = "ip6pkts",
|
||||
.type = ATTR_TYPE_COUNTER,
|
||||
.unit = UNIT_NUMBER,
|
||||
.description = "Ip6Pkts",
|
||||
.rxid = RTNL_LINK_IP6_INPKTS,
|
||||
.txid = RTNL_LINK_IP6_OUTPKTS,
|
||||
},
|
||||
{
|
||||
.name = "ip6discards",
|
||||
.type = ATTR_TYPE_COUNTER,
|
||||
.unit = UNIT_NUMBER,
|
||||
.description = "Ip6Discards",
|
||||
.rxid = RTNL_LINK_IP6_INDISCARDS,
|
||||
.txid = RTNL_LINK_IP6_OUTDISCARDS,
|
||||
},
|
||||
{
|
||||
.name = "ip6octets",
|
||||
.type = ATTR_TYPE_COUNTER,
|
||||
.unit = UNIT_BYTE,
|
||||
.description = "Ip6Octets",
|
||||
.rxid = RTNL_LINK_IP6_INOCTETS,
|
||||
.txid = RTNL_LINK_IP6_OUTOCTETS,
|
||||
},
|
||||
{
|
||||
.name = "ip6bcastp",
|
||||
.type = ATTR_TYPE_COUNTER,
|
||||
.unit = UNIT_NUMBER,
|
||||
.description = "Ip6 Broadcast Packets",
|
||||
.rxid = RTNL_LINK_IP6_INBCASTPKTS,
|
||||
.txid = RTNL_LINK_IP6_OUTBCASTPKTS,
|
||||
},
|
||||
{
|
||||
.name = "ip6bcast",
|
||||
.type = ATTR_TYPE_COUNTER,
|
||||
.unit = UNIT_BYTE,
|
||||
.description = "Ip6 Broadcast",
|
||||
.rxid = RTNL_LINK_IP6_INBCASTOCTETS,
|
||||
.txid = RTNL_LINK_IP6_OUTBCASTOCTETS,
|
||||
},
|
||||
{
|
||||
.name = "ip6mcastp",
|
||||
.type = ATTR_TYPE_COUNTER,
|
||||
.unit = UNIT_NUMBER,
|
||||
.description = "Ip6 Multicast Packets",
|
||||
.rxid = RTNL_LINK_IP6_INMCASTPKTS,
|
||||
.txid = RTNL_LINK_IP6_OUTMCASTPKTS,
|
||||
},
|
||||
{
|
||||
.name = "ip6mcast",
|
||||
.type = ATTR_TYPE_COUNTER,
|
||||
.unit = UNIT_BYTE,
|
||||
.description = "Ip6 Multicast",
|
||||
.rxid = RTNL_LINK_IP6_INMCASTOCTETS,
|
||||
.txid = RTNL_LINK_IP6_OUTMCASTOCTETS,
|
||||
},
|
||||
{
|
||||
.name = "ip6noroute",
|
||||
.type = ATTR_TYPE_COUNTER,
|
||||
.unit = UNIT_NUMBER,
|
||||
.description = "Ip6 No Route",
|
||||
.rxid = RTNL_LINK_IP6_INNOROUTES,
|
||||
.txid = RTNL_LINK_IP6_OUTNOROUTES,
|
||||
},
|
||||
{
|
||||
.name = "ip6forward",
|
||||
.type = ATTR_TYPE_COUNTER,
|
||||
.unit = UNIT_NUMBER,
|
||||
.description = "Ip6 Forwarded",
|
||||
.rxid = -1,
|
||||
.txid = RTNL_LINK_IP6_OUTFORWDATAGRAMS,
|
||||
},
|
||||
{
|
||||
.name = "ip6delivers",
|
||||
.type = ATTR_TYPE_COUNTER,
|
||||
.unit = UNIT_NUMBER,
|
||||
.description = "Ip6 Delivers",
|
||||
.rxid = RTNL_LINK_IP6_INDELIVERS,
|
||||
.txid = -1,
|
||||
},
|
||||
{
|
||||
.name = "icmp6",
|
||||
.type = ATTR_TYPE_COUNTER,
|
||||
.unit = UNIT_NUMBER,
|
||||
.description = "ICMPv6",
|
||||
.rxid = RTNL_LINK_ICMP6_INMSGS,
|
||||
.txid = RTNL_LINK_ICMP6_OUTMSGS,
|
||||
},
|
||||
{
|
||||
.name = "icmp6err",
|
||||
.type = ATTR_TYPE_COUNTER,
|
||||
.unit = UNIT_NUMBER,
|
||||
.description = "ICMPv6 Errors",
|
||||
.rxid = RTNL_LINK_ICMP6_INERRORS,
|
||||
.txid = RTNL_LINK_ICMP6_OUTERRORS,
|
||||
},
|
||||
{
|
||||
.name = "icmp6csumerr",
|
||||
.type = ATTR_TYPE_COUNTER,
|
||||
.unit = UNIT_NUMBER,
|
||||
.description = "ICMPv6 Checksum Errors",
|
||||
.rxid = RTNL_LINK_ICMP6_CSUMERRORS,
|
||||
.txid = -1,
|
||||
},
|
||||
{
|
||||
.name = "ip6inhdrerr",
|
||||
.type = ATTR_TYPE_COUNTER,
|
||||
.unit = UNIT_NUMBER,
|
||||
.description = "Ip6 Header Error",
|
||||
.rxid = RTNL_LINK_IP6_INHDRERRORS,
|
||||
.txid = -1,
|
||||
},
|
||||
{
|
||||
.name = "ip6toobigerr",
|
||||
.type = ATTR_TYPE_COUNTER,
|
||||
.unit = UNIT_NUMBER,
|
||||
.description = "Ip6 Too Big Error",
|
||||
.rxid = RTNL_LINK_IP6_INTOOBIGERRORS,
|
||||
.txid = -1,
|
||||
},
|
||||
{
|
||||
.name = "ip6trunc",
|
||||
.type = ATTR_TYPE_COUNTER,
|
||||
.unit = UNIT_NUMBER,
|
||||
.description = "Ip6 Truncated Packets",
|
||||
.rxid = RTNL_LINK_IP6_INTRUNCATEDPKTS,
|
||||
.txid = -1,
|
||||
},
|
||||
{
|
||||
.name = "ip6unkproto",
|
||||
.type = ATTR_TYPE_COUNTER,
|
||||
.unit = UNIT_NUMBER,
|
||||
.description = "Ip6 Unknown Protocol Error",
|
||||
.rxid = RTNL_LINK_IP6_INUNKNOWNPROTOS,
|
||||
.txid = -1,
|
||||
},
|
||||
{
|
||||
.name = "ip6addrerr",
|
||||
.type = ATTR_TYPE_COUNTER,
|
||||
.unit = UNIT_NUMBER,
|
||||
.description = "Ip6 Address Error",
|
||||
.rxid = RTNL_LINK_IP6_INADDRERRORS,
|
||||
.txid = -1,
|
||||
},
|
||||
{
|
||||
.name = "ip6csumerr",
|
||||
.type = ATTR_TYPE_COUNTER,
|
||||
.unit = UNIT_NUMBER,
|
||||
.description = "Ip6 Checksum Error",
|
||||
.rxid = RTNL_LINK_IP6_CSUMERRORS,
|
||||
.txid = -1,
|
||||
},
|
||||
{
|
||||
.name = "ip6reasmtimeo",
|
||||
.type = ATTR_TYPE_COUNTER,
|
||||
.unit = UNIT_NUMBER,
|
||||
.description = "Ip6 Reassembly Timeouts",
|
||||
.rxid = RTNL_LINK_IP6_REASMTIMEOUT,
|
||||
.txid = -1,
|
||||
},
|
||||
{
|
||||
.name = "ip6fragok",
|
||||
.type = ATTR_TYPE_COUNTER,
|
||||
.unit = UNIT_NUMBER,
|
||||
.description = "Ip6 Reasm/Frag OK",
|
||||
.rxid = RTNL_LINK_IP6_REASMOKS,
|
||||
.txid = RTNL_LINK_IP6_FRAGOKS,
|
||||
},
|
||||
{
|
||||
.name = "ip6fragfail",
|
||||
.type = ATTR_TYPE_COUNTER,
|
||||
.unit = UNIT_NUMBER,
|
||||
.description = "Ip6 Reasm/Frag Failures",
|
||||
.rxid = RTNL_LINK_IP6_REASMFAILS,
|
||||
.txid = RTNL_LINK_IP6_FRAGFAILS,
|
||||
},
|
||||
{
|
||||
.name = "ip6fragcreate",
|
||||
.type = ATTR_TYPE_COUNTER,
|
||||
.unit = UNIT_NUMBER,
|
||||
.description = "Ip6 Reasm/Frag Requests",
|
||||
.rxid = RTNL_LINK_IP6_REASMREQDS,
|
||||
.txid = RTNL_LINK_IP6_FRAGCREATES,
|
||||
},
|
||||
{
|
||||
.name = "ip6noectpkts",
|
||||
.type = ATTR_TYPE_COUNTER,
|
||||
.unit = UNIT_NUMBER,
|
||||
.description = "Ip6 Non-ECT Packets",
|
||||
.rxid = RTNL_LINK_IP6_NOECTPKTS,
|
||||
.txid = -1,
|
||||
},
|
||||
{
|
||||
.name = "ip6ect1pkts",
|
||||
.type = ATTR_TYPE_COUNTER,
|
||||
.unit = UNIT_NUMBER,
|
||||
.description = "Ip6 ECT(1) Packets",
|
||||
.rxid = RTNL_LINK_IP6_ECT1PKTS,
|
||||
.txid = -1,
|
||||
},
|
||||
{
|
||||
.name = "ip6ect0pkts",
|
||||
.type = ATTR_TYPE_COUNTER,
|
||||
.unit = UNIT_NUMBER,
|
||||
.description = "Ip6 ECT(0) Packets",
|
||||
.rxid = RTNL_LINK_IP6_ECT0PKTS,
|
||||
.txid = -1,
|
||||
},
|
||||
{
|
||||
.name = "ip6cepkts",
|
||||
.type = ATTR_TYPE_COUNTER,
|
||||
.unit = UNIT_NUMBER,
|
||||
.description = "Ip6 CE Packets",
|
||||
.rxid = RTNL_LINK_IP6_CEPKTS,
|
||||
.txid = -1,
|
||||
}
|
||||
};
|
||||
|
||||
static struct attr_map tc_attrs[] = {
|
||||
{
|
||||
.name = "tc_bytes",
|
||||
.type = ATTR_TYPE_COUNTER,
|
||||
.unit = UNIT_BYTE,
|
||||
.description = "Bytes",
|
||||
.rxid = -1,
|
||||
.txid = RTNL_TC_BYTES,
|
||||
},
|
||||
{
|
||||
.name = "tc_packets",
|
||||
.type = ATTR_TYPE_COUNTER,
|
||||
.unit = UNIT_NUMBER,
|
||||
.description = "Packets",
|
||||
.rxid = -1,
|
||||
.txid = RTNL_TC_PACKETS,
|
||||
},
|
||||
{
|
||||
.name = "tc_overlimits",
|
||||
.type = ATTR_TYPE_COUNTER,
|
||||
.unit = UNIT_NUMBER,
|
||||
.description = "Overlimits",
|
||||
.rxid = -1,
|
||||
.txid = RTNL_TC_OVERLIMITS,
|
||||
},
|
||||
{
|
||||
.name = "tc_drop",
|
||||
.type = ATTR_TYPE_COUNTER,
|
||||
.unit = UNIT_NUMBER,
|
||||
.description = "Dropped",
|
||||
.rxid = -1,
|
||||
.txid = RTNL_TC_DROPS,
|
||||
},
|
||||
{
|
||||
.name = "tc_bps",
|
||||
.type = ATTR_TYPE_RATE,
|
||||
.unit = UNIT_BYTE,
|
||||
.description = "Byte Rate/s",
|
||||
.rxid = -1,
|
||||
.txid = RTNL_TC_RATE_BPS,
|
||||
},
|
||||
{
|
||||
.name = "tc_pps",
|
||||
.type = ATTR_TYPE_RATE,
|
||||
.unit = UNIT_NUMBER,
|
||||
.description = "Packet Rate/s",
|
||||
.rxid = -1,
|
||||
.txid = RTNL_TC_RATE_PPS,
|
||||
},
|
||||
{
|
||||
.name = "tc_qlen",
|
||||
.type = ATTR_TYPE_RATE,
|
||||
.unit = UNIT_NUMBER,
|
||||
.description = "Queue Length",
|
||||
.rxid = -1,
|
||||
.txid = RTNL_TC_QLEN,
|
||||
},
|
||||
{
|
||||
.name = "tc_backlog",
|
||||
.type = ATTR_TYPE_RATE,
|
||||
.unit = UNIT_NUMBER,
|
||||
.description = "Backlog",
|
||||
.rxid = -1,
|
||||
.txid = RTNL_TC_BACKLOG,
|
||||
},
|
||||
{
|
||||
.name = "tc_requeues",
|
||||
.type = ATTR_TYPE_COUNTER,
|
||||
.unit = UNIT_NUMBER,
|
||||
.description = "Requeues",
|
||||
.rxid = -1,
|
||||
.txid = RTNL_TC_REQUEUES,
|
||||
}
|
||||
};
|
||||
|
||||
struct rdata {
|
||||
struct nl_cache * class_cache;
|
||||
struct element * parent;
|
||||
int level;
|
||||
};
|
||||
|
||||
static struct nl_sock *sock;
|
||||
static struct nl_cache *link_cache, *qdisc_cache;
|
||||
|
||||
static void update_tc_attrs(struct element *e, struct rtnl_tc *tc)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(tc_attrs); i++) {
|
||||
uint64_t c_tx = rtnl_tc_get_stat(tc, tc_attrs[i].txid);
|
||||
attr_update(e, tc_attrs[i].attrid, 0, c_tx, UPDATE_FLAG_TX);
|
||||
}
|
||||
}
|
||||
|
||||
static void update_tc_infos(struct element *e, struct rtnl_tc *tc)
|
||||
{
|
||||
char buf[64];
|
||||
|
||||
snprintf(buf, sizeof(buf), "%u", rtnl_tc_get_mtu(tc));
|
||||
element_update_info(e, "MTU", buf);
|
||||
|
||||
snprintf(buf, sizeof(buf), "%u", rtnl_tc_get_mpu(tc));
|
||||
element_update_info(e, "MPU", buf);
|
||||
|
||||
snprintf(buf, sizeof(buf), "%u", rtnl_tc_get_overhead(tc));
|
||||
element_update_info(e, "Overhead", buf);
|
||||
|
||||
snprintf(buf, sizeof(buf), "%#x", rtnl_tc_get_handle(tc));
|
||||
element_update_info(e, "Id", buf);
|
||||
|
||||
snprintf(buf, sizeof(buf), "%#x", rtnl_tc_get_parent(tc));
|
||||
element_update_info(e, "Parent", buf);
|
||||
|
||||
}
|
||||
|
||||
static void handle_qdisc(struct nl_object *obj, void *);
|
||||
static void find_classes(uint32_t, struct rdata *);
|
||||
static void find_qdiscs(int, uint32_t, struct rdata *);
|
||||
|
||||
static struct element *handle_tc_obj(struct rtnl_tc *tc, const char *prefix,
|
||||
const struct rdata *rdata)
|
||||
{
|
||||
char buf[IFNAME_MAX], name[IFNAME_MAX];
|
||||
uint32_t id = rtnl_tc_get_handle(tc);
|
||||
struct element *e;
|
||||
|
||||
rtnl_tc_handle2str(id, buf, sizeof(buf));
|
||||
snprintf(name, sizeof(name), "%s %s (%s)",
|
||||
prefix, buf, rtnl_tc_get_kind(tc));
|
||||
|
||||
if (!rdata || !rdata->parent)
|
||||
BUG();
|
||||
|
||||
if (!(e = element_lookup(grp, name, id, rdata->parent, ELEMENT_CREAT)))
|
||||
return NULL;
|
||||
|
||||
if (e->e_flags & ELEMENT_FLAG_CREATED) {
|
||||
e->e_level = rdata->level;
|
||||
|
||||
if (element_set_key_attr(e, "tc_bytes", "tc_packets") ||
|
||||
element_set_usage_attr(e, "tc_bytes"))
|
||||
BUG();
|
||||
|
||||
update_tc_infos(e, tc);
|
||||
|
||||
e->e_flags &= ~ELEMENT_FLAG_CREATED;
|
||||
}
|
||||
|
||||
update_tc_attrs(e, tc);
|
||||
|
||||
element_notify_update(e, NULL);
|
||||
element_lifesign(e, 1);
|
||||
|
||||
return e;
|
||||
}
|
||||
|
||||
static void handle_cls(struct nl_object *obj, void *arg)
|
||||
{
|
||||
struct rtnl_cls *cls = (struct rtnl_cls *) obj;
|
||||
struct rdata *rdata = arg;
|
||||
|
||||
handle_tc_obj((struct rtnl_tc *) cls, "cls", rdata);
|
||||
}
|
||||
|
||||
static void handle_class(struct nl_object *obj, void *arg)
|
||||
{
|
||||
struct rtnl_tc *tc = (struct rtnl_tc *) obj;
|
||||
struct element *e;
|
||||
const struct rdata *rdata = arg;
|
||||
struct rdata ndata = {
|
||||
.class_cache = rdata->class_cache,
|
||||
.level = rdata->level + 1,
|
||||
};
|
||||
|
||||
if (!(e = handle_tc_obj(tc, "class", rdata)))
|
||||
return;
|
||||
|
||||
ndata.parent = e;
|
||||
|
||||
if (!strcmp(rtnl_tc_get_kind(tc), "htb"))
|
||||
element_set_txmax(e, rtnl_htb_get_rate((struct rtnl_class *) tc));
|
||||
|
||||
find_classes(rtnl_tc_get_handle(tc), &ndata);
|
||||
find_qdiscs(rtnl_tc_get_ifindex(tc), rtnl_tc_get_handle(tc), &ndata);
|
||||
}
|
||||
|
||||
static void find_qdiscs(int ifindex, uint32_t parent, struct rdata *rdata)
|
||||
{
|
||||
struct rtnl_qdisc *filter;
|
||||
|
||||
if (!(filter = rtnl_qdisc_alloc()))
|
||||
return;
|
||||
|
||||
rtnl_tc_set_parent((struct rtnl_tc *) filter, parent);
|
||||
rtnl_tc_set_ifindex((struct rtnl_tc *) filter, ifindex);
|
||||
|
||||
nl_cache_foreach_filter(qdisc_cache, OBJ_CAST(filter),
|
||||
handle_qdisc, rdata);
|
||||
|
||||
rtnl_qdisc_put(filter);
|
||||
}
|
||||
|
||||
static void find_cls(int ifindex, uint32_t parent, struct rdata *rdata)
|
||||
{
|
||||
struct nl_cache *cls_cache;
|
||||
|
||||
if (rtnl_cls_alloc_cache(sock, ifindex, parent, &cls_cache) < 0)
|
||||
return;
|
||||
|
||||
nl_cache_foreach(cls_cache, handle_cls, rdata);
|
||||
|
||||
nl_cache_free(cls_cache);
|
||||
}
|
||||
|
||||
static void find_classes(uint32_t parent, struct rdata *rdata)
|
||||
{
|
||||
struct rtnl_class *filter;
|
||||
|
||||
if (!(filter = rtnl_class_alloc()))
|
||||
return;
|
||||
|
||||
rtnl_tc_set_parent((struct rtnl_tc *) filter, parent);
|
||||
|
||||
nl_cache_foreach_filter(rdata->class_cache, OBJ_CAST(filter),
|
||||
handle_class, rdata);
|
||||
|
||||
rtnl_class_put(filter);
|
||||
}
|
||||
|
||||
static void handle_qdisc(struct nl_object *obj, void *arg)
|
||||
{
|
||||
struct rtnl_tc *tc = (struct rtnl_tc *) obj;
|
||||
struct element *e;
|
||||
const struct rdata *rdata = arg;
|
||||
struct rdata ndata = {
|
||||
.class_cache = rdata->class_cache,
|
||||
.level = rdata->level + 1,
|
||||
};
|
||||
|
||||
if (!(e = handle_tc_obj(tc, "qdisc", rdata)))
|
||||
return;
|
||||
|
||||
ndata.parent = e;
|
||||
|
||||
find_cls(rtnl_tc_get_ifindex(tc), rtnl_tc_get_handle(tc), &ndata);
|
||||
|
||||
if (rtnl_tc_get_parent(tc) == TC_H_ROOT) {
|
||||
find_cls(rtnl_tc_get_ifindex(tc), TC_H_ROOT, &ndata);
|
||||
find_classes(TC_H_ROOT, &ndata);
|
||||
}
|
||||
|
||||
find_classes(rtnl_tc_get_handle(tc), &ndata);
|
||||
}
|
||||
|
||||
static void handle_tc(struct element *e, struct rtnl_link *link)
|
||||
{
|
||||
struct rtnl_qdisc *qdisc;
|
||||
struct nl_cache *class_cache;
|
||||
int ifindex = rtnl_link_get_ifindex(link);
|
||||
struct rdata rdata = {
|
||||
.level = 1,
|
||||
.parent = e,
|
||||
};
|
||||
|
||||
if (rtnl_class_alloc_cache(sock, ifindex, &class_cache) < 0)
|
||||
return;
|
||||
|
||||
rdata.class_cache = class_cache;
|
||||
|
||||
qdisc = rtnl_qdisc_get_by_parent(qdisc_cache, ifindex, TC_H_ROOT);
|
||||
if (qdisc) {
|
||||
handle_qdisc(OBJ_CAST(qdisc), &rdata);
|
||||
rtnl_qdisc_put(qdisc);
|
||||
}
|
||||
|
||||
qdisc = rtnl_qdisc_get_by_parent(qdisc_cache, ifindex, 0);
|
||||
if (qdisc) {
|
||||
handle_qdisc(OBJ_CAST(qdisc), &rdata);
|
||||
rtnl_qdisc_put(qdisc);
|
||||
}
|
||||
|
||||
qdisc = rtnl_qdisc_get_by_parent(qdisc_cache, ifindex, TC_H_INGRESS);
|
||||
if (qdisc) {
|
||||
handle_qdisc(OBJ_CAST(qdisc), &rdata);
|
||||
rtnl_qdisc_put(qdisc);
|
||||
}
|
||||
|
||||
nl_cache_free(class_cache);
|
||||
}
|
||||
|
||||
static void update_link_infos(struct element *e, struct rtnl_link *link)
|
||||
{
|
||||
char buf[64];
|
||||
|
||||
snprintf(buf, sizeof(buf), "%u", rtnl_link_get_mtu(link));
|
||||
element_update_info(e, "MTU", buf);
|
||||
|
||||
rtnl_link_flags2str(rtnl_link_get_flags(link), buf, sizeof(buf));
|
||||
element_update_info(e, "Flags", buf);
|
||||
|
||||
rtnl_link_operstate2str(rtnl_link_get_operstate(link),
|
||||
buf, sizeof(buf));
|
||||
element_update_info(e, "Operstate", buf);
|
||||
|
||||
snprintf(buf, sizeof(buf), "%u", rtnl_link_get_ifindex(link));
|
||||
element_update_info(e, "IfIndex", buf);
|
||||
|
||||
nl_addr2str(rtnl_link_get_addr(link), buf, sizeof(buf));
|
||||
element_update_info(e, "Address", buf);
|
||||
|
||||
nl_addr2str(rtnl_link_get_broadcast(link), buf, sizeof(buf));
|
||||
element_update_info(e, "Broadcast", buf);
|
||||
|
||||
rtnl_link_mode2str(rtnl_link_get_linkmode(link),
|
||||
buf, sizeof(buf));
|
||||
element_update_info(e, "Mode", buf);
|
||||
|
||||
snprintf(buf, sizeof(buf), "%u", rtnl_link_get_txqlen(link));
|
||||
element_update_info(e, "TXQlen", buf);
|
||||
|
||||
nl_af2str(rtnl_link_get_family(link), buf, sizeof(buf));
|
||||
element_update_info(e, "Family", buf);
|
||||
|
||||
element_update_info(e, "Alias",
|
||||
rtnl_link_get_ifalias(link) ? : "");
|
||||
|
||||
element_update_info(e, "Qdisc",
|
||||
rtnl_link_get_qdisc(link) ? : "");
|
||||
|
||||
if (rtnl_link_get_link(link)) {
|
||||
snprintf(buf, sizeof(buf), "%u", rtnl_link_get_link(link));
|
||||
element_update_info(e, "SlaveOfIndex", buf);
|
||||
}
|
||||
}
|
||||
|
||||
static void do_link(struct nl_object *obj, void *arg)
|
||||
{
|
||||
struct rtnl_link *link = (struct rtnl_link *) obj;
|
||||
struct element *e, *e_parent = NULL;
|
||||
int i, master_ifindex;
|
||||
|
||||
if (!cfg_show_all && !(rtnl_link_get_flags(link) & IFF_UP)) {
|
||||
/* FIXME: delete element */
|
||||
return;
|
||||
}
|
||||
|
||||
/* Check if the interface is a slave of another interface */
|
||||
if ((master_ifindex = rtnl_link_get_link(link))) {
|
||||
char parent[IFNAMSIZ+1];
|
||||
|
||||
rtnl_link_i2name(link_cache, master_ifindex,
|
||||
parent, sizeof(parent));
|
||||
|
||||
e_parent = element_lookup(grp, parent, master_ifindex, NULL, 0);
|
||||
}
|
||||
|
||||
if (!(e = element_lookup(grp, rtnl_link_get_name(link),
|
||||
rtnl_link_get_ifindex(link), e_parent, ELEMENT_CREAT)))
|
||||
return;
|
||||
|
||||
if (e->e_flags & ELEMENT_FLAG_CREATED) {
|
||||
if (e->e_parent)
|
||||
e->e_level = e->e_parent->e_level + 1;
|
||||
|
||||
if (element_set_key_attr(e, "bytes", "packets") ||
|
||||
element_set_usage_attr(e, "bytes"))
|
||||
BUG();
|
||||
|
||||
/* FIXME: Update link infos every 1s or so */
|
||||
update_link_infos(e, link);
|
||||
|
||||
e->e_flags &= ~ELEMENT_FLAG_CREATED;
|
||||
}
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(link_attrs); i++) {
|
||||
struct attr_map *m = &link_attrs[i];
|
||||
uint64_t c_rx = 0, c_tx = 0;
|
||||
int flags = 0;
|
||||
|
||||
if (m->rxid >= 0) {
|
||||
c_rx = rtnl_link_get_stat(link, m->rxid);
|
||||
flags |= UPDATE_FLAG_RX;
|
||||
}
|
||||
|
||||
if (m->txid >= 0) {
|
||||
c_tx = rtnl_link_get_stat(link, m->txid);
|
||||
flags |= UPDATE_FLAG_TX;
|
||||
}
|
||||
|
||||
attr_update(e, m->attrid, c_rx, c_tx, flags);
|
||||
}
|
||||
|
||||
if (!c_notc && qdisc_cache)
|
||||
handle_tc(e, link);
|
||||
|
||||
element_notify_update(e, NULL);
|
||||
element_lifesign(e, 1);
|
||||
}
|
||||
|
||||
static void netlink_read(void)
|
||||
{
|
||||
int err;
|
||||
|
||||
if ((err = nl_cache_resync(sock, link_cache, NULL, NULL)) < 0) {
|
||||
fprintf(stderr, "Unable to resync link cache: %s\n", nl_geterror(err));
|
||||
goto disable;
|
||||
}
|
||||
|
||||
if (qdisc_cache &&
|
||||
(err = nl_cache_resync(sock, qdisc_cache, NULL, NULL)) < 0) {
|
||||
fprintf(stderr, "Unable to resync qdisc cache: %s\n", nl_geterror(err));
|
||||
goto disable;
|
||||
}
|
||||
|
||||
nl_cache_foreach(link_cache, do_link, NULL);
|
||||
|
||||
return;
|
||||
|
||||
disable:
|
||||
netlink_ops.m_flags &= ~BMON_MODULE_ENABLED;
|
||||
}
|
||||
|
||||
static void netlink_shutdown(void)
|
||||
{
|
||||
nl_cache_free(link_cache);
|
||||
nl_cache_free(qdisc_cache);
|
||||
nl_socket_free(sock);
|
||||
}
|
||||
|
||||
static void netlink_use_bit(struct attr_map *map, const int size)
|
||||
{
|
||||
if(cfg_getbool(cfg, "use_bit")) {
|
||||
for(int i = 0; i < size; ++i) {
|
||||
if(!strcmp(map[i].description, "Bytes")) {
|
||||
map[i].description = "Bits";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static int netlink_do_init(void)
|
||||
{
|
||||
int err;
|
||||
|
||||
if (!(sock = nl_socket_alloc())) {
|
||||
fprintf(stderr, "Unable to allocate netlink socket\n");
|
||||
goto disable;
|
||||
}
|
||||
|
||||
if ((err = nl_connect(sock, NETLINK_ROUTE)) < 0) {
|
||||
fprintf(stderr, "Unable to connect netlink socket: %s\n", nl_geterror(err));
|
||||
goto disable;
|
||||
}
|
||||
|
||||
if ((err = rtnl_link_alloc_cache(sock, AF_UNSPEC, &link_cache)) < 0) {
|
||||
fprintf(stderr, "Unable to allocate link cache: %s\n", nl_geterror(err));
|
||||
goto disable;
|
||||
}
|
||||
|
||||
if ((err = rtnl_qdisc_alloc_cache(sock, &qdisc_cache)) < 0) {
|
||||
fprintf(stderr, "Warning: Unable to allocate qdisc cache: %s\n", nl_geterror(err));
|
||||
fprintf(stderr, "Disabling QoS statistics.\n");
|
||||
qdisc_cache = NULL;
|
||||
}
|
||||
|
||||
netlink_use_bit(link_attrs, ARRAY_SIZE(link_attrs));
|
||||
netlink_use_bit(tc_attrs, ARRAY_SIZE(tc_attrs));
|
||||
if (attr_map_load(link_attrs, ARRAY_SIZE(link_attrs)) ||
|
||||
attr_map_load(tc_attrs, ARRAY_SIZE(tc_attrs)))
|
||||
BUG();
|
||||
|
||||
if (!(grp = group_lookup(DEFAULT_GROUP, GROUP_CREATE)))
|
||||
BUG();
|
||||
|
||||
return 0;
|
||||
|
||||
disable:
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
static int netlink_probe(void)
|
||||
{
|
||||
struct nl_sock *sock;
|
||||
struct nl_cache *lc;
|
||||
int ret = 0;
|
||||
|
||||
if (!(sock = nl_socket_alloc()))
|
||||
return 0;
|
||||
|
||||
if (nl_connect(sock, NETLINK_ROUTE) < 0)
|
||||
return 0;
|
||||
|
||||
if (rtnl_link_alloc_cache(sock, AF_UNSPEC, &lc) == 0) {
|
||||
nl_cache_free(lc);
|
||||
ret = 1;
|
||||
}
|
||||
|
||||
nl_socket_free(sock);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void print_help(void)
|
||||
{
|
||||
printf(
|
||||
"netlink - Netlink statistic collector for Linux\n" \
|
||||
"\n" \
|
||||
" Powerful statistic collector for Linux using netlink sockets\n" \
|
||||
" to collect link and traffic control statistics.\n" \
|
||||
" Author: Thomas Graf <tgraf@suug.ch>\n" \
|
||||
"\n" \
|
||||
" Options:\n" \
|
||||
" notc Do not collect traffic control statistics\n");
|
||||
}
|
||||
|
||||
static void netlink_parse_opt(const char *type, const char *value)
|
||||
{
|
||||
if (!strcasecmp(type, "notc"))
|
||||
c_notc = 1;
|
||||
else if (!strcasecmp(type, "help")) {
|
||||
print_help();
|
||||
exit(0);
|
||||
}
|
||||
}
|
||||
|
||||
static struct bmon_module netlink_ops = {
|
||||
.m_name = "netlink",
|
||||
.m_flags = BMON_MODULE_DEFAULT,
|
||||
.m_do = netlink_read,
|
||||
.m_shutdown = netlink_shutdown,
|
||||
.m_parse_opt = netlink_parse_opt,
|
||||
.m_probe = netlink_probe,
|
||||
.m_init = netlink_do_init,
|
||||
};
|
||||
|
||||
static void __init netlink_init(void)
|
||||
{
|
||||
input_register(&netlink_ops);
|
||||
}
|
||||
#endif
|
@ -1,62 +0,0 @@
|
||||
/*
|
||||
* in_null.c Null Input Method
|
||||
*
|
||||
* Copyright (c) 2001-2013 Thomas Graf <tgraf@suug.ch>
|
||||
* Copyright (c) 2013 Red Hat, Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included
|
||||
* in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <bmon/bmon.h>
|
||||
#include <bmon/input.h>
|
||||
#include <bmon/utils.h>
|
||||
|
||||
static void null_read(void)
|
||||
{
|
||||
DBG("null: reading...");
|
||||
}
|
||||
|
||||
static void print_help(void)
|
||||
{
|
||||
printf(
|
||||
"null - Do not collect statistics at all\n" \
|
||||
"\n" \
|
||||
" Will not collect any statistics at all, used to disable \n" \
|
||||
" local statistics collection.\n" \
|
||||
" Author: Thomas Graf <tgraf@suug.ch>\n");
|
||||
}
|
||||
|
||||
static void null_parse_opt(const char *type, const char *value)
|
||||
{
|
||||
if (!strcasecmp(type, "help")) {
|
||||
print_help();
|
||||
exit(0);
|
||||
}
|
||||
}
|
||||
|
||||
static struct bmon_module null_ops = {
|
||||
.m_name = "null",
|
||||
.m_do = null_read,
|
||||
.m_parse_opt = null_parse_opt,
|
||||
};
|
||||
|
||||
static void __init null_init(void)
|
||||
{
|
||||
input_register(&null_ops);
|
||||
}
|
234
src/in_proc.c
@ -1,234 +0,0 @@
|
||||
/*
|
||||
* in_proc.c /proc/net/dev Input (Linux)
|
||||
*
|
||||
* Copyright (c) 2001-2013 Thomas Graf <tgraf@suug.ch>
|
||||
* Copyright (c) 2013 Red Hat, Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included
|
||||
* in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <bmon/bmon.h>
|
||||
#include <bmon/input.h>
|
||||
#include <bmon/element.h>
|
||||
#include <bmon/group.h>
|
||||
#include <bmon/attr.h>
|
||||
#include <bmon/utils.h>
|
||||
|
||||
static const char *c_path = "/proc/net/dev";
|
||||
static const char *c_group = DEFAULT_GROUP;
|
||||
static struct element_group *grp;
|
||||
|
||||
enum {
|
||||
PROC_BYTES,
|
||||
PROC_PACKETS,
|
||||
PROC_ERRORS,
|
||||
PROC_DROP,
|
||||
PROC_COMPRESSED,
|
||||
PROC_FIFO,
|
||||
PROC_FRAME,
|
||||
PROC_MCAST,
|
||||
NUM_PROC_VALUE,
|
||||
};
|
||||
|
||||
static struct attr_map link_attrs[NUM_PROC_VALUE] = {
|
||||
{
|
||||
.name = "bytes",
|
||||
.type = ATTR_TYPE_COUNTER,
|
||||
.unit = UNIT_BYTE,
|
||||
.description = "Bytes",
|
||||
},
|
||||
{
|
||||
.name = "packets",
|
||||
.type = ATTR_TYPE_COUNTER,
|
||||
.unit = UNIT_NUMBER,
|
||||
.description = "Packets",
|
||||
},
|
||||
{
|
||||
.name = "errors",
|
||||
.type = ATTR_TYPE_COUNTER,
|
||||
.unit = UNIT_NUMBER,
|
||||
.description = "Errors",
|
||||
},
|
||||
{
|
||||
.name = "drop",
|
||||
.type = ATTR_TYPE_COUNTER,
|
||||
.unit = UNIT_NUMBER,
|
||||
.description = "Dropped",
|
||||
},
|
||||
{
|
||||
.name = "compressed",
|
||||
.type = ATTR_TYPE_COUNTER,
|
||||
.unit = UNIT_NUMBER,
|
||||
.description = "Compressed",
|
||||
},
|
||||
{
|
||||
.name = "fifoerr",
|
||||
.type = ATTR_TYPE_COUNTER,
|
||||
.unit = UNIT_NUMBER,
|
||||
.description = "FIFO Error",
|
||||
},
|
||||
{
|
||||
.name = "frameerr",
|
||||
.type = ATTR_TYPE_COUNTER,
|
||||
.unit = UNIT_NUMBER,
|
||||
.description = "Frame Error",
|
||||
},
|
||||
{
|
||||
.name = "mcast",
|
||||
.type = ATTR_TYPE_COUNTER,
|
||||
.unit = UNIT_NUMBER,
|
||||
.description = "Multicast",
|
||||
}
|
||||
};
|
||||
|
||||
static void proc_read(void)
|
||||
{
|
||||
struct element *e;
|
||||
FILE *fd;
|
||||
char buf[512], *p, *s, *unused __unused__;
|
||||
int w;
|
||||
|
||||
if (!(fd = fopen(c_path, "r")))
|
||||
quit("Unable to open file %s: %s\n", c_path, strerror(errno));
|
||||
|
||||
/* Ignore header */
|
||||
unused = fgets(buf, sizeof(buf), fd);
|
||||
unused = fgets(buf, sizeof(buf), fd);
|
||||
|
||||
for (; fgets(buf, sizeof(buf), fd);) {
|
||||
uint64_t data[NUM_PROC_VALUE][2];
|
||||
int i;
|
||||
|
||||
if (buf[0] == '\r' || buf[0] == '\n')
|
||||
continue;
|
||||
|
||||
if (!(p = strchr(buf, ':')))
|
||||
continue;
|
||||
*p = '\0';
|
||||
s = (p + 1);
|
||||
|
||||
for (p = &buf[0]; *p == ' '; p++);
|
||||
|
||||
w = sscanf(s, "%" SCNu64 " %" SCNu64 " %" SCNu64 " %" SCNu64 " "
|
||||
"%" SCNu64 " %" SCNu64 " %" SCNu64 " %" SCNu64 " "
|
||||
"%" SCNu64 " %" SCNu64 " %" SCNu64 " %" SCNu64 " "
|
||||
"%" SCNu64 " %" SCNu64 " %" SCNu64 " %" SCNu64
|
||||
"\n",
|
||||
&data[PROC_BYTES][0],
|
||||
&data[PROC_PACKETS][0],
|
||||
&data[PROC_ERRORS][0],
|
||||
&data[PROC_DROP][0],
|
||||
&data[PROC_FIFO][0],
|
||||
&data[PROC_FRAME][0],
|
||||
&data[PROC_COMPRESSED][0],
|
||||
&data[PROC_MCAST][0],
|
||||
&data[PROC_BYTES][1],
|
||||
&data[PROC_PACKETS][1],
|
||||
&data[PROC_ERRORS][1],
|
||||
&data[PROC_DROP][1],
|
||||
&data[PROC_FIFO][1],
|
||||
&data[PROC_FRAME][1],
|
||||
&data[PROC_COMPRESSED][1],
|
||||
&data[PROC_MCAST][1]);
|
||||
|
||||
if (w != 16)
|
||||
continue;
|
||||
|
||||
if (!(e = element_lookup(grp, p, 0, NULL, ELEMENT_CREAT)))
|
||||
goto skip;
|
||||
|
||||
if (e->e_flags & ELEMENT_FLAG_CREATED) {
|
||||
if (element_set_key_attr(e, "bytes", "packets") ||
|
||||
element_set_usage_attr(e, "bytes"))
|
||||
BUG();
|
||||
|
||||
e->e_flags &= ~ELEMENT_FLAG_CREATED;
|
||||
}
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(link_attrs); i++) {
|
||||
struct attr_map *m = &link_attrs[i];
|
||||
|
||||
attr_update(e, m->attrid, data[i][0], data[i][1],
|
||||
UPDATE_FLAG_RX | UPDATE_FLAG_TX);
|
||||
}
|
||||
|
||||
element_notify_update(e, NULL);
|
||||
element_lifesign(e, 1);
|
||||
}
|
||||
skip:
|
||||
fclose(fd);
|
||||
}
|
||||
|
||||
static void print_help(void)
|
||||
{
|
||||
printf(
|
||||
"proc - procfs statistic collector for Linux" \
|
||||
"\n" \
|
||||
" Reads statistics from procfs (/proc/net/dev)\n" \
|
||||
" Author: Thomas Graf <tgraf@suug.ch>\n" \
|
||||
"\n" \
|
||||
" Options:\n" \
|
||||
" file=PATH Path to statistics file (default: /proc/net/dev)\n"
|
||||
" group=NAME Name of group\n");
|
||||
}
|
||||
|
||||
static void proc_parse_opt(const char *type, const char *value)
|
||||
{
|
||||
if (!strcasecmp(type, "file") && value)
|
||||
c_path = value;
|
||||
else if (!strcasecmp(type, "group") && value)
|
||||
c_group = value;
|
||||
else if (!strcasecmp(type, "help")) {
|
||||
print_help();
|
||||
exit(0);
|
||||
}
|
||||
}
|
||||
|
||||
static int proc_do_init(void)
|
||||
{
|
||||
if (attr_map_load(link_attrs, ARRAY_SIZE(link_attrs)) ||
|
||||
!(grp = group_lookup(c_group, GROUP_CREATE)))
|
||||
BUG();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int proc_probe(void)
|
||||
{
|
||||
FILE *fd = fopen(c_path, "r");
|
||||
|
||||
if (fd) {
|
||||
fclose(fd);
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct bmon_module proc_ops = {
|
||||
.m_name = "proc",
|
||||
.m_do = proc_read,
|
||||
.m_parse_opt = proc_parse_opt,
|
||||
.m_probe = proc_probe,
|
||||
.m_init = proc_do_init,
|
||||
};
|
||||
|
||||
static void __init proc_init(void)
|
||||
{
|
||||
input_register(&proc_ops);
|
||||
}
|
306
src/in_sysctl.c
@ -1,306 +0,0 @@
|
||||
/*
|
||||
* in_sysctl.c sysctl (BSD)
|
||||
*
|
||||
* $Id: in_sysctl.c 20 2004-10-30 22:46:16Z tgr $
|
||||
*
|
||||
* Copyright (c) 2001-2004 Thomas Graf <tgraf@suug.ch>
|
||||
* Copyright (c) 2014 Žilvinas Valinskas <zilvinas.valinskas@gmail.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included
|
||||
* in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <bmon/bmon.h>
|
||||
#include <bmon/input.h>
|
||||
#include <bmon/conf.h>
|
||||
#include <bmon/group.h>
|
||||
#include <bmon/element.h>
|
||||
#include <bmon/utils.h>
|
||||
|
||||
#if defined SYS_BSD
|
||||
#include <sys/socket.h>
|
||||
#include <net/if.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <net/if_dl.h>
|
||||
#include <net/route.h>
|
||||
|
||||
static int c_debug = 0;
|
||||
static struct element_group *grp;
|
||||
|
||||
enum {
|
||||
SYSCTL_RX_BYTES = 0x100,
|
||||
SYSCTL_TX_BYTES,
|
||||
SYSCTL_RX_PACKETS,
|
||||
SYSCTL_TX_PACKETS,
|
||||
SYSCTL_RX_ERRORS,
|
||||
SYSCTL_TX_ERRORS,
|
||||
SYSCTL_RX_DROPS,
|
||||
SYSCTL_RX_MCAST,
|
||||
SYSCTL_TX_MCAST,
|
||||
SYSCTL_TX_COLLS,
|
||||
};
|
||||
static struct attr_map link_attrs[] = {
|
||||
{
|
||||
.name = "bytes",
|
||||
.type = ATTR_TYPE_COUNTER,
|
||||
.unit = UNIT_BYTE,
|
||||
.rxid = SYSCTL_RX_BYTES,
|
||||
.txid = SYSCTL_TX_BYTES,
|
||||
.description = "Bytes",
|
||||
},
|
||||
{
|
||||
.name = "packets",
|
||||
.type = ATTR_TYPE_COUNTER,
|
||||
.unit = UNIT_NUMBER,
|
||||
.rxid = SYSCTL_RX_PACKETS,
|
||||
.txid = SYSCTL_TX_PACKETS,
|
||||
.description = "Packets",
|
||||
},
|
||||
{
|
||||
.name = "errors",
|
||||
.type = ATTR_TYPE_COUNTER,
|
||||
.unit = UNIT_NUMBER,
|
||||
.rxid = SYSCTL_RX_ERRORS,
|
||||
.txid = SYSCTL_TX_ERRORS,
|
||||
.description = "Errors",
|
||||
},
|
||||
{
|
||||
.name = "drop",
|
||||
.type = ATTR_TYPE_COUNTER,
|
||||
.unit = UNIT_NUMBER,
|
||||
.rxid = SYSCTL_RX_DROPS,
|
||||
.description = "Dropped",
|
||||
},
|
||||
{
|
||||
.name = "coll",
|
||||
.type = ATTR_TYPE_COUNTER,
|
||||
.unit = UNIT_NUMBER,
|
||||
.txid = SYSCTL_TX_COLLS,
|
||||
.description = "Collisions",
|
||||
},
|
||||
{
|
||||
.name = "mcast",
|
||||
.type = ATTR_TYPE_COUNTER,
|
||||
.unit = UNIT_NUMBER,
|
||||
.rxid = SYSCTL_RX_MCAST,
|
||||
.txid = SYSCTL_TX_MCAST,
|
||||
.description = "Multicast",
|
||||
}
|
||||
};
|
||||
|
||||
uint64_t sysctl_get_stats(const struct if_msghdr *ifm, int what)
|
||||
{
|
||||
switch(what) {
|
||||
case SYSCTL_RX_BYTES:
|
||||
return ifm->ifm_data.ifi_ibytes;
|
||||
case SYSCTL_TX_BYTES:
|
||||
return ifm->ifm_data.ifi_obytes;
|
||||
|
||||
case SYSCTL_RX_PACKETS:
|
||||
return ifm->ifm_data.ifi_ipackets;
|
||||
case SYSCTL_TX_PACKETS:
|
||||
return ifm->ifm_data.ifi_opackets;
|
||||
|
||||
case SYSCTL_RX_ERRORS:
|
||||
return ifm->ifm_data.ifi_ierrors;
|
||||
case SYSCTL_TX_ERRORS:
|
||||
return ifm->ifm_data.ifi_oerrors;
|
||||
|
||||
case SYSCTL_RX_DROPS:
|
||||
return ifm->ifm_data.ifi_iqdrops;
|
||||
|
||||
case SYSCTL_RX_MCAST:
|
||||
return ifm->ifm_data.ifi_imcasts;
|
||||
case SYSCTL_TX_MCAST:
|
||||
return ifm->ifm_data.ifi_omcasts;
|
||||
case SYSCTL_TX_COLLS:
|
||||
return ifm->ifm_data.ifi_collisions;
|
||||
|
||||
default:
|
||||
return 0;
|
||||
};
|
||||
}
|
||||
|
||||
static void
|
||||
sysctl_read(void)
|
||||
{
|
||||
int mib[] = {CTL_NET, PF_ROUTE, 0, 0, NET_RT_IFLIST, 0};
|
||||
size_t n;
|
||||
char *buf, *next, *lim;
|
||||
|
||||
if (sysctl(mib, 6, NULL, &n, NULL, 0) < 0)
|
||||
quit("sysctl() failed");
|
||||
|
||||
if (c_debug)
|
||||
fprintf(stderr, "sysctl 1-pass n=%zd\n", n);
|
||||
|
||||
buf = xcalloc(1, n);
|
||||
|
||||
if (sysctl(mib, 6, buf, &n, NULL, 0) < 0)
|
||||
quit("sysctl() failed");
|
||||
|
||||
if (c_debug)
|
||||
fprintf(stderr, "sysctl 2-pass n=%zd\n", n);
|
||||
|
||||
lim = (buf + n);
|
||||
for (next = buf; next < lim; ) {
|
||||
struct element *e, *e_parent = NULL;
|
||||
struct if_msghdr *ifm, *nextifm;
|
||||
struct sockaddr_dl *sdl;
|
||||
char info_buf[64];
|
||||
|
||||
ifm = (struct if_msghdr *) next;
|
||||
if (ifm->ifm_type != RTM_IFINFO)
|
||||
break;
|
||||
|
||||
next += ifm->ifm_msglen;
|
||||
|
||||
while (next < lim) {
|
||||
nextifm = (struct if_msghdr *) next;
|
||||
if (nextifm->ifm_type != RTM_NEWADDR)
|
||||
break;
|
||||
next += nextifm->ifm_msglen;
|
||||
}
|
||||
|
||||
sdl = (struct sockaddr_dl *) (ifm + 1);
|
||||
|
||||
if (!cfg_show_all && !(ifm->ifm_flags & IFF_UP))
|
||||
continue;
|
||||
|
||||
if (sdl->sdl_family != AF_LINK)
|
||||
continue;
|
||||
|
||||
if (c_debug)
|
||||
fprintf(stderr, "Processing %s\n", sdl->sdl_data);
|
||||
|
||||
sdl->sdl_data[sdl->sdl_nlen] = '\0';
|
||||
e = element_lookup(grp,
|
||||
sdl->sdl_data, sdl->sdl_index,
|
||||
e_parent, ELEMENT_CREAT);
|
||||
if (!e)
|
||||
continue;
|
||||
|
||||
if (e->e_flags & ELEMENT_FLAG_CREATED) {
|
||||
if (e->e_parent)
|
||||
e->e_level = e->e_parent->e_level + 1;
|
||||
|
||||
if (element_set_key_attr(e, "bytes", "packets") ||
|
||||
element_set_usage_attr(e, "bytes"))
|
||||
BUG();
|
||||
|
||||
e->e_flags &= ~ELEMENT_FLAG_CREATED;
|
||||
}
|
||||
|
||||
int i;
|
||||
for (i = 0; i < ARRAY_SIZE(link_attrs); i++) {
|
||||
struct attr_map *m = &link_attrs[i];
|
||||
uint64_t rx = 0, tx = 0;
|
||||
int flags = 0;
|
||||
|
||||
if (m->rxid) {
|
||||
rx = sysctl_get_stats(ifm, m->rxid);
|
||||
flags |= UPDATE_FLAG_RX;
|
||||
}
|
||||
|
||||
if (m->txid) {
|
||||
tx = sysctl_get_stats(ifm, m->txid);
|
||||
flags |= UPDATE_FLAG_TX;
|
||||
}
|
||||
|
||||
attr_update(e, m->attrid, rx, tx, flags);
|
||||
}
|
||||
|
||||
snprintf(info_buf, sizeof(info_buf), "%u", ifm->ifm_data.ifi_mtu);
|
||||
element_update_info(e, "MTU", info_buf);
|
||||
|
||||
snprintf(info_buf, sizeof(info_buf), "%u", ifm->ifm_data.ifi_metric);
|
||||
element_update_info(e, "Metric", info_buf);
|
||||
|
||||
snprintf(info_buf, sizeof(info_buf), "%u", ifm->ifm_data.ifi_recvquota);
|
||||
element_update_info(e, "RX-Quota", info_buf);
|
||||
|
||||
snprintf(info_buf, sizeof(info_buf), "%u", ifm->ifm_data.ifi_xmitquota);
|
||||
element_update_info(e, "TX-Quota", info_buf);
|
||||
|
||||
element_notify_update(e, NULL);
|
||||
element_lifesign(e, 1);
|
||||
}
|
||||
|
||||
xfree(buf);
|
||||
}
|
||||
|
||||
static void
|
||||
print_help(void)
|
||||
{
|
||||
printf(
|
||||
"sysctl - sysctl statistic collector for BSD and Darwin\n" \
|
||||
"\n" \
|
||||
" BSD and Darwin statistic collector using sysctl()\n" \
|
||||
" Author: Thomas Graf <tgraf@suug.ch>\n" \
|
||||
"\n");
|
||||
}
|
||||
|
||||
static void
|
||||
sysctl_set_opts(const char* type, const char* value)
|
||||
{
|
||||
if (!strcasecmp(type, "debug"))
|
||||
c_debug = 1;
|
||||
else if (!strcasecmp(type, "help")) {
|
||||
print_help();
|
||||
exit(0);
|
||||
}
|
||||
}
|
||||
|
||||
static int
|
||||
sysctl_probe(void)
|
||||
{
|
||||
size_t n;
|
||||
int mib[] = {CTL_NET, PF_ROUTE, 0, 0, NET_RT_IFLIST, 0};
|
||||
if (sysctl(mib, 6, NULL, &n, NULL, 0) < 0)
|
||||
return 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int sysctl_do_init(void)
|
||||
{
|
||||
if (attr_map_load(link_attrs, ARRAY_SIZE(link_attrs)))
|
||||
BUG();
|
||||
|
||||
grp = group_lookup(DEFAULT_GROUP, GROUP_CREATE);
|
||||
if (!grp)
|
||||
BUG();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct bmon_module kstat_ops = {
|
||||
.m_name = "sysctl",
|
||||
.m_do = sysctl_read,
|
||||
.m_parse_opt = sysctl_set_opts,
|
||||
.m_probe = sysctl_probe,
|
||||
.m_init = sysctl_do_init,
|
||||
};
|
||||
|
||||
static void __init
|
||||
sysctl_init(void)
|
||||
{
|
||||
input_register(&kstat_ops);
|
||||
}
|
||||
|
||||
#endif
|
90
src/input.c
@ -1,90 +0,0 @@
|
||||
/*
|
||||
* input.c Input API
|
||||
*
|
||||
* Copyright (c) 2001-2013 Thomas Graf <tgraf@suug.ch>
|
||||
* Copyright (c) 2013 Red Hat, Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included
|
||||
* in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <bmon/bmon.h>
|
||||
#include <bmon/input.h>
|
||||
#include <bmon/module.h>
|
||||
#include <bmon/utils.h>
|
||||
|
||||
static struct bmon_subsys input_subsys;
|
||||
|
||||
void input_register(struct bmon_module *m)
|
||||
{
|
||||
module_register(&input_subsys, m);
|
||||
}
|
||||
|
||||
static void activate_default(void)
|
||||
{
|
||||
/*
|
||||
* Try to activate a default input module if the user did not make
|
||||
* a selection
|
||||
*/
|
||||
if (!input_subsys.s_nmod) {
|
||||
struct bmon_module *m;
|
||||
|
||||
#ifdef SYS_LINUX
|
||||
if (!input_set("netlink"))
|
||||
return;
|
||||
|
||||
if (!input_set("proc"))
|
||||
return;
|
||||
#endif
|
||||
|
||||
#ifdef SYS_BSD
|
||||
if (!input_set("sysctl"))
|
||||
return;
|
||||
#endif
|
||||
|
||||
/* Fall back to anything that could act as default */
|
||||
list_for_each_entry(m, &input_subsys.s_mod_list, m_list) {
|
||||
if (m->m_flags & BMON_MODULE_DEFAULT)
|
||||
if (!input_set(m->m_name))
|
||||
return;
|
||||
}
|
||||
|
||||
quit("No input module found\n");
|
||||
}
|
||||
}
|
||||
|
||||
void input_read(void)
|
||||
{
|
||||
module_foreach_run_enabled(&input_subsys);
|
||||
}
|
||||
|
||||
int input_set(const char *name)
|
||||
{
|
||||
return module_set(&input_subsys, name);
|
||||
}
|
||||
|
||||
static struct bmon_subsys input_subsys = {
|
||||
.s_name = "input",
|
||||
.s_activate_default = &activate_default,
|
||||
.s_mod_list = LIST_SELF(input_subsys.s_mod_list),
|
||||
};
|
||||
|
||||
static void __init __input_init(void)
|
||||
{
|
||||
module_register_subsys(&input_subsys);
|
||||
}
|
208
src/module.c
@ -1,208 +0,0 @@
|
||||
/*
|
||||
* module.c Module API
|
||||
*
|
||||
* Copyright (c) 2001-2013 Thomas Graf <tgraf@suug.ch>
|
||||
* Copyright (c) 2013 Red Hat, Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included
|
||||
* in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <bmon/bmon.h>
|
||||
#include <bmon/module.h>
|
||||
#include <bmon/utils.h>
|
||||
|
||||
static LIST_HEAD(subsys_list);
|
||||
|
||||
static void module_foreach(struct bmon_subsys *ss, void (*cb)(struct bmon_module *))
|
||||
{
|
||||
struct bmon_module *m;
|
||||
|
||||
list_for_each_entry(m, &ss->s_mod_list, m_list)
|
||||
cb(m);
|
||||
}
|
||||
|
||||
void module_foreach_run_enabled_pre(struct bmon_subsys *ss)
|
||||
{
|
||||
struct bmon_module *m;
|
||||
|
||||
list_for_each_entry(m, &ss->s_mod_list, m_list)
|
||||
if (m->m_flags & BMON_MODULE_ENABLED && m->m_pre)
|
||||
m->m_pre();
|
||||
}
|
||||
|
||||
void module_foreach_run_enabled(struct bmon_subsys *ss)
|
||||
{
|
||||
struct bmon_module *m;
|
||||
|
||||
list_for_each_entry(m, &ss->s_mod_list, m_list)
|
||||
if (m->m_flags & BMON_MODULE_ENABLED && m->m_do)
|
||||
m->m_do();
|
||||
}
|
||||
|
||||
void module_foreach_run_enabled_post(struct bmon_subsys *ss)
|
||||
{
|
||||
struct bmon_module *m;
|
||||
|
||||
list_for_each_entry(m, &ss->s_mod_list, m_list)
|
||||
if (m->m_flags & BMON_MODULE_ENABLED && m->m_post)
|
||||
m->m_post();
|
||||
}
|
||||
|
||||
static struct bmon_module *module_lookup(struct bmon_subsys *ss, const char *name)
|
||||
{
|
||||
struct bmon_module *m;
|
||||
|
||||
list_for_each_entry(m, &ss->s_mod_list, m_list)
|
||||
if (!strcmp(m->m_name, name))
|
||||
return m;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void module_list(struct bmon_subsys *ss, struct list_head *list)
|
||||
{
|
||||
printf("%s modules:\n", ss->s_name);
|
||||
if (list_empty(list))
|
||||
printf("\tNo %s modules found.\n", ss->s_name);
|
||||
else {
|
||||
struct bmon_module *m;
|
||||
|
||||
list_for_each_entry(m, list, m_list)
|
||||
printf("\t%s\n", m->m_name);
|
||||
}
|
||||
}
|
||||
|
||||
static int module_configure(struct bmon_module *m, module_conf_t *cfg)
|
||||
{
|
||||
DBG("Configuring module %s", m->m_name);
|
||||
|
||||
if (m->m_parse_opt && cfg) {
|
||||
tv_t *tv;
|
||||
|
||||
list_for_each_entry(tv, &cfg->m_attrs, tv_list)
|
||||
m->m_parse_opt(tv->tv_type, tv->tv_value);
|
||||
}
|
||||
|
||||
if (m->m_probe && !m->m_probe())
|
||||
return -EINVAL;
|
||||
|
||||
m->m_flags |= BMON_MODULE_ENABLED;
|
||||
m->m_subsys->s_nmod++;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int module_register(struct bmon_subsys *ss, struct bmon_module *m)
|
||||
{
|
||||
if (m->m_subsys)
|
||||
return -EBUSY;
|
||||
|
||||
list_add_tail(&m->m_list, &ss->s_mod_list);
|
||||
m->m_subsys = ss;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void __auto_load(struct bmon_module *m)
|
||||
{
|
||||
if ((m->m_flags & BMON_MODULE_AUTO) &&
|
||||
!(m->m_flags & BMON_MODULE_ENABLED)) {
|
||||
if (module_configure(m, NULL) == 0)
|
||||
DBG("Auto-enabled module %s", m->m_name);
|
||||
}
|
||||
}
|
||||
|
||||
int module_set(struct bmon_subsys *ss, const char *name)
|
||||
{
|
||||
struct bmon_module *mod;
|
||||
LIST_HEAD(tmp_list);
|
||||
module_conf_t *m;
|
||||
|
||||
if (!name || !strcasecmp(name, "list")) {
|
||||
module_list(ss, &ss->s_mod_list);
|
||||
return 1;
|
||||
}
|
||||
|
||||
parse_module_param(name, &tmp_list);
|
||||
|
||||
list_for_each_entry(m, &tmp_list, m_list) {
|
||||
if (!(mod = module_lookup(ss, m->m_name)))
|
||||
quit("Unknown %s module: %s\n", ss->s_name, m->m_name);
|
||||
|
||||
if (module_configure(mod, m) == 0)
|
||||
DBG("Enabled module %s", mod->m_name);
|
||||
}
|
||||
|
||||
module_foreach(ss, __auto_load);
|
||||
|
||||
if (!ss->s_nmod)
|
||||
quit("No working %s module found\n", ss->s_name);
|
||||
|
||||
DBG("Configured modules");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void __module_init(struct bmon_module *m)
|
||||
{
|
||||
if (m->m_init) {
|
||||
DBG("Initializing %s...", m->m_name);
|
||||
if (m->m_init())
|
||||
m->m_flags &= ~BMON_MODULE_ENABLED;
|
||||
}
|
||||
}
|
||||
|
||||
void module_init(void)
|
||||
{
|
||||
struct bmon_subsys *ss;
|
||||
|
||||
DBG("Initializing modules");
|
||||
|
||||
list_for_each_entry(ss, &subsys_list, s_list) {
|
||||
if (ss->s_activate_default)
|
||||
ss->s_activate_default();
|
||||
|
||||
module_foreach(ss, __module_init);
|
||||
}
|
||||
}
|
||||
|
||||
static void __module_shutdown(struct bmon_module *m)
|
||||
{
|
||||
if (m->m_shutdown) {
|
||||
DBG("Shutting down %s...", m->m_name);
|
||||
m->m_shutdown();
|
||||
m->m_flags &= ~BMON_MODULE_ENABLED;
|
||||
}
|
||||
}
|
||||
|
||||
void module_shutdown(void)
|
||||
{
|
||||
DBG("Shutting down modules");
|
||||
|
||||
struct bmon_subsys *ss;
|
||||
|
||||
list_for_each_entry(ss, &subsys_list, s_list)
|
||||
module_foreach(ss, __module_shutdown);
|
||||
}
|
||||
|
||||
void module_register_subsys(struct bmon_subsys *ss)
|
||||
{
|
||||
DBG("Module %s registered", ss->s_name);
|
||||
|
||||
list_add_tail(&ss->s_list, &subsys_list);
|
||||
}
|
299
src/out_ascii.c
@ -1,299 +0,0 @@
|
||||
/*
|
||||
* out_ascii.c ASCII Output
|
||||
*
|
||||
* Copyright (c) 2001-2013 Thomas Graf <tgraf@suug.ch>
|
||||
* Copyright (c) 2013 Red Hat, Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included
|
||||
* in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <bmon/bmon.h>
|
||||
#include <bmon/conf.h>
|
||||
#include <bmon/output.h>
|
||||
#include <bmon/group.h>
|
||||
#include <bmon/element.h>
|
||||
#include <bmon/attr.h>
|
||||
#include <bmon/graph.h>
|
||||
#include <bmon/history.h>
|
||||
#include <bmon/utils.h>
|
||||
|
||||
typedef enum diagram_type_e {
|
||||
D_LIST,
|
||||
D_GRAPH,
|
||||
D_DETAILS
|
||||
} diagram_type_t;
|
||||
|
||||
static struct graph_cfg graph_cfg = {
|
||||
.gc_foreground = '*',
|
||||
.gc_background = ' ',
|
||||
.gc_noise = '.',
|
||||
.gc_unknown = '?',
|
||||
.gc_height = 6,
|
||||
};
|
||||
|
||||
static diagram_type_t c_diagram_type = D_LIST;
|
||||
static char *c_hist = "second";
|
||||
static int c_quit_after = -1;
|
||||
|
||||
static void print_list(struct element *e)
|
||||
{
|
||||
char *rxu1 = "", *txu1 = "", *rxu2 = "", *txu2 = "";
|
||||
double rx1 = 0.0f, tx1 = 0.0f, rx2 = 0.0f, tx2 = 0.0f;
|
||||
int rx1prec = 0, tx1prec = 0, rx2prec = 0, tx2prec = 0;
|
||||
char pad[IFNAMSIZ + 32];
|
||||
struct attr *a;
|
||||
|
||||
if (e->e_key_attr[GT_MAJOR] &&
|
||||
(a = attr_lookup(e, e->e_key_attr[GT_MAJOR]->ad_id)))
|
||||
attr_rate2float(a, &rx1, &rxu1, &rx1prec,
|
||||
&tx1, &txu1, &tx1prec);
|
||||
|
||||
if (e->e_key_attr[GT_MINOR] &&
|
||||
(a = attr_lookup(e, e->e_key_attr[GT_MINOR]->ad_id)))
|
||||
attr_rate2float(a, &rx2, &rxu2, &rx2prec,
|
||||
&tx2, &txu2, &tx2prec);
|
||||
|
||||
memset(pad, 0, sizeof(pad));
|
||||
memset(pad, ' ', e->e_level < 15 ? e->e_level : 15);
|
||||
|
||||
strncat(pad, e->e_name, sizeof(pad) - strlen(pad) - 1);
|
||||
|
||||
if (e->e_description) {
|
||||
strncat(pad, " (", sizeof(pad) - strlen(pad) - 1);
|
||||
strncat(pad, e->e_description, sizeof(pad) - strlen(pad) - 1);
|
||||
strncat(pad, ")", sizeof(pad) - strlen(pad) - 1);
|
||||
}
|
||||
|
||||
printf(" %-36s %8.*f%-3s %8.*f%-3s ",
|
||||
pad, rx1prec, rx1, rxu1, rx2prec, rx2, rxu2);
|
||||
|
||||
if (e->e_rx_usage == FLT_MAX)
|
||||
printf(" ");
|
||||
else
|
||||
printf("%2.0f%%", e->e_rx_usage);
|
||||
|
||||
printf(" %8.*f%-3s %8.*f%-3s ", tx1prec, tx1, txu1, tx2prec, tx2, txu2);
|
||||
|
||||
if (e->e_tx_usage == FLT_MAX)
|
||||
printf(" \n");
|
||||
else
|
||||
printf("%2.0f%%\n", e->e_tx_usage);
|
||||
}
|
||||
|
||||
static void print_attr_detail(struct element *e, struct attr *a, void *arg)
|
||||
{
|
||||
char *rx_u, *tx_u;
|
||||
int rxprec, txprec;
|
||||
|
||||
double rx = unit_value2str(a->a_rx_rate.r_total,
|
||||
a->a_def->ad_unit,
|
||||
&rx_u, &rxprec);
|
||||
double tx = unit_value2str(a->a_tx_rate.r_total,
|
||||
a->a_def->ad_unit,
|
||||
&tx_u, &txprec);
|
||||
|
||||
printf(" %-36s %12.*f%-3s %12.*f%-3s\n",
|
||||
a->a_def->ad_description, rxprec, rx, rx_u, txprec, tx, tx_u);
|
||||
}
|
||||
|
||||
static void print_details(struct element *e)
|
||||
{
|
||||
printf(" %s", e->e_name);
|
||||
|
||||
if (e->e_id)
|
||||
printf(" (%u)", e->e_id);
|
||||
|
||||
printf("\n");
|
||||
|
||||
element_foreach_attr(e, print_attr_detail, NULL);
|
||||
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
static void print_table(struct graph *g, struct graph_table *tbl, const char *hdr)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (!tbl->gt_table)
|
||||
return;
|
||||
|
||||
printf("%s %s\n", hdr, tbl->gt_y_unit);
|
||||
|
||||
for (i = (g->g_cfg.gc_height - 1); i >= 0; i--)
|
||||
printf("%8.2f %s\n", tbl->gt_scale[i],
|
||||
tbl->gt_table + (i * graph_row_size(&g->g_cfg)));
|
||||
|
||||
printf(" 1 5 10 15 20 25 30 35 40 " \
|
||||
"45 50 55 60\n");
|
||||
}
|
||||
|
||||
static void __print_graph(struct element *e, struct attr *a, void *arg)
|
||||
{
|
||||
struct history *h;
|
||||
struct graph *g;
|
||||
|
||||
if (!(a->a_flags & ATTR_DOING_HISTORY))
|
||||
return;
|
||||
|
||||
graph_cfg.gc_unit = a->a_def->ad_unit;
|
||||
|
||||
list_for_each_entry(h, &a->a_history_list, h_list) {
|
||||
if (strcasecmp(c_hist, h->h_definition->hd_name))
|
||||
continue;
|
||||
|
||||
g = graph_alloc(h, &graph_cfg);
|
||||
graph_refill(g, h);
|
||||
|
||||
printf("Interface: %s\n", e->e_name);
|
||||
printf("Attribute: %s\n", a->a_def->ad_description);
|
||||
|
||||
print_table(g, &g->g_rx, "RX");
|
||||
print_table(g, &g->g_tx, "TX");
|
||||
|
||||
graph_free(g);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
static void print_graph(struct element *e)
|
||||
{
|
||||
element_foreach_attr(e, __print_graph, NULL);
|
||||
}
|
||||
|
||||
static void ascii_draw_element(struct element_group *g, struct element *e,
|
||||
void *arg)
|
||||
{
|
||||
switch (c_diagram_type) {
|
||||
case D_LIST:
|
||||
print_list(e);
|
||||
break;
|
||||
|
||||
case D_DETAILS:
|
||||
print_details(e);
|
||||
break;
|
||||
|
||||
case D_GRAPH:
|
||||
print_graph(e);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void ascii_draw_group(struct element_group *g, void *arg)
|
||||
{
|
||||
if (c_diagram_type == D_LIST)
|
||||
printf("%-37s%10s %11s %%%10s %11s %%\n",
|
||||
g->g_hdr->gh_title,
|
||||
g->g_hdr->gh_column[0],
|
||||
g->g_hdr->gh_column[1],
|
||||
g->g_hdr->gh_column[2],
|
||||
g->g_hdr->gh_column[3]);
|
||||
else
|
||||
printf("%s\n", g->g_hdr->gh_title);
|
||||
|
||||
group_foreach_element(g, ascii_draw_element, NULL);
|
||||
}
|
||||
|
||||
static void ascii_draw(void)
|
||||
{
|
||||
group_foreach(ascii_draw_group, NULL);
|
||||
|
||||
if (c_quit_after > 0)
|
||||
if (--c_quit_after == 0)
|
||||
exit(0);
|
||||
}
|
||||
|
||||
static void print_help(void)
|
||||
{
|
||||
printf(
|
||||
"ascii - ASCII Output\n" \
|
||||
"\n" \
|
||||
" Plain configurable ASCII output.\n" \
|
||||
"\n" \
|
||||
" scriptable: (output graph for eth1 10 times)\n" \
|
||||
" bmon -p eth1 -o 'ascii:diagram=graph;quitafter=10'\n" \
|
||||
" show details for all ethernet interfaces:\n" \
|
||||
" bmon -p 'eth*' -o 'ascii:diagram=details;quitafter=1'\n" \
|
||||
"\n" \
|
||||
" Author: Thomas Graf <tgraf@suug.ch>\n" \
|
||||
"\n" \
|
||||
" Options:\n" \
|
||||
" diagram=TYPE Diagram type\n" \
|
||||
" fgchar=CHAR Foreground character (default: '*')\n" \
|
||||
" bgchar=CHAR Background character (default: '.')\n" \
|
||||
" nchar=CHAR Noise character (default: ':')\n" \
|
||||
" uchar=CHAR Unknown character (default: '?')\n" \
|
||||
" height=NUM Height of graph (default: 6)\n" \
|
||||
" xunit=UNIT X-Axis Unit (default: seconds)\n" \
|
||||
" yunit=UNIT Y-Axis Unit (default: dynamic)\n" \
|
||||
" quitafter=NUM Quit bmon after NUM outputs\n");
|
||||
}
|
||||
|
||||
static void ascii_parse_opt(const char *type, const char *value)
|
||||
{
|
||||
if (!strcasecmp(type, "diagram") && value) {
|
||||
if (tolower(*value) == 'l')
|
||||
c_diagram_type = D_LIST;
|
||||
else if (tolower(*value) == 'g')
|
||||
c_diagram_type = D_GRAPH;
|
||||
else if (tolower(*value) == 'd')
|
||||
c_diagram_type = D_DETAILS;
|
||||
else
|
||||
quit("Unknown diagram type '%s'\n", value);
|
||||
} else if (!strcasecmp(type, "fgchar") && value)
|
||||
graph_cfg.gc_foreground = value[0];
|
||||
else if (!strcasecmp(type, "bgchar") && value)
|
||||
graph_cfg.gc_background = value[0];
|
||||
else if (!strcasecmp(type, "nchar") && value)
|
||||
graph_cfg.gc_noise = value[0];
|
||||
#if 0
|
||||
else if (!strcasecmp(type, "uchar") && value)
|
||||
set_unk_char(value[0]);
|
||||
#endif
|
||||
else if (!strcasecmp(type, "xunit") && value)
|
||||
c_hist = strdup(value);
|
||||
#if 0
|
||||
else if (!strcasecmp(type, "yunit") && value) {
|
||||
struct unit *u;
|
||||
|
||||
if (!(u = unit_lookup(value)))
|
||||
quit("Unknown unit '%s'\n", value);
|
||||
|
||||
graph_cfg.gc_unit = u;
|
||||
#endif
|
||||
else if (!strcasecmp(type, "height") && value)
|
||||
graph_cfg.gc_height = strtol(value, NULL, 0);
|
||||
else if (!strcasecmp(type, "quitafter") && value)
|
||||
c_quit_after = strtol(value, NULL, 0);
|
||||
else if (!strcasecmp(type, "help")) {
|
||||
print_help();
|
||||
exit(0);
|
||||
} else
|
||||
quit("Unknown module option '%s'\n", type);
|
||||
}
|
||||
|
||||
static struct bmon_module ascii_ops = {
|
||||
.m_name = "ascii",
|
||||
.m_do = ascii_draw,
|
||||
.m_parse_opt = ascii_parse_opt,
|
||||
};
|
||||
|
||||
static void __init ascii_init(void)
|
||||
{
|
||||
output_register(&ascii_ops);
|
||||
}
|
1289
src/out_curses.c
370
src/out_format.c
@ -1,370 +0,0 @@
|
||||
/*
|
||||
* out_format.c Formatted Output
|
||||
*
|
||||
* Copyright (c) 2001-2013 Thomas Graf <tgraf@suug.ch>
|
||||
* Copyright (c) 2013 Red Hat, Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included
|
||||
* in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <bmon/bmon.h>
|
||||
#include <bmon/graph.h>
|
||||
#include <bmon/conf.h>
|
||||
#include <bmon/output.h>
|
||||
#include <bmon/group.h>
|
||||
#include <bmon/element.h>
|
||||
#include <bmon/input.h>
|
||||
#include <bmon/utils.h>
|
||||
#include <bmon/attr.h>
|
||||
|
||||
static int c_quit_after = -1;
|
||||
static char *c_format;
|
||||
static int c_debug = 0;
|
||||
static FILE *c_fd;
|
||||
|
||||
enum {
|
||||
OT_STRING,
|
||||
OT_TOKEN
|
||||
};
|
||||
|
||||
static struct out_token {
|
||||
int ot_type;
|
||||
char *ot_str;
|
||||
} *out_tokens;
|
||||
|
||||
static int token_index;
|
||||
static int out_tokens_size;
|
||||
|
||||
static char *get_token(struct element_group *g, struct element *e,
|
||||
const char *token, char *buf, size_t len)
|
||||
{
|
||||
if (!strncasecmp(token, "group:", 6)) {
|
||||
const char *n = token + 6;
|
||||
|
||||
if (!strcasecmp(n, "nelements")) {
|
||||
snprintf(buf, len, "%u", g->g_nelements);
|
||||
return buf;
|
||||
} else if (!strcasecmp(n, "name"))
|
||||
return g->g_name;
|
||||
else if (!strcasecmp(n, "title"))
|
||||
return g->g_hdr->gh_title;
|
||||
|
||||
} else if (!strncasecmp(token, "element:", 8)) {
|
||||
const char *n = token + 8;
|
||||
|
||||
if (!strcasecmp(n, "name"))
|
||||
return e->e_name;
|
||||
else if (!strcasecmp(n, "description"))
|
||||
return e->e_description;
|
||||
else if (!strcasecmp(n, "nattrs")) {
|
||||
snprintf(buf, len, "%u", e->e_nattrs);
|
||||
return buf;
|
||||
} else if (!strcasecmp(n, "lifecycles")) {
|
||||
snprintf(buf, len, "%u", e->e_lifecycles);
|
||||
return buf;
|
||||
} else if (!strcasecmp(n, "level")) {
|
||||
snprintf(buf, len, "%u", e->e_level);
|
||||
return buf;
|
||||
} else if (!strcasecmp(n, "parent"))
|
||||
return e->e_parent ? e->e_parent->e_name : "";
|
||||
else if (!strcasecmp(n, "id")) {
|
||||
snprintf(buf, len, "%u", e->e_id);
|
||||
return buf;
|
||||
} else if (!strcasecmp(n, "rxusage")) {
|
||||
snprintf(buf, len, "%2.0f",
|
||||
e->e_rx_usage == FLT_MAX ? e->e_rx_usage : 0.0f);
|
||||
return buf;
|
||||
} else if (!strcasecmp(n, "txusage")) {
|
||||
snprintf(buf, len, "%2.0f",
|
||||
e->e_tx_usage == FLT_MAX ? e->e_tx_usage : 0.0f);
|
||||
return buf;
|
||||
} else if (!strcasecmp(n, "haschilds")) {
|
||||
snprintf(buf, len, "%u",
|
||||
list_empty(&e->e_childs) ? 0 : 1);
|
||||
return buf;
|
||||
}
|
||||
} else if (!strncasecmp(token, "attr:", 5)) {
|
||||
const char *type = token + 5;
|
||||
char *name = strchr(type, ':');
|
||||
struct attr_def *def;
|
||||
struct attr *a;
|
||||
|
||||
if (!name) {
|
||||
fprintf(stderr, "Invalid attribute field \"%s\"\n",
|
||||
type);
|
||||
goto out;
|
||||
}
|
||||
|
||||
name++;
|
||||
|
||||
def = attr_def_lookup(name);
|
||||
if (!def) {
|
||||
fprintf(stderr, "Undefined attribute \"%s\"\n", name);
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (!(a = attr_lookup(e, def->ad_id)))
|
||||
goto out;
|
||||
|
||||
if (!strncasecmp(type, "rx:", 3)) {
|
||||
snprintf(buf, len, "%" PRIu64, a->a_rx_rate.r_total);
|
||||
return buf;
|
||||
} else if (!strncasecmp(type, "tx:", 3)) {
|
||||
snprintf(buf, len, "%" PRIu64, a->a_tx_rate.r_total);
|
||||
return buf;
|
||||
} else if (!strncasecmp(type, "rxrate:", 7)) {
|
||||
snprintf(buf, len, "%.2f", a->a_rx_rate.r_rate);
|
||||
return buf;
|
||||
} else if (!strncasecmp(token+5, "txrate:", 7))
|
||||
snprintf(buf, len, "%.2f", a->a_tx_rate.r_rate);
|
||||
return buf;
|
||||
}
|
||||
|
||||
fprintf(stderr, "Unknown field \"%s\"\n", token);
|
||||
out:
|
||||
return "unknown";
|
||||
}
|
||||
|
||||
static void draw_element(struct element_group *g, struct element *e, void *arg)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < token_index; i++) {
|
||||
char buf[128];
|
||||
char *p;
|
||||
|
||||
if (out_tokens[i].ot_type == OT_STRING)
|
||||
p = out_tokens[i].ot_str;
|
||||
else if (out_tokens[i].ot_type == OT_TOKEN)
|
||||
p = get_token(g, e, out_tokens[i].ot_str,
|
||||
buf, sizeof(buf));
|
||||
else
|
||||
BUG();
|
||||
|
||||
if (p)
|
||||
fprintf(c_fd, "%s", p);
|
||||
}
|
||||
}
|
||||
|
||||
static void format_draw(void)
|
||||
{
|
||||
group_foreach_recursive(draw_element, NULL);
|
||||
|
||||
if (c_quit_after > 0)
|
||||
if (--c_quit_after == 0)
|
||||
exit(0);
|
||||
}
|
||||
|
||||
static inline void add_token(int type, char *data)
|
||||
{
|
||||
if (!out_tokens_size) {
|
||||
out_tokens_size = 32;
|
||||
out_tokens = calloc(out_tokens_size, sizeof(struct out_token));
|
||||
if (out_tokens == NULL)
|
||||
quit("Cannot allocate out token array\n");
|
||||
}
|
||||
|
||||
if (out_tokens_size <= token_index) {
|
||||
out_tokens_size += 32;
|
||||
out_tokens = realloc(out_tokens, out_tokens_size * sizeof(struct out_token));
|
||||
if (out_tokens == NULL)
|
||||
quit("Cannot reallocate out token array\n");
|
||||
}
|
||||
|
||||
|
||||
out_tokens[token_index].ot_type = type;
|
||||
out_tokens[token_index].ot_str = data;
|
||||
token_index++;
|
||||
}
|
||||
|
||||
static int format_probe(void)
|
||||
{
|
||||
int new_one = 1;
|
||||
char *p, *e;
|
||||
|
||||
for (p = c_format; *p; p++) {
|
||||
if (*p == '$') {
|
||||
char *s = p;
|
||||
s++;
|
||||
if (*s == '(') {
|
||||
s++;
|
||||
if (!*s)
|
||||
goto unexpected_end;
|
||||
e = strchr(s, ')');
|
||||
if (e == NULL)
|
||||
goto invalid;
|
||||
|
||||
*p = '\0';
|
||||
*e = '\0';
|
||||
add_token(OT_TOKEN, s);
|
||||
new_one = 1;
|
||||
p = e;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if (*p == '\\') {
|
||||
char *s = p;
|
||||
s++;
|
||||
switch (*s) {
|
||||
case 'n':
|
||||
*s = '\n';
|
||||
goto finish_escape;
|
||||
case 't':
|
||||
*s = '\t';
|
||||
goto finish_escape;
|
||||
case 'r':
|
||||
*s = '\r';
|
||||
goto finish_escape;
|
||||
case 'v':
|
||||
*s = '\v';
|
||||
goto finish_escape;
|
||||
case 'b':
|
||||
*s = '\b';
|
||||
goto finish_escape;
|
||||
case 'f':
|
||||
*s = '\f';
|
||||
goto finish_escape;
|
||||
case 'a':
|
||||
*s = '\a';
|
||||
goto finish_escape;
|
||||
}
|
||||
|
||||
goto out;
|
||||
|
||||
finish_escape:
|
||||
*p = '\0';
|
||||
add_token(OT_STRING, s);
|
||||
p = s;
|
||||
new_one = 0;
|
||||
continue;
|
||||
}
|
||||
|
||||
out:
|
||||
if (new_one) {
|
||||
add_token(OT_STRING, p);
|
||||
new_one = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (c_debug) {
|
||||
int i;
|
||||
for (i = 0; i < token_index; i++)
|
||||
printf(">>%s<\n", out_tokens[i].ot_str);
|
||||
}
|
||||
|
||||
return 1;
|
||||
|
||||
unexpected_end:
|
||||
fprintf(stderr, "Unexpected end of format string\n");
|
||||
return 0;
|
||||
|
||||
invalid:
|
||||
fprintf(stderr, "Missing ')' in format string\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void print_help(void)
|
||||
{
|
||||
printf(
|
||||
"format - Formatable Output\n" \
|
||||
"\n" \
|
||||
" Formatable ASCII output for scripts. Calls a drawing function for\n" \
|
||||
" every item per node and outputs according to the specified format\n" \
|
||||
" string. The format string consists of normal text and placeholders\n" \
|
||||
" in the form of $(placeholder).\n" \
|
||||
"\n" \
|
||||
" Author: Thomas Graf <tgraf@suug.ch>\n" \
|
||||
"\n" \
|
||||
" Options:\n" \
|
||||
" fmt=FORMAT Format string\n" \
|
||||
" stderr Write to stderr instead of stdout\n" \
|
||||
" quitafter=NUM Quit bmon after NUM outputs\n" \
|
||||
"\n" \
|
||||
" Placeholders:\n" \
|
||||
" group:nelements Number of elements this group\n" \
|
||||
" :name Name of group\n" \
|
||||
" :title Title of group\n" \
|
||||
" element:name Name of element\n" \
|
||||
" :desc Description of element\n" \
|
||||
" :nattrs Number of attributes\n" \
|
||||
" :lifecycles Number of lifecycles\n" \
|
||||
" :level Indentation level\n" \
|
||||
" :parent Name of parent element\n" \
|
||||
" :rxusage RX usage in percent\n" \
|
||||
" :txusage TX usage in percent)\n" \
|
||||
" :id ID of element\n" \
|
||||
" :haschilds Indicate if element has children (0|1)\n" \
|
||||
" attr:rx:<name> RX counter of attribute <name>\n" \
|
||||
" :tx:<name> TX counter of attribute <name>\n" \
|
||||
" :rxrate:<name> RX rate of attribute <name>\n" \
|
||||
" :txrate:<name> TX rate of attribute <name>\n" \
|
||||
"\n" \
|
||||
" Supported Escape Sequences: \\n, \\t, \\r, \\v, \\b, \\f, \\a\n" \
|
||||
"\n" \
|
||||
" Examples:\n" \
|
||||
" \"$(element:name)\\t$(attr:rx:bytes)\\t$(attr:tx:bytes)\\n\"\n" \
|
||||
" lo 12074 12074\n" \
|
||||
"\n" \
|
||||
" \"$(element:name) $(attr:rxrate:packets) $(attr:txrate:packets)\\n\"\n" \
|
||||
" eth0 33 5\n" \
|
||||
"\n" \
|
||||
" \"Item: $(element:name)\\n\" \\\n" \
|
||||
" \"Bytes Rate: $(attr:rxrate:bytes)/$(attr:txrate:bytes)\\n\" \\\n" \
|
||||
" \"Packets Rate: $(attr:rxrate:packets)/$(attr:txrate:packets)\\n\"\n" \
|
||||
" Item: eth0\n" \
|
||||
" Bytes Rate: 49130/2119\n" \
|
||||
" Packets Rate: 40/11\n" \
|
||||
"\n");
|
||||
}
|
||||
|
||||
static void format_parse_opt(const char *type, const char *value)
|
||||
{
|
||||
if (!strcasecmp(type, "stderr"))
|
||||
c_fd = stderr;
|
||||
else if (!strcasecmp(type, "debug"))
|
||||
c_debug = 1;
|
||||
else if (!strcasecmp(type, "fmt")) {
|
||||
if (c_format)
|
||||
free(c_format);
|
||||
c_format = strdup(value);
|
||||
} else if (!strcasecmp(type, "quitafter") &&
|
||||
value)
|
||||
c_quit_after = strtol(value, NULL, 0);
|
||||
else if (!strcasecmp(type, "help")) {
|
||||
print_help();
|
||||
exit(0);
|
||||
}
|
||||
}
|
||||
|
||||
static struct bmon_module format_ops = {
|
||||
.m_name = "format",
|
||||
.m_do = format_draw,
|
||||
.m_probe = format_probe,
|
||||
.m_parse_opt = format_parse_opt,
|
||||
};
|
||||
|
||||
static void __init ascii_init(void)
|
||||
{
|
||||
c_fd = stdout;
|
||||
c_format = strdup("$(element:name) $(attr:rx:bytes) $(attr:tx:bytes) " \
|
||||
"$(attr:rx:packets) $(attr:tx:packets)\\n");
|
||||
|
||||
output_register(&format_ops);
|
||||
}
|
@ -1,56 +0,0 @@
|
||||
/*
|
||||
* out_null.c Null Output
|
||||
*
|
||||
* Copyright (c) 2001-2013 Thomas Graf <tgraf@suug.ch>
|
||||
* Copyright (c) 2013 Red Hat, Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included
|
||||
* in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <bmon/bmon.h>
|
||||
#include <bmon/output.h>
|
||||
#include <bmon/utils.h>
|
||||
|
||||
static void print_help(void)
|
||||
{
|
||||
printf(
|
||||
"null - No output\n" \
|
||||
"\n" \
|
||||
" Disable primary output method\n" \
|
||||
" Author: Thomas Graf <tgraf@suug.ch>\n" \
|
||||
"\n");
|
||||
}
|
||||
|
||||
static void null_parse_opt(const char *type, const char *value)
|
||||
{
|
||||
if (!strcasecmp(type, "help")) {
|
||||
print_help();
|
||||
exit(0);
|
||||
}
|
||||
}
|
||||
|
||||
static struct bmon_module null_ops = {
|
||||
.m_name = "null",
|
||||
.m_parse_opt = null_parse_opt,
|
||||
};
|
||||
|
||||
static void __init null_init(void)
|
||||
{
|
||||
output_register(&null_ops);
|
||||
}
|
95
src/output.c
@ -1,95 +0,0 @@
|
||||
/*
|
||||
* output.c Output API
|
||||
*
|
||||
* Copyright (c) 2001-2013 Thomas Graf <tgraf@suug.ch>
|
||||
* Copyright (c) 2013 Red Hat, Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included
|
||||
* in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <bmon/bmon.h>
|
||||
#include <bmon/output.h>
|
||||
#include <bmon/module.h>
|
||||
#include <bmon/conf.h>
|
||||
#include <bmon/group.h>
|
||||
#include <bmon/utils.h>
|
||||
|
||||
static struct bmon_subsys output_subsys;
|
||||
|
||||
void output_register(struct bmon_module *m)
|
||||
{
|
||||
module_register(&output_subsys, m);
|
||||
}
|
||||
|
||||
static void activate_default(void)
|
||||
{
|
||||
/*
|
||||
* Try to activate a default output module if the user did not make
|
||||
* a selection
|
||||
*/
|
||||
if (!output_subsys.s_nmod) {
|
||||
struct bmon_module *m;
|
||||
|
||||
if (!output_set("curses"))
|
||||
return;
|
||||
|
||||
if (!output_set("ascii"))
|
||||
return;
|
||||
|
||||
/* Fall back to anything that could act as default */
|
||||
list_for_each_entry(m, &output_subsys.s_mod_list, m_list) {
|
||||
if (m->m_flags & BMON_MODULE_DEFAULT)
|
||||
if (!output_set(m->m_name))
|
||||
return;
|
||||
}
|
||||
|
||||
quit("No output module found\n");
|
||||
}
|
||||
}
|
||||
|
||||
void output_pre(void)
|
||||
{
|
||||
module_foreach_run_enabled_pre(&output_subsys);
|
||||
}
|
||||
|
||||
void output_draw(void)
|
||||
{
|
||||
module_foreach_run_enabled(&output_subsys);
|
||||
}
|
||||
|
||||
void output_post(void)
|
||||
{
|
||||
module_foreach_run_enabled_post(&output_subsys);
|
||||
}
|
||||
|
||||
int output_set(const char *name)
|
||||
{
|
||||
return module_set(&output_subsys, name);
|
||||
}
|
||||
|
||||
static struct bmon_subsys output_subsys = {
|
||||
.s_name = "output",
|
||||
.s_activate_default = &activate_default,
|
||||
.s_mod_list = LIST_SELF(output_subsys.s_mod_list),
|
||||
};
|
||||
|
||||
static void __init __output_init(void)
|
||||
{
|
||||
return module_register_subsys(&output_subsys);
|
||||
}
|
220
src/unit.c
@ -1,220 +0,0 @@
|
||||
/*
|
||||
* unit.c Unit Definitions
|
||||
*
|
||||
* Copyright (c) 2001-2013 Thomas Graf <tgraf@suug.ch>
|
||||
* Copyright (c) 2013 Red Hat, Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included
|
||||
* in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <bmon/bmon.h>
|
||||
#include <bmon/conf.h>
|
||||
#include <bmon/utils.h>
|
||||
#include <bmon/unit.h>
|
||||
|
||||
static struct unit *byte_unit, *bit_unit;
|
||||
|
||||
static LIST_HEAD(units);
|
||||
|
||||
static struct list_head *get_flist(struct unit *unit)
|
||||
{
|
||||
int div = UNIT_DEFAULT;
|
||||
|
||||
if (cfg_getbool(cfg, "use_bit"))
|
||||
div = UNIT_BIT;
|
||||
else if (cfg_getbool(cfg, "use_si"))
|
||||
div = UNIT_SI;
|
||||
|
||||
if (!list_empty(&unit->u_div[div]))
|
||||
return &unit->u_div[div];
|
||||
else
|
||||
return &unit->u_div[UNIT_DEFAULT];
|
||||
}
|
||||
|
||||
struct unit *unit_lookup(const char *name)
|
||||
{
|
||||
struct unit *unit;
|
||||
|
||||
list_for_each_entry(unit, &units, u_list)
|
||||
if (!strcmp(name, unit->u_name))
|
||||
return unit;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* Lookup best divisor to use for a certain situation
|
||||
* @hint Value in question (for DYNAMIC_EXP)
|
||||
* @unit Unit of value
|
||||
* @name Place to store name of divisor used
|
||||
* @prec Place to store suggested precision
|
||||
*
|
||||
* Searches for the best divisor to be used depending on the unit
|
||||
* exponent configured by the user. If a dynamic exponent is
|
||||
* configured, the divisor is selected based on the value of hint
|
||||
* so that hint is dividied into a small float >= 1.0. The name
|
||||
* of the divisor used is stored in *name.
|
||||
*
|
||||
* If prec points to a vaild integer, a number of precision digits
|
||||
* is suggested to avoid n.00 to make pretty printing easier.
|
||||
*/
|
||||
double unit_divisor(uint64_t hint, struct unit *unit, char **name,
|
||||
int *prec)
|
||||
{
|
||||
struct list_head *flist = get_flist(unit);
|
||||
struct fraction *f;
|
||||
|
||||
if (prec)
|
||||
*prec = 2;
|
||||
|
||||
if (cfg_unit_exp == DYNAMIC_EXP) {
|
||||
list_for_each_entry_reverse(f, flist, f_list) {
|
||||
if (hint >= f->f_divisor)
|
||||
goto found_it;
|
||||
}
|
||||
} else {
|
||||
int n = cfg_unit_exp;
|
||||
list_for_each_entry(f, flist, f_list) {
|
||||
if (--n == 0)
|
||||
goto found_it;
|
||||
}
|
||||
}
|
||||
|
||||
*name = "";
|
||||
return 1;
|
||||
|
||||
found_it:
|
||||
if (f->f_divisor == 1.0f && prec)
|
||||
*prec = 0;
|
||||
|
||||
*name = f->f_name;
|
||||
return f->f_divisor;
|
||||
}
|
||||
|
||||
double unit_value2str(uint64_t value, struct unit *unit,
|
||||
char **name, int *prec)
|
||||
{
|
||||
double div = unit_divisor(value, unit, name, prec);
|
||||
double v = (double) value;
|
||||
|
||||
if (fmod(v, div) == 0.0f && prec)
|
||||
*prec = 0;
|
||||
|
||||
return v / div;
|
||||
}
|
||||
|
||||
void fraction_free(struct fraction *f)
|
||||
{
|
||||
if (!f)
|
||||
return;
|
||||
|
||||
list_del(&f->f_list);
|
||||
xfree(f->f_name);
|
||||
xfree(f);
|
||||
}
|
||||
|
||||
void unit_add_div(struct unit *unit, int type, const char *txt, float div)
|
||||
{
|
||||
struct fraction *f;
|
||||
|
||||
if (!unit)
|
||||
BUG();
|
||||
|
||||
f = xcalloc(1, sizeof(*f));
|
||||
|
||||
init_list_head(&f->f_list);
|
||||
|
||||
f->f_divisor = div;
|
||||
f->f_name = strdup(txt);
|
||||
|
||||
list_add_tail(&f->f_list, &unit->u_div[type]);
|
||||
}
|
||||
|
||||
struct unit *unit_add(const char *name)
|
||||
{
|
||||
struct unit *unit;
|
||||
int i;
|
||||
|
||||
if (!(unit = unit_lookup(name))) {
|
||||
unit = xcalloc(1, sizeof(*unit));
|
||||
unit->u_name = strdup(name);
|
||||
|
||||
for (i = 0; i < __UNIT_MAX; i++)
|
||||
init_list_head(&unit->u_div[i]);
|
||||
|
||||
list_add_tail(&unit->u_list, &units);
|
||||
}
|
||||
|
||||
return unit;
|
||||
}
|
||||
|
||||
static void unit_free(struct unit *u)
|
||||
{
|
||||
struct fraction *f, *n;
|
||||
|
||||
if (!u)
|
||||
return;
|
||||
|
||||
list_for_each_entry_safe(f, n, &u->u_div[UNIT_DEFAULT], f_list)
|
||||
fraction_free(f);
|
||||
|
||||
list_for_each_entry_safe(f, n, &u->u_div[UNIT_SI], f_list)
|
||||
fraction_free(f);
|
||||
|
||||
xfree(u->u_name);
|
||||
xfree(u);
|
||||
}
|
||||
|
||||
char *unit_bytes2str(uint64_t bytes, char *buf, size_t len)
|
||||
{
|
||||
char *ustr;
|
||||
int prec;
|
||||
double v;
|
||||
|
||||
if (byte_unit) {
|
||||
v = unit_value2str(bytes, byte_unit, &ustr, &prec);
|
||||
snprintf(buf, len, "%'.*f%3s", prec, v, ustr);
|
||||
} else
|
||||
snprintf(buf, len, "%" PRIu64, bytes);
|
||||
|
||||
return buf;
|
||||
}
|
||||
|
||||
char *unit_bit2str(uint64_t bits, char *buf, size_t len)
|
||||
{
|
||||
char *ustr;
|
||||
int prec;
|
||||
double v;
|
||||
|
||||
if (bit_unit) {
|
||||
v = unit_value2str(bits, bit_unit, &ustr, &prec);
|
||||
snprintf(buf, len, "%'.*f%3s", prec, v, ustr);
|
||||
} else
|
||||
snprintf(buf, len, "%" PRIu64, bits);
|
||||
|
||||
return buf;
|
||||
}
|
||||
|
||||
static void __exit unit_exit(void)
|
||||
{
|
||||
struct unit *u, *n;
|
||||
|
||||
list_for_each_entry_safe(u, n, &units, u_list)
|
||||
unit_free(u);
|
||||
}
|