Commit 515c1d2f authored by Hermann Mayer's avatar Hermann Mayer

Initial commit.

parents
# http://editorconfig.org
root = true
[*]
indent_style = space
indent_size = 2
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
[*.md]
trim_trailing_whitespace = true
[*.json]
indent_style = space
indent_size = 2
[*.yml]
indent_style = space
indent_size = 2
[Makefile]
trim_trailing_whitespace = true
indent_style = tab
indent_size = 4
[*.sh]
indent_style = space
indent_size = 2
share/
tmp/
## 0.1.0
* Setup the initial image
* Added the Xtensa toolchain
* Added the esptool + esptool-ck
# How to Contribute
The project follow the common [Github](https://guides.github.com/activities/contributing-to-open-source/#contributing)/[Gitlab contribution guidelines](http://doc.gitlab.com/ce/workflow/README.html).
FROM base/archlinux:latest
MAINTAINER Hermann Mayer <hermann.mayer92@gmail.com>
COPY . /app
RUN chmod 755 /app/bin/*
RUN /app/bin/install
This diff is collapsed.
MAKEFLAGS += --warn-undefined-variables
SHELL := bash
.SHELLFLAGS := -eu -o pipefail -c
.DEFAULT_GOAL := all
.DELETE_ON_ERROR:
.SUFFIXES:
.PHONY:
EXIT := exit
ECHO := echo
CAT := cat
SLEEP := sleep
TEST := test
GREP := grep
CLEAR := clear
FIND := find
SORT := sort
HEAD := head
REV := rev
CUT := cut
SED := sed
CP := cp
MKDIR := mkdir
TIME := time
CURL := curl
MAKE := make
PYTHON := python
DOCKER := docker
TMP_PATH ?= tmp
CONTAINER_REGISTRY ?=
CONTAINER_REGISTRY_API ?= registry.hub.docker.com
CONTAINER_NAME ?= jack12816/buildbox-teensy-lc
CONTAINER_URI := $(CONTAINER_REGISTRY)$(CONTAINER_NAME)
CONTAINER_URI_DEV := $(CONTAINER_URI):dev
NEXT_VERSION_FILE := $(TMP_PATH)/.version
NEXT_VERSION = $(shell $(TEST) -f $(NEXT_VERSION_FILE) \
&& $(CAT) $(NEXT_VERSION_FILE))
CUR_RELEASE = $(shell \
$(CURL) -k -s 'https://$(CONTAINER_REGISTRY_API)/v1/repositories/$(CONTAINER_NAME)/tags' \
| $(PYTHON) -m json.tool \
| $(GREP) '^\s*"' \
| $(SED) 's/[ "]*//g' \
| $(CUT) -d: -f1 \
| $(GREP) '^[0-9]\|^Resourcenotfound$$' \
| $(SORT) -V -r \
| $(HEAD) -n1 \
| $(SED) 's/^Resourcenotfound$$/0.0.0/g')
all:
# BuildBox ESP8266
#
# build Build a development snapshot of the image
# release Release the current development snapshot of the image
# publish Alias the current release as latest and push the new image
#
# shell You can start an individual session of the image for tests
# clean Clean the current development snapshot
build: clean
# Build the Docker image
@$(TIME) $(DOCKER) build \
-t "$(CONTAINER_URI_DEV)" .
release: .release-ask-next-version
# Tag the current development snapshot to the version $(NEXT_VERSION)
@$(DOCKER) tag "$(CONTAINER_URI_DEV)" "$(CONTAINER_URI):$(NEXT_VERSION)"
# Tag the new version as the latest
@$(DOCKER) tag "$(CONTAINER_URI):$(NEXT_VERSION)" "$(CONTAINER_URI):latest"
publish:
# Publish the new version on the registry
@$(DOCKER) push "$(CONTAINER_URI):$(NEXT_VERSION)"
# Update the `latest` tag on the registry
@$(DOCKER) push "$(CONTAINER_URI):latest"
# Finalize the current release process
@$(RM) -f $(NEXT_VERSION_FILE) || true
shell:
# Start an individual test session of the image
@$(MKDIR) -p share
# You can find the share mountpoint at /share
@$(DOCKER) run --rm -it \
-u `id -u` -v `pwd`/share:/share \
"$(CONTAINER_URI_DEV)" bash
clean:
ifneq (,$(NEXT_VERSION))
# Untag the unpublished version $(NEXT_VERSION)
@$(DOCKER) rmi --force "$(CONTAINER_URI):$(NEXT_VERSION)" || true
endif
# Untag the current `latest` tag
@$(DOCKER) rmi --force "$(CONTAINER_URI):latest" || true
# Clean the current development snapshot
@$(DOCKER) rmi --force "$(CONTAINER_URI_DEV)" || true
.release-ask-next-version:
@$(CLEAR)
@$(MKDIR) -p $(TMP_PATH)
@./tools/ask-next-version \
"$(CUR_RELEASE)" "$(NEXT_VERSION_FILE)" \
"Image: $(CONTAINER_URI)\n\n"
@$(CLEAR)
![BuildBox Teensy LC](docs/logo-project.png)
This is a Docker container for building C/C++ firmwares for the Teensy LC.
The Teensy LC (Cortex-M0+) processor is supported.
- [Quick Start](#quick-start)
- [Image Building](#image-building)
## Quickstart
To build a project with the ARM toolchain run the container like this:
```bash
$ docker run --rm -v `pwd`:/share -w /share \
jack12816/buildbox-teensy-lc make build
```
The command **make build** is just an example and must be replaced with
your own build command.
The ARM toolchain includes these binaries:
```arm-none-eabi-addr2line arm-none-eabi-c++ arm-none-eabi-dwp arm-none-eabi-gcc
arm-none-eabi-gcc-nm arm-none-eabi-gcov-tool arm-none-eabi-ld arm-none-eabi-nm
arm-none-eabi-ranlib arm-none-eabi-size arm-none-eabi-ar arm-none-eabi-c++filt
arm-none-eabi-elfedit arm-none-eabi-gcc-6.3.0 arm-none-eabi-gcc-ranlib
arm-none-eabi-gdb arm-none-eabi-ld.bfd arm-none-eabi-objcopy
arm-none-eabi-readelf arm-none-eabi-strings arm-none-eabi-as arm-none-eabi-cpp
arm-none-eabi-g++ arm-none-eabi-gcc-ar arm-none-eabi-gcov arm-none-eabi-gprof
arm-none-eabi-ld.gold arm-none-eabi-objdump arm-none-eabi-run
arm-none-eabi-strip```
## Image Building
Just clone this git repository and run `make`. It will show up a complete
documentation of all available commands. The default workflow is the following:
build -> release -> publish
If you expecting any issues while testing the newly built image after release
run `make clean` and start over. All commands are idempotent and can be
executed multiple times with the same result. (Just keep in mind that the
release process will always increase the version number)
#!/bin/bash
#
# @author Hermann Mayer <hermann.mayer92@gmail.com>
# Retry a passed command multiple times
#
# $1-n The command to process
function retry()
{
if eval "$@"; then
return 0
fi
for i in 2 1; do
sleep 3s
echo "Retrying $i..."
if eval "$@"; then
return 0
fi
done
return 1
}
# Suppress big outputs with dots, in case of error show
# the full output
#
# $1-n The command to run
function dots()
{
log=$(mktemp)
eval $@ 2>&1 | while read line; do
if [ -n "${line}" ]; then
echo -n '.'
echo "${line}" >> "${log}"
fi
done
EXITCODES=( "${PIPESTATUS[@]}" )
if [[ "${EXITCODES[*]/0/}" =~ [1-9] ]]; then
cat ${log}
echo -e "\nExit code: -${EXITCODES[0]}-"
return 1
fi
echo
rm ${log}
}
# Time a given command
#
# $1 The comment we should show about this timing
# $2-n The command we should run
function stop_time()
{
prefix=${1}
shift 1
start_date=`date +%s`
$@
local ret=$?
total=$(date -u --date @$((`date +%s` - $start_date)) +%kh:%Mm:%Ss)
echo -ne "\e[1;32m${prefix}:" \
"\e[1;35m${total}\e[0m\n"
return $ret
}
# Run a command as the application user
#
# $1-n The command to run
function run_as_user()
{
sudo -HEu builder -s $@
return $?
}
# Run a command with stop watch, dots outputs and retry.
#
# $1 The comment we should show about this timing
# $2-n The command we should run
function run()
{
comment=${1}
echo -n "${comment} "
shift 1
stop_time "${comment}" dots retry $@
}
# Run the package manager with some custom settings
#
# $@ All further commands to pacman
function run_pacman()
{
pacman \
--noconfirm \
$@
}
#!/bin/bash
set -e
# Get the full path of the current file, no matter where it being called from
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )";
cd "${DIR}/.."
# Load the env lib
source bin/env
HOME="/root"
INSTALL_DIR="/app"
export TERM="xterm-256color"
echo 'Setup yaourt package source'
cat >> /etc/pacman.conf <<EOF
[archlinuxfr]
SigLevel = Never
Server = http://repo.archlinux.fr/\$arch
EOF
run 'Update package repositories' \
run_pacman -Syy
run 'Update keyring' \
run_pacman -S archlinux-keyring
run 'Update pacman' \
run_pacman -S pacman
run 'Update pacman database' \
pacman-db-upgrade
run 'Install build packages' run_pacman -S \
yaourt sudo bash bash-completion base-devel python2 \
curl wget sudo rsync yaourt abs pkgfile \
gdb gperf unzip git \
arm-none-eabi-binutils arm-none-eabi-gcc arm-none-eabi-gdb \
arm-none-eabi-newlib
echo 'Create builder user'
groupadd -g1000 builder
useradd -u1000 -g1000 --system --home-dir /home/builder -m builder
echo 'Enable password-less sudoing for builder user'
cat >> /etc/sudoers <<EOF
builder ALL = NOPASSWD: ALL
EOF
echo 'Setup profile files for root'
cp "${INSTALL_DIR}/config/.bash_profile" /root/.bash_profile
cp "${INSTALL_DIR}/config/.bashrc" /root/.bashrc
chmod +x /root/.bashrc /root/.bash_profile
echo 'Setup profile files for builder ...'
cp "${INSTALL_DIR}/config/.bash_profile" /home/builder/.bash_profile
cp "${INSTALL_DIR}/config/.bashrc" /home/builder/.bashrc
chmod +x /home/builder/.bashrc /home/builder/.bash_profile
echo 'Setup temporary directory'
mkdir -p /tmp && chmod ugo+rwx /tmp
run 'Install teensy-loader-cli' \
run_as_user yaourt --noconfirm -S teensy-loader-cli
run 'Cleanup packages caches' \
rm -rf /var/cache/pacman/pkg
#
# ~/.bash_profile
#
[[ -f ~/.bashrc ]] && . ~/.bashrc
#!/bin/bash
#
# @author Hermann Mayer <hermann.mayer92@gmail.com>
# @name .bashrc
# +-------------------------------------------------
# | UTF8 Stuff
# +-------------------------------------------------
if test -t 1 -a -t 2 ; then
echo -n -e '\033%G'
fi
# +-------------------------------------------------
# | Non-Interactive Shell
# +-------------------------------------------------
if [[ $- != *i* ]] ; then
# Shell is non-interactive. Be done now!
return
fi
# +-------------------------------------------------
# | Exports
# +-------------------------------------------------
# Misc defaults
export HISTCONTROL="ignoreboth:erasedups"
export HISTSIZE=1000000
export PROMPT_DIRTRIM=0
export USER_NAME=$(whoami)
export COLUMNS=$(tput cols)
# Enable less mouse scrolling
export LESS=-r
# Default Editor
export EDITOR=vim
# Color programs output
export COLOR_OPTIONS='--color=auto'
# Color 'man' output
export LESS_TERMCAP_mb=$'\E[01;31m'
export LESS_TERMCAP_md=$'\E[01;31m'
export LESS_TERMCAP_me=$'\E[0m'
export LESS_TERMCAP_se=$'\E[0m'
export LESS_TERMCAP_so=$'\E[01;44;33m'
export LESS_TERMCAP_ue=$'\E[0m'
export LESS_TERMCAP_us=$'\E[01;32m'
LS_COLORS='no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:su=37;41:sg=30;43:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.svgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01; 35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:'
export LS_COLORS
# +-------------------------------------------------
# | Autoloading Stuff
# +-------------------------------------------------
# Really usefull, load bash auto completion
if [ -f /etc/profile.d/bash_completion.sh ]; then
source /etc/profile.d/bash_completion.sh
fi
if [ -f /usr/share/bash-completion/bash_completion ]; then
source /usr/share/bash-completion/bash_completion
fi
if [ -d "${BASHRC_CONFIG}/completions" ]; then
for file in $(find "${BASHRC_CONFIG}/completions/" -type f) ; do
source "${file}"
done
fi
# +-------------------------------------------------
# | Terminal Settings
# +-------------------------------------------------
if [ "$TERM" != 'linux' ]; then
# Set the default 256 color TERM
export TERM=xterm-256color
fi
# +-------------------------------------------------
# | Bash Settings
# +-------------------------------------------------
# Bash won't get SIGWINCH if another process is in the foreground.
# Enable checkwinsize so that bash will check the terminal size when
# it regains control. #65623
# http://cnswww.cns.cwru.edu/~chet/bash/FAQ (E11)
shopt -s checkwinsize
# Enable history appending instead of overwriting. #139609
shopt -s histappend
# Enable extended globbing
shopt -s extglob
# Enable globbing for dotfiles
shopt -s dotglob
# Enable globstars for recursive globbing
shopt -s globstar
# Auto "cd" when entering just a path
shopt -s autocd
# +-------------------------------------------------
# | Binding Bash Events
# +-------------------------------------------------
# Rebind enter key to insert newline before command output
trap 'echo' DEBUG
# +-------------------------------------------------
# | Usefull Keybindings
# +-------------------------------------------------
bind "set completion-ignore-case on" # note: bind used instead of sticking these in .inputrc
bind "set bell-style none" # no bell
bind "set show-all-if-ambiguous On" # show list automatically, without double tab
# use ctl keys to move forward and back in words
bind '"\e[1;5C": forward-word'
bind '"\e[1;5D": backward-word'
bind '"\e[5C": forward-word'
bind '"\e[5D": backward-word'
bind '"\e\e[C": forward-word'
bind '"\e\e[D": backward-word'
# use arrow keys to fast search
bind '"\e[A": history-search-backward'
bind '"\e[B": history-search-forward'
# +-------------------------------------------------
# | Usefull Aliases
# +-------------------------------------------------
alias ..="cd .."
alias ...="cd ../.."
alias ....="cd ../../.."
alias .....="cd ../../../.."
alias folders='find . -maxdepth 1 -type d -print0 | xargs -0 du -hs | sort -rn'
alias c='clear'
alias h='htop'
alias f='free -m'
alias ls='ls $COLOR_OPTIONS --group-directories-first --time-style="+%F, %T "'
alias ll='ls $COLOR_OPTIONS -lh'
alias la='ls $COLOR_OPTIONS -lAh'
alias l='ls $COLOR_OPTIONS -lAh'
alias grep='grep $COLOR_OPTIONS'
alias egrep='egrep $COLOR_OPTIONS'
alias g='git'
alias p='pwd'
alias mkdir='mkdir -p -v'
alias openports='netstat --all --numeric --programs --inet --inet6 | tail -n +3 | rev | sort -k 1,1 | rev'
alias less='less -R'
alias x='exit'
complete -W "$(cat "${HOME}/.bash_history" | egrep '^ssh |^scp ' | grep '\.' | egrep '^[^0-9]' | sort | uniq | sed 's/^ssh //' | sed 's/ $//g' | sed 's/^/\"/' | sed 's/$/\"/');" ssh
complete -W "$(cat "${HOME}/.bash_history" | egrep '^ssh |^scp ' | grep '\.' | egrep '^[^0-9]' | sort | uniq | sed 's/^ssh //' | sed 's/ $//g' | sed 's/^/\"/' | sed 's/$/\"/');" scp
# +-------------------------------------------------
# | Style Commandline Prompt
# +-------------------------------------------------
# Set colorful PS1 only on colorful terminals.
# dircolors --print-database uses its own built-in database
# instead of using /etc/DIR_COLORS. Try to use the external file
# first to take advantage of user additions. Use internal bash
# globbing instead of external grep binary.
safe_term=${TERM//[^[:alnum:]]/?} # sanitize TERM
match_lhs=""
[[ -f ~/.dir_colors ]] && match_lhs="${match_lhs}$(<~/.dir_colors)"
[[ -f /etc/DIR_COLORS ]] && match_lhs="${match_lhs}$(</etc/DIR_COLORS)"
[[ -z ${match_lhs} ]] \
&& type -P dircolors >/dev/null \
&& match_lhs=$(dircolors --print-database)
[[ $'\n'${match_lhs} == *$'\n'"TERM "${safe_term}* ]] && use_color=true
if ${use_color} ; then
# Enable colors for ls, etc. Prefer ~/.dir_colors #64489
if type -P dircolors >/dev/null ; then
if [[ -f ~/.dir_colors ]] ; then
eval $(dircolors -b ~/.dir_colors)
elif [[ -f /etc/DIR_COLORS ]] ; then
eval $(dircolors -b /etc/DIR_COLORS)
fi
fi
PROMPT_COMMAND='RET=$?;'
RET_OUT='$(if [[ $RET = 0 ]]; then echo -ne "\[$txtgrn\][G]"; else echo -ne "\[$txtred\][Err: $RET]"; fi;)'
RET_OUT="\n$RET_OUT"
PSL1A=' \[\e[0;31m\][\[\e[1;37m\]\[\e[0;36m\]\w\[\e[0;31m\]]'
PSL1=${RET_OUT}${PSL1A}
PSL2='\n\[\e[0;31m\][\u\[\e[0;33m\]@\[\e[0;37m\]\h\[\e[0;31m\]] \[\e[0;31m\]$ \[\e[0;32m\]'
PS1=${PSL1}${PSL2}
else
if [[ ${EUID} == 0 ]] ; then
# show root@ when we do not have colors
PS1='\u@\h \W \$ '
else
PS1='\u@\h \w \$ '
fi
fi
# Try to keep environment pollution down, EPA loves us.
unset use_color safe_term match_lhs
# +-------------------------------------------------
# | Commons Helper
# +-------------------------------------------------
function psgrep()
{
ps ax -o pid,ruser,command | egrep -i --color=always "$1" | grep -v "grep"
}
function mkcd()
{
mkdir -p "$1"
cd "$1"
}
# +-------------------------------------------------
# | Find Helper
# +-------------------------------------------------
# ff: to find a file under the current directory
function ff()
{
/usr/bin/find . -name '*'"$@"'*' | grep -i "$@"
}
# ffs: to find a file whose name starts with a given string
function ffs()
{
/usr/bin/find . -name "$@"'*'
}
# ffe: to find a file whose name ends with a given string
function ffe()
{
/usr/bin/find . -name '*'"$@"
}
function findPid()
{
lsof -t -c "$@"
}
function findTopLevelParentPid()
{
pid=${1:-$$}
stat=($(</proc/${pid}/stat))
ppid=${stat[3]}
if [[ ${ppid} -eq 1 ]] ; then
echo ${pid}
else
findTopLevelParentPid ${ppid}
fi
}
function finder()
{
if [ "${1}" = "-svn" ]; then
shift
find . -type f ! -path "*svn*" -exec grep -n -H --colour=auto -i "${@}" {} \;
return
fi
find . -type f -exec grep -n -H --colour=auto -i "${@}" {} \;
}
clear
cd /share
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="331.42999"
height="331.42999"
id="svg2"
version="1.1"
inkscape:version="0.48.4 r9939"
sodipodi:docname="logo.svg"
inkscape:export-filename="/home/hmayer/Projects/Config/buildbox/logo.png"
inkscape:export-xdpi="300"
inkscape:export-ydpi="300">
<defs
id="defs4" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.7"
inkscape:cx="-34.184299"
inkscape:cy="116.62519"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
fit-margin-top="20"
fit-margin-left="20"
fit-margin-right="20"
fit-margin-bottom="20"
inkscape:window-width="1920"
inkscape:window-height="1025"
inkscape:window-x="-2"
inkscape:window-y="32"
inkscape:window-maximized="1" />
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Ebene 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-185.71429,-127.36154)">
<g
id="g2989"
transform="translate(29.643563,-3.0003212)">
<text
sodipodi:linespacing="125%"
id="text2985"
y="343.79074"
x="205.71429"
style="font-size:250px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:FontAwesome;-inkscape-font-specification:FontAwesome"
xml:space="preserve"><tspan
y="343.79074"
x="205.71429"
id="tspan2987"
sodipodi:role="line"></tspan></text>
<g
transform="translate(197.08127,-113.198)"
id="g3765">
<text
sodipodi:linespacing="125%"
id="text3761"
y="531.12347"
x="54.548233"
style="font-size:144px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#ffffff;stroke-width:15;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;font-family:FontAwesome;-inkscape-font-specification:FontAwesome"
xml:space="preserve"><tspan
y="531.12347"
x="54.548233"
id="tspan3763"
sodipodi:role="line"></tspan></text>
<text
xml:space="preserve"
style="font-size:144px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:FontAwesome;-inkscape-font-specification:FontAwesome"
x="54.548233"
y="531.12347"
id="text2989"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan2991"
x="54.548233"
y="531.12347"></tspan></text>
</g>
</g>
</g>
</svg>