Commit baa42207 authored by thomas.forbriger's avatar thomas.forbriger Committed by thomas.forbriger
Browse files

added texts created by Daniel

This is a legacy commit from before 2015-03-01.
It may be incomplete as well as inconsistent.
See COPYING.legacy and README.history for details.


SVN Path:     http://gpitrsvn.gpi.uni-karlsruhe.de/repos/TFSoftware/branches/any2matlab0.1
SVN Revision: 3104
SVN UUID:     67feda4a-a26e-11df-9d6e-31afc202ad0c
parent b4c323cb
This is a legacy version of the repository. It may be incomplete as well as
inconsistent. See README.history for details. For the old stock of the
repository copyright and licence conditions apply as specified for versions
commited after 2015-03-01. Use recent versions as a base for new development.
The legacy version is only stored to keep a record of history.
This is a legacy version of the repository. It may be incomplete as well as
inconsistent. See README.history for details. For the old stock of the
repository copyright and licence conditions apply as specified for versions
commited after 2015-03-01. Use recent versions as a base for new development.
The legacy version is only stored to keep a record of history.
Doku des Installationsvorgangs für any2matlab.cc
Daniel Armbruster - dani.armbruster@gmx.de
16/07/2010
#########################################
# I ) Änderungen am Quellcode
#########################################
1. in Makefiles der libtime und libtfxx
FLAGS=$(MYFLAGS)
in
FLAGS=
FLAGS+=$(MYFLAGS)
ändern -> alle Makefiles können mit FLAGS aufgerufen werden
In den Makefiles, in denen noch nicht die Zeile
FLAGS+=$(MYFLAGS)
vorhanden war -> Zeile hinzugefügt (Konsistenz)
+++++++++++++++++++++++++++++++++++++++
2. in Makefile datreadxx
CXXFLAGS=-Wall $(FLAGS)
gelöscht - war doppelt
in Makefile libaff
CXXFLAGS=-Wall $(FLAGS) -O3
gelöscht - war doppelt
in Makefile libgsexx
CXXFLAGS=-Wall $(FLAGS)
gelöscht - war doppelt
in Makefile libsffxx
CXXFLAGS=-Wall $(FLAGS)
gelöscht - war doppelt
in Makefile libtfxx
CXXFLAGS=$(FLAGS)
gelöscht - war doppelt
---------------------------------------
in allen Makefiles, in denen die CXXFLAG
-fhonor-std
gesetzt war, wurde die Flag entfernt
-> wird von ab gcc/g++ Version 3.1.1 nicht mehr länger untersützt
siehe Link: http://gcc.gnu.org/gcc-3.1/changes.html
+++++++++++++++++++++++++++++++++++++++
3. in libaff/dump.cc Zeile 145 Semikolon entfernt - Compiler hat sich beschwert
-> namespace wird nur mit geschweiften Klammern abgeschlossen
+++++++++++++++++++++++++++++++++++++++
4. in Makefile libdatreadxx
Änderung der Variablen
LIBSRC=datread.cc bonjer/bonjer.cc bonjer/readbonjer.cc readany.cc error.cc \
pdas/pdas.cc pdas/pdasread.cc mseed/seedstructdump.cc \
sff/sff.cc mseed/mseedread.cc mseed/mseed.cc mseed/seedstructs.cc \
hpmo/hpmo.cc hpmo/readhpmo.cc hpmo/hpmodata.cc \
util.cc sac/sac.cc sac/sacread.cc bytesex.cc gse/gseread.cc gse/gse.cc \
tracereader.cc \
tsoft/tsoftdata.cc tsoft/tsoftreader.cc \
tsoft/tsoft.cc tsoft/tsoftsffcontainer.cc tsoft/channeltranslation.cc
entfernt, jetzt:
TESTSRC nicht mehr mitkompiliert. -> libtfxx wird nicht mehr von libdatreadxx benötigt!!! Nur noch
von den files in libdatreadxx/tests/*
Außerdem die Variablen LIBSRC und LIBHEADER bzw. TESTSRC TESTHEADER ein wenig schicker zugewießen.
+++++++++++++++++++++++++++++++++++++++
5. libsffxx von libtfxx unabhängig machen
---------------------------------------
a)
in sffxx.h Header <tfxx/commandline.h> auskommentiert
-> wurde gar nicht benötigt
in sffxx.cc Header #include <stdlib.h> hinzugefügt
-> für atof() und atoi() benötigt
=> Kompilierung erfolgreich
b)
in wid2compare.cc den Header <tfxx/error.h> entfernt
-> wurde gar nicht benötigt
---------------------------------------
Kompilierung von libsffxx nun ohne libtfxx möglich
+++++++++++++++++++++++++++++++++++++++
6. in libdatreadxx/hpmo/readhpmo.cc
atoi() was not declared in this scope
-> Header <stdlib.h> hinzugefügt
-> gefixt
+++++++++++++++++++++++++++++++++++++++
7. in libtime
cast von integer nach int in Cwrapper/ctime_sprint.c:50: und Cwrapper/ctime_sprint.c:55:
in REVISION dekimentiert
-> keine warning des Compilers mehr
+++++++++++++++++++++++++++++++++++++++
8. in sffxx.cc static_cast<int>()
siehe REVISION
-> keine warning des Compilers mehr
+++++++++++++++++++++++++++++++++++++++
#########################################
# II) ToDo
#########################################
1. Bei der Kompilierung
make datreadxx.a FLAGS=-fPIC
folgende warnings:
g++ -Wall -fPIC -I/home/daniel/prog/datread/include -fPIC -c -o bonjer/bonjer.o bonjer/bonjer.cc
In file included from bonjer/bonjer.cc:40:
/home/daniel/prog/datread/include/datreadxx/bonjer.h: In static member function ‘static void datread::ibonjerstream::help(std::ostream&)’:
/home/daniel/prog/datread/include/datreadxx/bonjer.h:66: warning: deprecated conversion from string constant to ‘char*’
g++ -Wall -fPIC -I/home/daniel/prog/datread/include -fPIC -c -o readany.o readany.cc
In file included from readany.cc:47:
/home/daniel/prog/datread/include/datreadxx/sff.h: In static member function ‘static void datread::isffstream::help(std::ostream&)’:
/home/daniel/prog/datread/include/datreadxx/sff.h:68: warning: deprecated conversion from string constant to ‘char*’
In file included from readany.cc:49:
/home/daniel/prog/datread/include/datreadxx/hpmo.h: In static member function ‘static void datread::ihpmostream::help(std::ostream&)’:
/home/daniel/prog/datread/include/datreadxx/hpmo.h:64: warning: deprecated conversion from string constant to ‘char*’
In file included from readany.cc:51:
/home/daniel/prog/datread/include/datreadxx/bonjer.h: In static member function ‘static void datread::ibonjerstream::help(std::ostream&)’:
/home/daniel/prog/datread/include/datreadxx/bonjer.h:66: warning: deprecated conversion from string constant to ‘char*’
g++ -Wall -fPIC -I/home/daniel/prog/datread/include -fPIC -c -o sff/sff.o sff/sff.cc
In file included from sff/sff.cc:48:
/home/daniel/prog/datread/include/datreadxx/sff.h: In static member function ‘static void datread::isffstream::help(std::ostream&)’:
/home/daniel/prog/datread/include/datreadxx/sff.h:68: warning: deprecated conversion from string constant to ‘char*’
g++ -Wall -fPIC -I/home/daniel/prog/datread/include -fPIC -c -o hpmo/hpmo.o hpmo/hpmo.cc
In file included from hpmo/hpmo.cc:42:
/home/daniel/prog/datread/include/datreadxx/hpmo.h: In static member function ‘static void datread::ihpmostream::help(std::ostream&)’:
/home/daniel/prog/datread/include/datreadxx/hpmo.h:64: warning: deprecated conversion from string constant to ‘char*’
-> ein simpler cast hilft da vielleicht schon
---------------------------------------
This is a legacy version of the repository. It may be incomplete as well as
inconsistent. See README.history for details. For the old stock of the
repository copyright and licence conditions apply as specified for versions
commited after 2015-03-01. Use recent versions as a base for new development.
The legacy version is only stored to keep a record of history.
# this is <Makefile>
# ----------------------------------------------------------------------------
# Copyright (c) 2010 by Daniel Armbruster
# ----
# 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 2 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, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
# ----
# Daniel Armbruster 2010/06/25
#
# REVISIONS and CHANGES
# 25/06/2010 V1.0 Daniel Armbruster
#
###########################################
# Your settings.
############################################
MAIN = installDoc
IMGDIR = ./pics/
PDFIMAGES =
EPSIMAGES =
TABLEDIR = ./tab/
TABLES =
###############################################
# You don't need to change anything below here
###############################################
#Variablendefinition
LATEX = /usr/bin/latex
PDFLATEX = /usr/bin/pdflatex
ZIP = /usr/bin/zip -r
PS2PDF = /usr/bin/ps2pdf
DVIPS = /usr/bin/dvips
DVIPSOPTS =
CONVERT = /usr/bin/convert
TAR = tar -zcf
ECHO = echo
LATEXFLAGS = -interaction=nonstopmode
BIBTEX = bibtex
FEATURES = index abbr bib
DEL = rm -rf
TEXFILES = $(wildcard *.tex)
PICS = $(wildcard $(IMGDIR)/*)
###############################################
#**********************************************
.SUFFIXES:
.SUFFIXES: .pdf .tex .ps .dvi .png .gif .bmp .jpg .eps .fig .csv
# latex viermal wegen Referenzen laufen lassen
.tex.pdf:
$(PDFLATEX) $(LATEXFLAGS) $<
$(PDFLATEX) $(LATEXFLAGS) $<
$(PDFLATEX) $(LATEXFLAGS) $<
.tex.dvi:
$(LATEX) $(LATEXFLAGS) $<
$(LATEX) $(LATEXFLAGS) $<
$(LATEX) $(LATEXFLAGS) $<
.dvi.ps:
$(DVIPS) $(DVIPSOPTS) $<
.fig.eps:
fig2dev -L eps $< $@
.gif.png:
$(CONVERT) $< $@
.bmp.png:
$(CONVERT) $< $@
.jpg.png:
$(CONVERT) $< $@
.gif.eps:
$(CONVERT) $< $@
.bmp.eps:
$(CONVERT) $< $@
.jpg.eps:
$(CONVERT) $< $@
.png.eps:
$(CONVERT) $< $@
.eps.pdf:
epstopdf $<
.ps.pdf:
ps2pdf $< $@
.eps.png:
$(CONVERT) $< $@
.fig.pdf:
fig2dev -L eps $< $@.eps
epstopdf $@.eps -o=$@
rm $@.eps
.csv.tex:
cat $< | sed "s/;/\t\&\t/g"|sed 's/$$/\t\\\\/g'|sed 's/\"//g' > $@
default: ps
all: pdf ps dvi
#-------------------------
# pdflatex, latex
pdf:
rm -f $(MAIN).pdf
make $(MAIN).pdf
pdfimages:
cd $(IMGDIR); make -f ../[mM]akefile $(PDFIMAGES)
ps: epsimages
rm -f $(MAIN).ps
make $(MAIN).ps
ps2pdf $(MAIN).ps
dvi: epsimages
make $(MAIN).dvi
epsimages:
cd $(IMGDIR); make -f ../[mM]akefile $(EPSIMAGES)
#------------------------
# literatur-, index-, abkuerzungsverzeichnis
index: $(MAIN).ind $(MAIN).ilg
abbr: $(MAIN).nls
bib: $(MAIN).blg $(MAIN).bbl
# Vorbereitung
$(MAIN).idx $(MAIN).nlo $(MAIN).aux: $(MAIN).tex
$(LATEX) $(LATEXFLAGS) $(MAIN).tex
# Index/Stichwortverzeichnis (Regel index)
$(MAIN).ind $(MAIN).ilg: $(MAIN).tex $(MAIN).idx
$(MAKEINDEX) $(MAIN).idx
# Abkuerzungsverzeichnis (Regel abbr)
$(MAIN).nls: $(MAIN).tex $(MAIN).nlo
$(MAKEINDEX) $(MAIN).nlo -s nomencl.ist -o $(MAIN).nls
# Literaturverzeichnis (Regel bib)
$(MAIN).blg $(MAIN).bbl: $(MAIN).tex $(MAIN).bib $(MAIN).aux
$(BIBTEX) $(MAIN)
#--------------------------
# archiv
ARCHIVFILES = $(TEXFILES) $(PICS)
ARCHIVFILES += [mM]akefile
tararchiv: $(MAIN).tar.gz
$(MAIN).tar.gz: $(ARCHIVFILES)
$(TAR) $(MAIN).tar.gz $(ARCHIVFILES)
ziparchiv: $(MAIN).zip
$(MAIN).zip: $(ARCHIVFILES)
$(ZIP) $(MAIN).zip $(ARCHIVFILES)
#-------------------------
# show
pdfshow: pdf
@xpdf $(MAIN).pdf &
acroshow: pdf
@acroread $(MAIN).pdf &
psshow: ps
@evince $(MAIN).ps &
#------------------------
# table
table:
cd $(TABLEDIR); make -f ../[mM]akefile $(TABLES)
#------------------------
#clean
# Temporaere Dateien loeschen
clean: cleantemp
cleantemp:
$(DEL) $(MAIN).aux $(MAIN).bbl $(MAIN).bit $(MAIN).blg $(MAIN).dvi $(MAIN).glo\
$(MAIN).idx $(MAIN).ilg $(MAIN).ilg $(MAIN).ind $(MAIN).lof $(MAIN).log $(MAIN).lot\
$(MAIN).nlo $(MAIN).nls $(MAIN).out $(MAIN).toc $(MAIN).snm $(MAIN).nav
# Aux-Dateien loeschen (auch von anderen Dateien)
cleanaux:
$(DEL) *.aux
cleanlatex:
rm -f $(MAIN).toc $(MAIN).out $(MAIN).aux
cleanbackup:
@rm -f *~ *.bak
cleanall: cleanbackup cleantemp
#-------------------------
# help
help:
@$(ECHO) "************************************************************"
@$(ECHO) " LATEX-makefile"
@$(ECHO) "author: Daniel Armbruster"
@$(ECHO) "email: dani.armbruster@gmx.de"
@$(ECHO) "created: 12.12.09"
@$(ECHO) "modified: 17.12.09"
@$(ECHO) "************************************************************"
@$(ECHO) "------------------------------------------------------------"
@$(ECHO) "Hilfe - fuer LATEX-makefile"
@$(ECHO) "------------------------------------------------------------"
@$(ECHO) "pdf: Erstellen eines PDF-Dokumentes"
@$(ECHO) "tararchiv: Erstellen eines *.tar-Archivs"
@$(ECHO) "ziparchiv: Erstellen eines *.zip-Archivs"
@$(ECHO) "pdfshow: Anzeigen des PDF-Dokumentes mit xpdf"
@$(ECHO) "acroshow: Anzeigen des PDF-Dokumentes mit acroread"
@$(ECHO) "psshow: Anzeigen des PS-Dokumentes mit evince"
@$(ECHO) "table: Konverter fuer Tabellen -> *.csv nach *.tex"
@$(ECHO) "cleanbackup: Löschen der Backup-Dateien"
@$(ECHO) "cleantemp: Löschen der temporären Dateien"
@$(ECHO) "cleanaux: Löschen aller *.aux Dateien im Verzeichnis"
@$(ECHO) "cleanall: Ausführen von cleantemp und cleanbackup"
@$(ECHO) "help: Hilfe"
@$(ECHO)
@$(ECHO) "------------------------------------------------------------"
@$(ECHO) "Info:"
@$(ECHO) "------------------------------------------------------------"
@$(ECHO) "Hauptdatei: $(MAIN).tex"
@$(ECHO) "zuletzt verwendete Bilder: $(PDFIMAGES)"
@$(ECHO) "zuletzt konvertierte Tabellen: $(TABLES)"
@$(ECHO)
@$(ECHO) "------------------------------------------------------------"
@$(ECHO) "Bemerkungen:"
@$(ECHO) "------------------------------------------------------------"
@$(ECHO) "1. Bilder-Dateiname ohne Endung in *.tex-file angeben."
@$(ECHO) "2. Die Bilder-Dateien im gewünschten Format in die makefile"
@$(ECHO) " eintragen."
@$(ECHO) "3. Die Tabellen muessen als Feldtrenner ein ';'-Zeichen und"
@$(ECHO) " und als Texttrenner ein '\"'-Zeichen haben."
@$(ECHO)
# ----- END OF Makefile -----
\documentclass[10pt, a4paper, titlepage=false, twocolumn]{scrartcl}
% Schriftsatz
\usepackage[T1]{fontenc}
\usepackage[latin9]{inputenc}
% Deutsch
\usepackage[ngerman]{babel}
% Schrift im Vektorformat
\usepackage{ae}
% farbige Schrift
\usepackage{color}
% Mathesymbole
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{txfonts}
% Boxen um Formeln
\usepackage{empheq}
% Links
\usepackage{hyperref}
% Quelltext
\usepackage{listings}
% Geometrie / Rand
\usepackage[right=2cm,left=2cm,top=2cm,bottom=2cm]{geometry}
% Formatieren von Tabellen und Arrays
\usepackage{array}
% Gleitobjekte aus Bildern und Tabellen
\usepackage{float}
\usepackage{lscape}
%Tabellen
\usepackage{tabularx}
% Bilder
\usepackage{graphicx}
\usepackage{subfigure}
% Textumfluss um Bilder
\usepackage{wrapfig}
% Literaturverzeichnis Style
\usepackage[authoryear]{natbib}
% Kopfzeile und Fusszeile
\usepackage{scrpage2}
\pagestyle{scrheadings}
\clearscrheadings
\clearscrplain
\clearscrheadfoot
\ohead[]{\pagemark}
\ihead[]{\rightmark}
\ofoot {Daniel Armbruster - \texttt{dani.armbruster@gmx.de}}
\manualmark
\automark[section]{subsection}
\setheadsepline{0.5pt}
%\setfootsepline{0.5pt}
\renewcommand{\floatpagefraction}{1}
\sloppy
\frenchspacing
\linespread{1.1}
%\setlength{\textheight}{240.5mm}
% Formatierung der Nummerierung von Tabellen, Bildern und Formeln
\usepackage[format=plain,font=footnotesize]{caption}
\makeatletter
% Formel
\renewcommand\theequation{\arabic{section}.\arabic{equation}}
% Rruecksetzen zu Beginn jedes Kapitels
\@addtoreset{equation}{section}
% Tabelle
\renewcommand\thetable{\arabic{section}.\arabic{table}}
% Rruecksetzen zu Beginn jedes Kapitels
\@addtoreset{table}{section}
% Bilder
\renewcommand\thefigure{\arabic{section}.\arabic{figure}}
% Rruecksetzen zu Beginn jedes Kapitels
\@addtoreset{figure}{section}
\makeatother
% Bilderkonvertierung fuer makefile
\newif\ifpdf
\ifx\pdfoutput\undefined
\pdffalse % we are not running pdflatex
\DeclareGraphicsExtensions{.eps,.ps}
\else
\pdfoutput=1 % we are running pdflatex
\pdfcompresslevel=9 % compression level for text and image;
\pdftrue
\DeclareGraphicsExtensions{.pdf,.png,.jpg}
\fi
% Abstand Absatz
\setlength{\parskip}{\medskipamount}
\setlength{\headheight}{1.05\baselineskip}
% Einruecktiefe nach Absatz
\setlength{\parindent}{0mm}
% Spaltenabstand bei \twocolumn
\setlength{\columnsep}{20pt}
\input{defines}
% Dokument beginnt
\begin{document}
% Dokumententitle
\title{\flushleft{\Large{Documentation \texttt{any2matlab.cc}}\vspace{-0.5cm}
\rule{\textwidth}{.4pt}}}
\author{\large{Daniel Armbruster - dani.armbruster@gmx.de}}
\date{\large{\today}}
\maketitle
%\clearpage
This manual describes how to install Thomas Forbriger's C++-libraries to get run
\texttt{any2matlab.cc}. \texttt{any2matlab.cc} allows you to import seismic data files with matlab
by using Thomas Forbriger's C++-libraries.
\section{Installation}
The only file you need to install \texttt{any2matlab.cc} local on your machine is
\texttt{any2matlabYYYYMMDD.tar.bz2}. \texttt{YYYYMMDD} is representive for the version date of the
file. At first you have to create a directory where you want to install the libraries and the
\emph{MATLAB} \texttt{MEX}-file. By way of example in the documentation we create an directory
called \texttt{datread} in your \texttt{\$HOME}-directory with the command:
\smallskip
\texttt{mkdir -pv $\sim$/datread}
\smallskip
Now extract \texttt{any2matlabYYYYMMDD.tar.bz2} to \texttt{$\sim$/datread} typing
\smallskip
\texttt{tar -xvjf any2matlabYYYYMMDD.tar.bz2 -C $\sim$/datread}
\smallskip
And cruise to \texttt{$\sim$/datread} with
\smallskip
\texttt{cd $\sim$/datread}
\bigskip
Before you are able to compile the whole stuff just start \emph{MATLAB} and type
\smallskip
\texttt{mex -setup}
\smallskip
into the \emph{MATLAB} prompt. There will appear a list containing your compilers installed on your
machine. Choose the \texttt{gcc} compiler by entering the concerning number.
\smallskip
You have to check your \texttt{gcc} and \texttt{g++} compiler versions before you start, too.
Typing into the commandline prompt
\smallskip
\texttt{gcc -$\,$-version}\\
\texttt{g++ -$\,$-version}
\smallskip
will give you the version numbers of your currently used compilers. To be safe from any exceptions
of \emph{MATLAB} the compiler version should be less than or equal to the compiler version which is
supported by \emph{MATLAB}. For example supports \emph{MATLAB 2010b} the \texttt{gcc} and
\texttt{g++} up to version 4.3. If you will build the programs with e.g. \texttt{g++-4.4} a similar
exception like
\smallskip
\texttt{../glnx86/libstdc++.so.6: version 'GLIBCXX\_3.4.11' not found}
\smallskip
can occur. You get the supported and compatible compilers for your \emph{MATLAB} release for
the current release under \url{http://www.mathworks.com/support/compilers/R2010a/index.html} and for
previous releases under \url{http://www.mathworks.com/support/compilers/previous\_releases.html}.
\medskip
Check if the \href{http://www.gnu.org/software/gsl/}{GSL - GNU Scientific Library} is installed on
your operating system. If not, you have to install it.
\medskip
If your compiler version satisfies the terms and conditions and the GSL is available you are able to
install the libraries and \texttt{any2matlab.cc}. Executing
\smallskip
\texttt{. settings.sh `pwd`}
\smallskip
in the commandline prompt sets the global pathes and the variables. Note the back quotes around
\texttt{pwd} and the dot at the beginning of the command. Be aware that you have to be located in our
example directory \texttt{$\sim$/datread}.\\
You must execute the following command in the same commandline prompt. Entering
\smallskip
\texttt{make install}
\smallskip
will install the libraries and \texttt{any2matlab.cc}. The binary file of \texttt{any2matlab.cc} is
located in the \texttt{$\sim$/datread/bin} directory. If you enter
\smallskip
\texttt{make help}
\smallskip
a short help will be displayed.
\bigskip
If you want to test the program just open \emph{MATLAB} and use the testfile
\texttt{$\sim$/datread/src/mex*/tesiff.sff}. Typing
\smallskip
\texttt{any2matlab('tesiff.sff')}
\smallskip
will return you an \texttt{1x8} struct array with the data.
\section{Usage}
\texttt{$\,$\qquad tfstruct = any2matlab('fname.ftype');\\
or: tfstruct = any2matlab('fname', 'ftype');\\
or: tfstruct = any2matlab('ftype', 'fname');}
\begin{itemize}
\item \texttt{fname} is the filename of the datafile. A '.' (dot) seperates \texttt{fname} from
\texttt{ftype} e.g. \texttt{data.sff}
\item \texttt{fname} is the filename of the datafile in an arbitrary form. \texttt{ftype} is one of the options below.
\item Same as the previous one, with different order.
\item If you use the second or third alernative to call the function \texttt{fname} must contain at
least one '.' (dot).
\item \texttt{ftype} is one of the following filetypes:
\begin{itemize}
\item \texttt{pdas}
\item \texttt{sff}